commit ec7af1413d0e50e9b5d925887fc02e358d3fa7a1 Author: expressgy Date: Wed Jun 19 17:48:43 2024 +0800 整合初始化 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..52962c2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,58 @@ +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + +# 0x +profile-* + +# mac files +.DS_Store + +# vim swap files +*.swp + +# webstorm +.idea + +# vscode +.vscode +*code-workspace + +# clinic +profile* +*clinic* +*flamegraph* diff --git a/01===sys22/.gitignore b/01===sys22/.gitignore new file mode 100644 index 0000000..f63c99a --- /dev/null +++ b/01===sys22/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist.* +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/01===sys22/README.md b/01===sys22/README.md new file mode 100644 index 0000000..28c88f0 Binary files /dev/null and b/01===sys22/README.md differ diff --git a/01===sys22/baseSys/baseSys.dirname b/01===sys22/baseSys/baseSys.dirname new file mode 100644 index 0000000..e69de29 diff --git a/01===sys22/baseSys/userSys/README.md b/01===sys22/baseSys/userSys/README.md new file mode 100644 index 0000000..a29dbcc --- /dev/null +++ b/01===sys22/baseSys/userSys/README.md @@ -0,0 +1,3 @@ +# userSys + +用户系统 \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/design/database/sys22_user.ndm2 b/01===sys22/baseSys/userSys/design/database/sys22_user.ndm2 new file mode 100644 index 0000000..94668d9 --- /dev/null +++ b/01===sys22/baseSys/userSys/design/database/sys22_user.ndm2 @@ -0,0 +1,1629 @@ +{ + "paper": { + "name": "A4", + "leftMargin": 0.5, + "rightMargin": 0.5, + "topMargin": 0.5, + "bottomMargin": 0.5, + "isPortriat": true + }, + "modelVersion": 2.01, + "defaultSchema": "sys22_user", + "server": { + "objectType": "Server_MARIADB", + "name": "Default", + "uuid": "", + "serverVersion": 100999, + "edition": "Default", + "lowerCaseTableNames": 0, + "schemas": [ + { + "objectType": "Schema_MARIADB", + "name": "sys22_user", + "tables": [ + { + "objectType": "Table_MARIADB", + "name": "user_info", + "comment": "", + "engine": "", + "characterSet": "", + "collation": "", + "autoIncrement": 0, + "tablespace": "", + "storage": "", + "insertMethod": "", + "connection": "", + "checksum": false, + "rowFormat": "", + "avgRowLength": 0, + "maxRows": 0, + "minRows": 0, + "keyBlockSize": 0, + "packKeys": "", + "delayKeyWrite": false, + "dataDirectory": "", + "indexDirectory": "", + "statsAutoRecalc": "", + "statsPersistent": "", + "statsSamplePages": "", + "union": "", + "pageChecksum": false, + "transactional": false, + "oldName": "", + "encryption": false, + "encryptionKeyID": 0, + "IETFQuotes": false, + "createOptions": "", + "createTime": "", + "checkTime": "", + "dataFree": 0, + "dataLength": 0, + "indexLength": 0, + "maxDataLength": 0, + "rows": 0, + "updateTime": "", + "DDL": "", + "partitionBy": "", + "partitionByExpr": "", + "partitions": 0, + "partitionKeyAlgorithm": "", + "subPartitionBy": "", + "subPartitionByExpr": "", + "subPartitions": 0, + "subPartitionKeyAlgorithm": "", + "fields": [ + { + "objectType": "TableField_MARIADB", + "name": "uuid", + "type": "char", + "length": 32, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "唯一id", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "uuid" + }, + { + "objectType": "TableField_MARIADB", + "name": "username", + "type": "varchar", + "length": 255, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "用户名", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "username" + }, + { + "objectType": "TableField_MARIADB", + "name": "email", + "type": "varchar", + "length": 255, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "电子邮箱", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "email" + }, + { + "objectType": "TableField_MARIADB", + "name": "phone", + "type": "int", + "length": 11, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "手机号码", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "phone" + }, + { + "objectType": "TableField_MARIADB", + "name": "person", + "type": "varchar", + "length": 18, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "身份证", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "person" + }, + { + "objectType": "TableField_MARIADB", + "name": "status", + "type": "int", + "length": 1, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "0", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "使用状态", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "status" + }, + { + "objectType": "TableField_MARIADB", + "name": "createtime", + "type": "bigint", + "length": 13, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "创建时间", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "createtime" + } + ], + "indexes": [], + "primaryKey": { + "objectType": "PrimaryKey_MARIADB", + "name": "", + "fields": [ + { + "objectType": "IndexField_MARIADB", + "name": "uuid", + "keyLength": 0, + "order": "", + "oldName": "" + } + ], + "oldName": "", + "indexMethod": "", + "comment": "" + }, + "foreignKeys": [], + "checks": [], + "triggers": [], + "tablePartitions": [] + }, + { + "objectType": "Table_MARIADB", + "name": "user_login", + "comment": "", + "engine": "", + "characterSet": "", + "collation": "", + "autoIncrement": 0, + "tablespace": "", + "storage": "", + "insertMethod": "", + "connection": "", + "checksum": false, + "rowFormat": "", + "avgRowLength": 0, + "maxRows": 0, + "minRows": 0, + "keyBlockSize": 0, + "packKeys": "", + "delayKeyWrite": false, + "dataDirectory": "", + "indexDirectory": "", + "statsAutoRecalc": "", + "statsPersistent": "", + "statsSamplePages": "", + "union": "", + "pageChecksum": false, + "transactional": false, + "oldName": "", + "encryption": false, + "encryptionKeyID": 0, + "IETFQuotes": false, + "createOptions": "", + "createTime": "", + "checkTime": "", + "dataFree": 0, + "dataLength": 0, + "indexLength": 0, + "maxDataLength": 0, + "rows": 0, + "updateTime": "", + "DDL": "", + "partitionBy": "", + "partitionByExpr": "", + "partitions": 0, + "partitionKeyAlgorithm": "", + "subPartitionBy": "", + "subPartitionByExpr": "", + "subPartitions": 0, + "subPartitionKeyAlgorithm": "", + "fields": [ + { + "objectType": "TableField_MARIADB", + "name": "id", + "type": "int", + "length": -2147483648, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": true, + "comment": "自增id", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "id" + }, + { + "objectType": "TableField_MARIADB", + "name": "uuid", + "type": "char", + "length": 32, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "用户唯一ID", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "uuid" + }, + { + "objectType": "TableField_MARIADB", + "name": "password", + "type": "varchar", + "length": 255, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "加密密码", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "password" + }, + { + "objectType": "TableField_MARIADB", + "name": "createtime", + "type": "bigint", + "length": 13, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "密码创建时间", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "createtime" + }, + { + "objectType": "TableField_MARIADB", + "name": "status", + "type": "int", + "length": 1, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "0", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "密码使用状态", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "status" + } + ], + "indexes": [], + "primaryKey": { + "objectType": "PrimaryKey_MARIADB", + "name": "", + "fields": [ + { + "objectType": "IndexField_MARIADB", + "name": "id", + "keyLength": -2147483648, + "order": "", + "oldName": "" + } + ], + "oldName": "", + "indexMethod": "", + "comment": "" + }, + "foreignKeys": [], + "checks": [], + "triggers": [], + "tablePartitions": [] + }, + { + "objectType": "Table_MARIADB", + "name": "user_info_other", + "comment": "", + "engine": "", + "characterSet": "", + "collation": "", + "autoIncrement": 0, + "tablespace": "", + "storage": "", + "insertMethod": "", + "connection": "", + "checksum": false, + "rowFormat": "", + "avgRowLength": 0, + "maxRows": 0, + "minRows": 0, + "keyBlockSize": 0, + "packKeys": "", + "delayKeyWrite": false, + "dataDirectory": "", + "indexDirectory": "", + "statsAutoRecalc": "", + "statsPersistent": "", + "statsSamplePages": "", + "union": "", + "pageChecksum": false, + "transactional": false, + "oldName": "", + "encryption": false, + "encryptionKeyID": 0, + "IETFQuotes": false, + "createOptions": "", + "createTime": "", + "checkTime": "", + "dataFree": 0, + "dataLength": 0, + "indexLength": 0, + "maxDataLength": 0, + "rows": 0, + "updateTime": "", + "DDL": "", + "partitionBy": "", + "partitionByExpr": "", + "partitions": 0, + "partitionKeyAlgorithm": "", + "subPartitionBy": "", + "subPartitionByExpr": "", + "subPartitions": 0, + "subPartitionKeyAlgorithm": "", + "fields": [ + { + "objectType": "TableField_MARIADB", + "name": "uuid", + "type": "char", + "length": 32, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "用户唯一ID", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "uuid" + }, + { + "objectType": "TableField_MARIADB", + "name": "address", + "type": "varchar", + "length": 255, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "住址", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "address" + }, + { + "objectType": "TableField_MARIADB", + "name": "country", + "type": "varchar", + "length": 255, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "国家地区", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "country" + }, + { + "objectType": "TableField_MARIADB", + "name": "sex", + "type": "int", + "length": 1, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "性别", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "sex" + }, + { + "objectType": "TableField_MARIADB", + "name": "birthady", + "type": "int", + "length": 8, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "生日", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "birthady" + }, + { + "objectType": "TableField_MARIADB", + "name": "nickname", + "type": "varchar", + "length": 64, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "昵称", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "nickname" + }, + { + "objectType": "TableField_MARIADB", + "name": "personal", + "type": "varchar", + "length": 255, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "个人简介", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "personal" + }, + { + "objectType": "TableField_MARIADB", + "name": "slogn", + "type": "varchar", + "length": 64, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "标语", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "slogn" + }, + { + "objectType": "TableField_MARIADB", + "name": "avatar", + "type": "varchar", + "length": 64, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "头像", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "avatar" + }, + { + "objectType": "TableField_MARIADB", + "name": "background", + "type": "varchar", + "length": 64, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": true, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "背景", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "background" + }, + { + "objectType": "TableField_MARIADB", + "name": "updateTime", + "type": "bigint", + "length": 13, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "修改时间", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "updateTime" + } + ], + "indexes": [], + "primaryKey": { + "objectType": "PrimaryKey_MARIADB", + "name": "", + "fields": [ + { + "objectType": "IndexField_MARIADB", + "name": "uuid", + "keyLength": -2147483648, + "order": "", + "oldName": "" + } + ], + "oldName": "", + "indexMethod": "", + "comment": "" + }, + "foreignKeys": [], + "checks": [], + "triggers": [], + "tablePartitions": [] + }, + { + "objectType": "Table_MARIADB", + "name": "user_role", + "comment": "", + "engine": "", + "characterSet": "", + "collation": "", + "autoIncrement": 0, + "tablespace": "", + "storage": "", + "insertMethod": "", + "connection": "", + "checksum": false, + "rowFormat": "", + "avgRowLength": 0, + "maxRows": 0, + "minRows": 0, + "keyBlockSize": 0, + "packKeys": "", + "delayKeyWrite": false, + "dataDirectory": "", + "indexDirectory": "", + "statsAutoRecalc": "", + "statsPersistent": "", + "statsSamplePages": "", + "union": "", + "pageChecksum": false, + "transactional": false, + "oldName": "", + "encryption": false, + "encryptionKeyID": 0, + "IETFQuotes": false, + "createOptions": "", + "createTime": "", + "checkTime": "", + "dataFree": 0, + "dataLength": 0, + "indexLength": 0, + "maxDataLength": 0, + "rows": 0, + "updateTime": "", + "DDL": "", + "partitionBy": "", + "partitionByExpr": "", + "partitions": 0, + "partitionKeyAlgorithm": "", + "subPartitionBy": "", + "subPartitionByExpr": "", + "subPartitions": 0, + "subPartitionKeyAlgorithm": "", + "fields": [ + { + "objectType": "TableField_MARIADB", + "name": "id", + "type": "int", + "length": -2147483648, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": true, + "comment": "唯一ID", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "id" + }, + { + "objectType": "TableField_MARIADB", + "name": "role_name", + "type": "varchar", + "length": 32, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "角色名称", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "role_name" + }, + { + "objectType": "TableField_MARIADB", + "name": "role_remarks", + "type": "varchar", + "length": 255, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "角色备注", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "role_remarks" + } + ], + "indexes": [], + "primaryKey": { + "objectType": "PrimaryKey_MARIADB", + "name": "", + "fields": [ + { + "objectType": "IndexField_MARIADB", + "name": "id", + "keyLength": -2147483648, + "order": "", + "oldName": "" + } + ], + "oldName": "", + "indexMethod": "", + "comment": "" + }, + "foreignKeys": [], + "checks": [], + "triggers": [], + "tablePartitions": [] + }, + { + "objectType": "Table_MARIADB", + "name": "user_authority", + "comment": "", + "engine": "", + "characterSet": "", + "collation": "", + "autoIncrement": 0, + "tablespace": "", + "storage": "", + "insertMethod": "", + "connection": "", + "checksum": false, + "rowFormat": "", + "avgRowLength": 0, + "maxRows": 0, + "minRows": 0, + "keyBlockSize": 0, + "packKeys": "", + "delayKeyWrite": false, + "dataDirectory": "", + "indexDirectory": "", + "statsAutoRecalc": "", + "statsPersistent": "", + "statsSamplePages": "", + "union": "", + "pageChecksum": false, + "transactional": false, + "oldName": "", + "encryption": false, + "encryptionKeyID": 0, + "IETFQuotes": false, + "createOptions": "", + "createTime": "", + "checkTime": "", + "dataFree": 0, + "dataLength": 0, + "indexLength": 0, + "maxDataLength": 0, + "rows": 0, + "updateTime": "", + "DDL": "", + "partitionBy": "", + "partitionByExpr": "", + "partitions": 0, + "partitionKeyAlgorithm": "", + "subPartitionBy": "", + "subPartitionByExpr": "", + "subPartitions": 0, + "subPartitionKeyAlgorithm": "", + "fields": [ + { + "objectType": "TableField_MARIADB", + "name": "id", + "type": "int", + "length": -2147483648, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": true, + "comment": "自增ID", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "id" + }, + { + "objectType": "TableField_MARIADB", + "name": "authority_name", + "type": "varchar", + "length": 32, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "权限名称", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "authority_name" + }, + { + "objectType": "TableField_MARIADB", + "name": "type", + "type": "int", + "length": 2, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "权限类型", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "type" + }, + { + "objectType": "TableField_MARIADB", + "name": "grade", + "type": "int", + "length": 2, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "权限等级", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "grade" + }, + { + "objectType": "TableField_MARIADB", + "name": "sequence", + "type": "int", + "length": 3, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "序列", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "sequence" + }, + { + "objectType": "TableField_MARIADB", + "name": "authority_remarks", + "type": "varchar", + "length": 255, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "权限备注", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "authority_remarks" + } + ], + "indexes": [], + "primaryKey": { + "objectType": "PrimaryKey_MARIADB", + "name": "", + "fields": [ + { + "objectType": "IndexField_MARIADB", + "name": "id", + "keyLength": -2147483648, + "order": "", + "oldName": "" + } + ], + "oldName": "", + "indexMethod": "", + "comment": "" + }, + "foreignKeys": [], + "checks": [], + "triggers": [], + "tablePartitions": [] + }, + { + "objectType": "Table_MARIADB", + "name": "user_relation_role", + "comment": "", + "engine": "", + "characterSet": "", + "collation": "", + "autoIncrement": 0, + "tablespace": "", + "storage": "", + "insertMethod": "", + "connection": "", + "checksum": false, + "rowFormat": "", + "avgRowLength": 0, + "maxRows": 0, + "minRows": 0, + "keyBlockSize": 0, + "packKeys": "", + "delayKeyWrite": false, + "dataDirectory": "", + "indexDirectory": "", + "statsAutoRecalc": "", + "statsPersistent": "", + "statsSamplePages": "", + "union": "", + "pageChecksum": false, + "transactional": false, + "oldName": "", + "encryption": false, + "encryptionKeyID": 0, + "IETFQuotes": false, + "createOptions": "", + "createTime": "", + "checkTime": "", + "dataFree": 0, + "dataLength": 0, + "indexLength": 0, + "maxDataLength": 0, + "rows": 0, + "updateTime": "", + "DDL": "", + "partitionBy": "", + "partitionByExpr": "", + "partitions": 0, + "partitionKeyAlgorithm": "", + "subPartitionBy": "", + "subPartitionByExpr": "", + "subPartitions": 0, + "subPartitionKeyAlgorithm": "", + "fields": [ + { + "objectType": "TableField_MARIADB", + "name": "id", + "type": "int", + "length": -2147483648, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "自增ID", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "id" + }, + { + "objectType": "TableField_MARIADB", + "name": "uuid", + "type": "char", + "length": 32, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "用户标识", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "uuid" + }, + { + "objectType": "TableField_MARIADB", + "name": "role_id", + "type": "int", + "length": -2147483648, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "0", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "角色ID", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "role_id" + } + ], + "indexes": [], + "primaryKey": { + "objectType": "PrimaryKey_MARIADB", + "name": "", + "fields": [ + { + "objectType": "IndexField_MARIADB", + "name": "id", + "keyLength": -2147483648, + "order": "", + "oldName": "" + } + ], + "oldName": "", + "indexMethod": "", + "comment": "" + }, + "foreignKeys": [], + "checks": [], + "triggers": [], + "tablePartitions": [] + }, + { + "objectType": "Table_MARIADB", + "name": "user_relation_authority", + "comment": "", + "engine": "", + "characterSet": "", + "collation": "", + "autoIncrement": 0, + "tablespace": "", + "storage": "", + "insertMethod": "", + "connection": "", + "checksum": false, + "rowFormat": "", + "avgRowLength": 0, + "maxRows": 0, + "minRows": 0, + "keyBlockSize": 0, + "packKeys": "", + "delayKeyWrite": false, + "dataDirectory": "", + "indexDirectory": "", + "statsAutoRecalc": "", + "statsPersistent": "", + "statsSamplePages": "", + "union": "", + "pageChecksum": false, + "transactional": false, + "oldName": "", + "encryption": false, + "encryptionKeyID": 0, + "IETFQuotes": false, + "createOptions": "", + "createTime": "", + "checkTime": "", + "dataFree": 0, + "dataLength": 0, + "indexLength": 0, + "maxDataLength": 0, + "rows": 0, + "updateTime": "", + "DDL": "", + "partitionBy": "", + "partitionByExpr": "", + "partitions": 0, + "partitionKeyAlgorithm": "", + "subPartitionBy": "", + "subPartitionByExpr": "", + "subPartitions": 0, + "subPartitionKeyAlgorithm": "", + "fields": [ + { + "objectType": "TableField_MARIADB", + "name": "id", + "type": "int", + "length": -2147483648, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": true, + "comment": "自增ID", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "id" + }, + { + "objectType": "TableField_MARIADB", + "name": "role_id", + "type": "int", + "length": -2147483648, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "角色ID", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "role_id" + }, + { + "objectType": "TableField_MARIADB", + "name": "authority_id", + "type": "int", + "length": -2147483648, + "decimals": -2147483648, + "isUnsigned": false, + "isZeroFill": false, + "setEnumValues": "", + "charset": "", + "collation": "", + "check": "", + "isNullable": false, + "defaultType": "Others", + "defaultValue": "", + "isOnUpdateCurrentTimestamp": false, + "isAutoInc": false, + "comment": "权限ID", + "columnFormat": "", + "isVirtual": false, + "isGeneratedAlways": false, + "virtualExpr": "", + "virtualType": "", + "oldName": "authority_id" + } + ], + "indexes": [], + "primaryKey": { + "objectType": "PrimaryKey_MARIADB", + "name": "", + "fields": [ + { + "objectType": "IndexField_MARIADB", + "name": "id", + "keyLength": -2147483648, + "order": "", + "oldName": "" + } + ], + "oldName": "", + "indexMethod": "", + "comment": "" + }, + "foreignKeys": [], + "checks": [], + "triggers": [], + "tablePartitions": [] + } + ], + "views": [] + } + ] + }, + "diagrams": [ + { + "name": "Diagram 1", + "paperWidth": 1, + "paperHeight": 1, + "tableFont": "Arial Unicode MS", + "tableFontSize": 14, + "isBalckWhite": false, + "showDBSchemaName": false, + "showViewRelations": true, + "notation": "default", + "showFieldComment": false, + "showTableComment": false, + "shapes": [ + { + "type": "table", + "schemaName": "sys22_user", + "tableName": "user_login", + "x": 300, + "y": 30, + "width": 200, + "height": 200, + "isBold": false, + "titleColor": { + "r": 55, + "g": 131, + "b": 192, + "a": 1 + } + }, + { + "type": "table", + "schemaName": "sys22_user", + "tableName": "user_info", + "x": 30, + "y": 380, + "width": 200, + "height": 200, + "isBold": false, + "titleColor": { + "r": 55, + "g": 131, + "b": 192, + "a": 1 + } + }, + { + "type": "table", + "schemaName": "sys22_user", + "tableName": "user_authority", + "x": 300, + "y": 380, + "width": 200, + "height": 200, + "isBold": false, + "titleColor": { + "r": 55, + "g": 131, + "b": 192, + "a": 1 + } + }, + { + "type": "table", + "schemaName": "sys22_user", + "tableName": "user_relation_role", + "x": 570, + "y": 30, + "width": 200, + "height": 200, + "isBold": false, + "titleColor": { + "r": 55, + "g": 131, + "b": 192, + "a": 1 + } + }, + { + "type": "table", + "schemaName": "sys22_user", + "tableName": "user_relation_authority", + "x": 570, + "y": 380, + "width": 200, + "height": 200, + "isBold": false, + "titleColor": { + "r": 55, + "g": 131, + "b": 192, + "a": 1 + } + }, + { + "type": "table", + "schemaName": "sys22_user", + "tableName": "user_role", + "x": 30, + "y": 650, + "width": 200, + "height": 200, + "isBold": false, + "titleColor": { + "r": 55, + "g": 131, + "b": 192, + "a": 1 + } + }, + { + "type": "table", + "schemaName": "sys22_user", + "tableName": "user_info_other", + "x": 30, + "y": 30, + "width": 200, + "height": 280, + "isBold": false, + "titleColor": { + "r": 55, + "g": 131, + "b": 192, + "a": 1 + } + } + ], + "layers": [], + "relations": [], + "viewRelations": [] + } + ] +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/design/database/sys22_user.sql b/01===sys22/baseSys/userSys/design/database/sys22_user.sql new file mode 100644 index 0000000..0c2889c --- /dev/null +++ b/01===sys22/baseSys/userSys/design/database/sys22_user.sql @@ -0,0 +1,66 @@ +CREATE TABLE `sys22_user`.`user_authority` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `authority_name` varchar(32) NOT NULL COMMENT '权限名称', + `type` int(2) NOT NULL COMMENT '权限类型', + `grade` int(2) NOT NULL COMMENT '权限等级', + `sequence` int(3) NOT NULL COMMENT '序列', + `authority_remarks` varchar(255) NOT NULL COMMENT '权限备注', + PRIMARY KEY (`id`) +); + +CREATE TABLE `sys22_user`.`user_info` ( + `uuid` char(32) NOT NULL COMMENT '唯一id', + `username` varchar(255) NULL COMMENT '用户名', + `email` varchar(255) NULL COMMENT '电子邮箱', + `phone` int(11) NULL COMMENT '手机号码', + `person` varchar(18) NULL COMMENT '身份证', + `status` int(1) NOT NULL DEFAULT 0 COMMENT '使用状态', + `createtime` bigint(13) NOT NULL COMMENT '创建时间', + PRIMARY KEY (`uuid`) +); + +CREATE TABLE `sys22_user`.`user_info_other` ( + `uuid` char(32) NOT NULL COMMENT '用户唯一ID', + `address` varchar(255) NULL COMMENT '住址', + `country` varchar(255) NULL COMMENT '国家地区', + `sex` int(1) NULL COMMENT '性别', + `birthady` int(8) NULL COMMENT '生日', + `nickname` varchar(64) NULL COMMENT '昵称', + `personal` varchar(255) NULL COMMENT '个人简介', + `slogn` varchar(64) NULL COMMENT '标语', + `avatar` varchar(64) NULL COMMENT '头像', + `background` varchar(64) NULL COMMENT '背景', + `updateTime` bigint(13) NOT NULL COMMENT '修改时间', + PRIMARY KEY (`uuid`) +); + +CREATE TABLE `sys22_user`.`user_login` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增id', + `uuid` char(32) NOT NULL COMMENT '用户唯一ID', + `password` varchar(255) NOT NULL COMMENT '加密密码', + `createtime` bigint(13) NOT NULL COMMENT '密码创建时间', + `status` int(1) NOT NULL DEFAULT 0 COMMENT '密码使用状态', + PRIMARY KEY (`id`) +); + +CREATE TABLE `sys22_user`.`user_relation_authority` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `role_id` int NOT NULL COMMENT '角色ID', + `authority_id` int NOT NULL COMMENT '权限ID', + PRIMARY KEY (`id`) +); + +CREATE TABLE `sys22_user`.`user_relation_role` ( + `id` int NOT NULL COMMENT '自增ID', + `uuid` char(32) NOT NULL COMMENT '用户标识', + `role_id` int NOT NULL DEFAULT 0 COMMENT '角色ID', + PRIMARY KEY (`id`) +); + +CREATE TABLE `sys22_user`.`user_role` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '唯一ID', + `role_name` varchar(32) NOT NULL COMMENT '角色名称', + `role_remarks` varchar(255) NOT NULL COMMENT '角色备注', + PRIMARY KEY (`id`) +); + diff --git a/01===sys22/baseSys/userSys/design/design.dirname b/01===sys22/baseSys/userSys/design/design.dirname new file mode 100644 index 0000000..e69de29 diff --git a/01===sys22/baseSys/userSys/design/接口概览.xmind b/01===sys22/baseSys/userSys/design/接口概览.xmind new file mode 100644 index 0000000..d5b9c7a Binary files /dev/null and b/01===sys22/baseSys/userSys/design/接口概览.xmind differ diff --git a/01===sys22/baseSys/userSys/design/模块设计.xmind b/01===sys22/baseSys/userSys/design/模块设计.xmind new file mode 100644 index 0000000..cf7576f Binary files /dev/null and b/01===sys22/baseSys/userSys/design/模块设计.xmind differ diff --git a/01===sys22/baseSys/userSys/design/用户系统表.xmind b/01===sys22/baseSys/userSys/design/用户系统表.xmind new file mode 100644 index 0000000..1adcf7d Binary files /dev/null and b/01===sys22/baseSys/userSys/design/用户系统表.xmind differ diff --git a/01===sys22/baseSys/userSys/design/需求分析.md b/01===sys22/baseSys/userSys/design/需求分析.md new file mode 100644 index 0000000..b2a7367 --- /dev/null +++ b/01===sys22/baseSys/userSys/design/需求分析.md @@ -0,0 +1,12 @@ +# userSys设计-需求分析 + +# 一、提供的服务 + +1. 记录用户信息 +2. 设置用户角色 +3. 控制角色权限 +4. 对外提供接口 +5. 记录系统权限 +6. 稳定、高可用、可拓展、可迭代 +7. 安全与保密性 +8. 高性能 \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/READE.md b/01===sys22/baseSys/userSys/realization/READE.md new file mode 100644 index 0000000..4e7e4b1 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/READE.md @@ -0,0 +1,7 @@ +# userSys + +## run + +```bash +npm start +``` \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/app.js b/01===sys22/baseSys/userSys/realization/app.js new file mode 100644 index 0000000..ee5daff --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/app.js @@ -0,0 +1,118 @@ +// koa-router:提供全面的路由功能,比如类似Express的app.get/post/put的写法,URL命名参数、路由命名、嵌套路由、支持加载多个中间件 +// koa-bodyparser:post提交数据中间件,解析请求体时需要加载的中间件,支持x-www-form-urlencoded, application/json等格式的请求体,不支持form-data的请求体 +// koa-views:对进行视图模板渲染,支持ejs, nunjucks等模板引擎 +// koa-static:静态资源中间件,用作类似Nginx的静态文件服务,在本地开发时可用于加载前端文件或后端Fake数据 +// koa-session:session验证,支持将会话信息存储在本地Cookie或Redis, MongoDB +// koa-jwt:token验证,路由权限控制功能,Session Base转为用Token Base +// koa-helmet:网络安全,增加Strict-Transport-Security, X-Frame-Options, X-Frame-Options等HTTP头,提高应用程序的安全性 +// koa-compress:当响应体较大时,启用类似Gzip的压缩技术减少传输内容 +// koa-logger:输出请求日志的功能,包括请求的url、状态码、响应时间、响应体大小等信息 +// koa-convert:基于Promise的中间件和基于Generate的中间件相互转换 +// koa-nunjucks-2:轻量级 Nunjucks 中间件,可以用作模板引擎,为koa应用提供页面渲染功能 +// koa-favicon:页面logo加载 +// koa-json:get提交数据的中间件 +// koa-onerror:在服务器产生错误(throw 抛出等)后自动重定义到指定路径 +// koa-respond:在Koa上下文中添加了常用的方法 + +/** + * 添加依赖 + * */ +const Koa = require('koa')// 主依赖 Koa2 + , logger = require('koa-logger')// 日志 + // , bodyparser = require('koa-bodyparser')// 获取body的参数,post,支持x-www-form-urlencoded, application/json等格式的请求体,不支持form-data的请求体 + , koaBody = require('koa-body')// 支持form-data,支持文件,不支持x-www-form-urlencoded,不可同时使用, + + +global.path = __dirname + +/** + * 路由 + * */ +const router = require('./src/Routes/index') +/** + * 创建应用程序 + * */ +const app = new Koa(); +// 数据库操作 +// databaseOperation() + +// 请求日志 +app.use(logger()); +// 时间 +app.use(printMethod()); +// ctx.request.body body参数 +// 已过时,被koa-body替代 +// app.use(bodyparser({ +// enableTypes: ['json', 'form', 'text'] +// })) +app.use(koaBody({ + multipart:true, // 支持文件上传 + encoding:'gzip', + strict:false,// 参数:如果启用,则不解析GET,HEAD,DELETE请求,默认为true + formidable:{ + // uploadDir:path.join(__dirname,'public/upload/'), // 设置文件上传目录 + keepExtensions: true, // 保持文件的后缀 + maxFieldsSize:2 * 1024 * 1024, // 文件上传大小 + // onFileBegin:(name,file) => { // 文件上传前的设置 + // // console.log(`name: ${name}`); + // // console.log(file); + // }, + } +})); + +// token +app.use(verToken()) + + +// 路由 +app.use(router.routes(), router.allowedMethods({ + // throw: true, // 抛出错误,代替设置响应头状态 + // notImplemented: () => '不支持当前请求所需要的功能', + // methodNotAllowed: () => '不支持的请求方式' +})); + +// veriToken +function verToken(){ + return async function(ctx, next){ + // 请求地址判断 + if(ctx.req.url.indexOf('/api/user/will') == 0){ + await next() + }else{ + const token = ctx.request.header.authorization + const result2 = global.token.decrypt(token) + // 判断此Token有没有过期 + if(result2.token){ + const result = await global.Redis.getToken(token) + // 判断Redis是否有此token + if(result){ + ctx.uuid = result2.id.uuid + ctx.token = token + await next() + }else{ + ctx.body = global.msg.failed({}, '账户令牌失效!', true) + } + + }else{ + ctx.body = global.msg.failed({}, '账户令牌失效。', true) + } + + } + } +} + +// 打印时间 +function printMethod() { + return async function (ctx, next) { + const start = new Date() + await next() + const ms = new Date() - start + console.info(`Method ${ctx.method} ${ctx.url} - ${ms}ms`) + } +} + +setTimeout(other) +function other(){ + console.w('other test') + console.w(global.path) +} +module.exports = app; \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/bin/www.js b/01===sys22/baseSys/userSys/realization/bin/www.js new file mode 100644 index 0000000..2c6d676 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/bin/www.js @@ -0,0 +1,86 @@ +/** + * 引入依赖 + * */ + +const initConsole = require('../tools/console/index') + , {getSystem} = require('../tools/getEnv') + , app = require('../app') + , http = require('http') + , config = require('../config/default.config') + , {createDatabase, createTables} = require('../src/Database/initDatabase') + , initRedisJSON = require('../tools/redisJSON') + , getStr = require('../tools/RandomString') + , makeUUID = require('../tools/uuid') + , mail = require('../tools/mail') + , {HASH} = require('../tools/user/encryptionString') + , token = require('../tools/user/token') + +async function run() { + // 初始化console + console.time('> Web Start Use'); + initConsole(); + // console.clear(); + /** + * 环境探测 + * */ + const sysEnv = getSystem(); + console.dev(sysEnv); + /** + * 初始化数据库 + * */ + try { + let result = await createDatabase(); + console.s('> ' + result.message); + result = await createTables(); + console.s('> ' + result.message); + } catch (e) { + console.dev(e); + throw new Error(e) + } + /** + * 初始化Redis + * */ + try { + global.Redis = await initRedisJSON() + } catch (e) { + throw new Error(e) + } + /** + * 加载工具 + * */ + console.dev('> 加载工具类。') + global.cfg = config + global.getStr = getStr + global.makeUUID = makeUUID + global.mail = mail + global.HASH = HASH + global.token = token + // 统一消息回复 + global.msg = { + success: (data, message = "success") => ({data, message, status:true}), + failed: (data, message = "failed", reStart = false) => ({data, message, reStart, status:false}) + } + + /** + * 启动服务 + * */ + const server = http.createServer(app.callback()); + server.listen(config.PORT) + // 启动 + server.on("listening", function onListening(port) { + console.info(`> Web System Name: ${config.PROJECT_NAME}`) + console.info(`> httpServer listening in http://localhost:${config.PORT}`); + console.timeEnd('> Web Start Use') + }) + // 出错 + server.on("error", function onError(error) { + console.error('> httpServer Error!'); + console.error(error); + process.exit(1); + }) +} + +run() + + + diff --git a/01===sys22/baseSys/userSys/realization/config/database/sys22_user.sql b/01===sys22/baseSys/userSys/realization/config/database/sys22_user.sql new file mode 100644 index 0000000..5f40ac0 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/config/database/sys22_user.sql @@ -0,0 +1,66 @@ +CREATE TABLE IF NOT EXISTS `sys22_user`.`user_authority` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `authority_name` varchar(32) NOT NULL COMMENT '权限名称', + `type` int(2) NOT NULL COMMENT '权限类型', + `grade` int(2) NOT NULL COMMENT '权限等级', + `sequence` int(3) NOT NULL COMMENT '序列', + `authority_remarks` varchar(255) NOT NULL COMMENT '权限备注', + PRIMARY KEY (`id`) +); + +CREATE TABLE IF NOT EXISTS `sys22_user`.`user_info` ( + `uuid` char(32) NOT NULL COMMENT '唯一id', + `username` varchar(255) NULL COMMENT '用户名', + `email` varchar(255) NULL COMMENT '电子邮箱', + `phone` bigint(11) NULL COMMENT '手机号码', + `person` varchar(18) NULL COMMENT '身份证', + `status` int(1) NOT NULL DEFAULT 1 COMMENT '使用状态', + `createtime` bigint(13) NOT NULL COMMENT '创建时间', + PRIMARY KEY (`uuid`) +); + +CREATE TABLE IF NOT EXISTS `sys22_user`.`user_info_other` ( + `uuid` char(32) NOT NULL COMMENT '用户唯一ID', + `address` varchar(255) NULL COMMENT '住址', + `country` varchar(255) NULL COMMENT '国家地区', + `sex` int(1) NULL COMMENT '性别', + `birthday` int(8) NULL COMMENT '生日', + `nickname` varchar(64) NULL COMMENT '昵称', + `personal` varchar(255) NULL COMMENT '个人简介', + `slogan` varchar(64) NULL COMMENT '标语', + `avatar` varchar(64) NULL COMMENT '头像', + `background` varchar(64) NULL COMMENT '背景', + `updateTime` bigint(13) NOT NULL COMMENT '修改时间', + PRIMARY KEY (`uuid`) +); + +CREATE TABLE IF NOT EXISTS `sys22_user`.`user_login` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增id', + `uuid` char(32) NOT NULL COMMENT '用户唯一ID', + `password` char(128) NOT NULL COMMENT '加密密码', + `createtime` bigint(13) NOT NULL COMMENT '密码创建时间', + `status` int(1) NOT NULL DEFAULT 0 COMMENT '密码使用状态', + PRIMARY KEY (`id`) +); + +CREATE TABLE IF NOT EXISTS `sys22_user`.`user_relation_authority` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `role_id` int NOT NULL COMMENT '角色ID', + `authority_id` int NOT NULL COMMENT '权限ID', + PRIMARY KEY (`id`) +); + +CREATE TABLE IF NOT EXISTS `sys22_user`.`user_relation_role` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `uuid` char(32) NOT NULL COMMENT '用户标识', + `role_id` int NOT NULL DEFAULT 0 COMMENT '角色ID', + PRIMARY KEY (`id`) +); + +CREATE TABLE IF NOT EXISTS `sys22_user`.`user_role` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '唯一ID', + `role_name` varchar(32) NOT NULL COMMENT '角色名称', + `role_remarks` varchar(255) NOT NULL COMMENT '角色备注', + PRIMARY KEY (`id`) +); + diff --git a/01===sys22/baseSys/userSys/realization/config/default.config.js b/01===sys22/baseSys/userSys/realization/config/default.config.js new file mode 100644 index 0000000..c9b5497 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/config/default.config.js @@ -0,0 +1,52 @@ +module.exports = { + // 配置文件路径 + CONFIG_PATH:__dirname, + SYSTEM_NAME:'ANTO-G', + PROJECT_NAME:'sys22 userSys', + PORT:'3000', + KEY:'expressgy', + DATABASE_INIT:{ + host: 'localhost', + user: 'root', + password:'Hxl1314521', + database: "sys22_user", + port: 3306, + sqlFile:__dirname + "/database/sys22_user.sql" + }, + // 加密 + encryption:{ + salt:'время,вперёд!',// 盐 + secretKey:"быть всегда готовым!",// 密钥 + }, + // 用户系统 + user:{ + // 注册 + sign:{ + mailVerf: false,// 邮箱验证注册 + phoneVerf:false,// 手机验证注册 + length:4,// 验证码长度 + }, + // 登录 + login:{ + timeLimit:1000 * 60 * 60 * 24 * 14 ,// token时常 + } + }, + // 邮件服务 + EMAILCONFIG : { + HOST:'smtp.qq.com', + USER:'togy.gc@qq.com', + PASS:'qnpjbbeyunysdhac' + }, + // redis + RedisJSON:{ + host:'localhost', + port:6379, + timeout:5 * 60 * 1000, + // timeout:5 * 1000, + startClear: false, + pool:0, + clearTime:1000 * 60 * 60 * 6 + }, + // 一个用户的同时在线终端数量 + maxClientOnline:6 +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/package.json b/01===sys22/baseSys/userSys/realization/package.json new file mode 100644 index 0000000..1eae066 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/package.json @@ -0,0 +1,34 @@ +{ + "name": "realization", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node bin/www.js", + "dev": "node_modules\\.bin\\nodemon bin\\www.js", + "prd": "pm2 start bin/www" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "crypto": "^1.0.1", + "jsonwebtoken": "^8.5.1", + "koa": "^2.13.4", + "koa-body": "^5.0.0", + "koa-bodyparser": "^4.3.0", + "koa-logger": "^3.2.1", + "koa-router": "^12.0.0", + "mysql": "^2.18.1", + "mysqls": "^1.2.2", + "nodemailer": "^6.8.0", + "redis": "^4.3.1", + "uuid": "^8.3.2" + }, + "devDependencies": { + "axios": "^0.27.2", + "mysql-import": "^5.0.21", + "nodemon": "^2.0.19" + } +} diff --git a/01===sys22/baseSys/userSys/realization/pnpm-lock.yaml b/01===sys22/baseSys/userSys/realization/pnpm-lock.yaml new file mode 100644 index 0000000..74abd0e --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/pnpm-lock.yaml @@ -0,0 +1,1113 @@ +lockfileVersion: 5.4 + +specifiers: + axios: ^0.27.2 + crypto: ^1.0.1 + jsonwebtoken: ^8.5.1 + koa: ^2.13.4 + koa-body: ^5.0.0 + koa-bodyparser: ^4.3.0 + koa-logger: ^3.2.1 + koa-router: ^12.0.0 + mysql: ^2.18.1 + mysql-import: ^5.0.21 + mysqls: ^1.2.2 + nodemailer: ^6.8.0 + nodemon: ^2.0.19 + redis: ^4.3.1 + uuid: ^8.3.2 + +dependencies: + crypto: 1.0.1 + jsonwebtoken: 8.5.1 + koa: 2.13.4 + koa-body: 5.0.0 + koa-bodyparser: 4.3.0 + koa-logger: 3.2.1 + koa-router: 12.0.0 + mysql: 2.18.1 + mysqls: 1.2.2 + nodemailer: 6.8.0 + redis: 4.3.1 + uuid: 8.3.2 + +devDependencies: + axios: 0.27.2 + mysql-import: 5.0.21 + nodemon: 2.0.20 + +packages: + + /@redis/bloom/1.0.2_@redis+client@1.3.0: + resolution: {integrity: sha512-EBw7Ag1hPgFzdznK2PBblc1kdlj5B5Cw3XwI9/oG7tSn85/HKy3X9xHy/8tm/eNXJYHLXHJL/pkwBpFMVVefkw==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.3.0 + dev: false + + /@redis/client/1.3.0: + resolution: {integrity: sha512-XCFV60nloXAefDsPnYMjHGtvbtHR8fV5Om8cQ0JYqTNbWcQo/4AryzJ2luRj4blveWazRK/j40gES8M7Cp6cfQ==} + engines: {node: '>=14'} + dependencies: + cluster-key-slot: 1.1.0 + generic-pool: 3.8.2 + yallist: 4.0.0 + dev: false + + /@redis/graph/1.0.1_@redis+client@1.3.0: + resolution: {integrity: sha512-oDE4myMCJOCVKYMygEMWuriBgqlS5FqdWerikMoJxzmmTUErnTRRgmIDa2VcgytACZMFqpAOWDzops4DOlnkfQ==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.3.0 + dev: false + + /@redis/json/1.0.4_@redis+client@1.3.0: + resolution: {integrity: sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.3.0 + dev: false + + /@redis/search/1.1.0_@redis+client@1.3.0: + resolution: {integrity: sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.3.0 + dev: false + + /@redis/time-series/1.0.3_@redis+client@1.3.0: + resolution: {integrity: sha512-OFp0q4SGrTH0Mruf6oFsHGea58u8vS/iI5+NpYdicaM+7BgqBZH8FFvNZ8rYYLrUO/QRqMq72NpXmxLVNcdmjA==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.3.0 + dev: false + + /@types/formidable/2.0.5: + resolution: {integrity: sha512-uvMcdn/KK3maPOaVUAc3HEYbCEhjaGFwww4EsX6IJfWIJ1tzHtDHczuImH3GKdusPnAAmzB07St90uabZeCKPA==} + dependencies: + '@types/node': 18.7.23 + dev: false + + /@types/node/18.7.23: + resolution: {integrity: sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==} + dev: false + + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /accepts/1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /asap/2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: false + + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /axios/0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /bignumber.js/9.0.0: + resolution: {integrity: sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==} + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-equal-constant-time/1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false + + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /cache-content-type/1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.3.2 + dev: false + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.3 + dev: false + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /cluster-key-slot/1.1.0: + resolution: {integrity: sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==} + engines: {node: '>=0.10.0'} + dev: false + + /co-body/5.2.0: + resolution: {integrity: sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==} + dependencies: + inflation: 2.0.0 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + dev: false + + /co-body/6.1.0: + resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} + dependencies: + inflation: 2.0.0 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + dev: false + + /co/4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type/1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + dev: false + + /cookies/0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: false + + /copy-to/2.0.1: + resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==} + dev: false + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /crypto/1.0.1: + resolution: {integrity: sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==} + deprecated: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in. + dev: false + + /debug/3.2.7_supports-color@5.5.0: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /deep-equal/1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: false + + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /delegates/1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /denque/2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: false + + /depd/1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + + /depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy/1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /dezalgo/1.0.3: + resolution: {integrity: sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==} + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: false + + /ecdsa-sig-formatter/1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /ee-first/1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /encodeurl/1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /escape-html/1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /follow-redirects/1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + + /form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /formidable/2.0.1: + resolution: {integrity: sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==} + dependencies: + dezalgo: 1.0.3 + hexoid: 1.0.0 + once: 1.4.0 + qs: 6.9.3 + dev: false + + /fresh/0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: false + + /generate-function/2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + dependencies: + is-property: 1.0.2 + dev: false + + /generic-pool/3.8.2: + resolution: {integrity: sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==} + engines: {node: '>= 4'} + dev: false + + /get-intrinsic/1.1.3: + resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: false + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + 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: false + + /hexoid/1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + dev: false + + /http-assert/1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: false + + /http-errors/1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: false + + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /humanize-number/0.0.2: + resolution: {integrity: sha512-un3ZAcNQGI7RzaWGZzQDH47HETM4Wrj6z6E4TId8Yeq9w5ZKUVB1nrT2jwFheTUjEmqcgTjXDc959jum+ai1kQ==} + dev: false + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ignore-by-default/1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /inflation/2.0.0: + resolution: {integrity: sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==} + engines: {node: '>= 0.8.0'} + dev: false + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-generator-function/1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-property/1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + dev: false + + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /jsonwebtoken/8.5.1: + resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} + engines: {node: '>=4', npm: '>=1.4.28'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 5.7.1 + dev: false + + /jwa/1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws/3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /keygrip/1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: false + + /koa-body/5.0.0: + resolution: {integrity: sha512-nHwEODrQGiyKBILCWO8QSS40C87cKr2cp3y/Cw8u9Z8w5t0CdSkGm3+y9WK5BIAlPpo9tTw5RtSbxpVyG79vmw==} + dependencies: + '@types/formidable': 2.0.5 + co-body: 5.2.0 + formidable: 2.0.1 + dev: false + + /koa-bodyparser/4.3.0: + resolution: {integrity: sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==} + engines: {node: '>=8.0.0'} + dependencies: + co-body: 6.1.0 + copy-to: 2.0.1 + dev: false + + /koa-compose/4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: false + + /koa-convert/2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: false + + /koa-logger/3.2.1: + resolution: {integrity: sha512-MjlznhLLKy9+kG8nAXKJLM0/ClsQp/Or2vI3a5rbSQmgl8IJBQO0KI5FA70BvW+hqjtxjp49SpH2E7okS6NmHg==} + engines: {node: '>= 7.6.0'} + dependencies: + bytes: 3.1.2 + chalk: 2.4.2 + humanize-number: 0.0.2 + passthrough-counter: 1.0.0 + dev: false + + /koa-router/12.0.0: + resolution: {integrity: sha512-zGrdiXygGYW8WvrzeGsHZvKnHs4DzyGoqJ9a8iHlRkiwuEAOAPyI27//OlhoWdgFAEIM3qbUgr0KCuRaP/TCag==} + engines: {node: '>= 12'} + dependencies: + http-errors: 2.0.0 + koa-compose: 4.1.0 + methods: 1.1.2 + path-to-regexp: 6.2.1 + dev: false + + /koa/2.13.4: + resolution: {integrity: sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.4 + cookies: 0.8.0 + debug: 4.3.4 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /lodash.includes/4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: false + + /lodash.isboolean/3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: false + + /lodash.isinteger/4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: false + + /lodash.isnumber/3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + dev: false + + /lodash.isplainobject/4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.isstring/4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: false + + /lodash.once/4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: false + + /long/4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /lru-cache/4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: false + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /media-typer/0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /methods/1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /mysql-import/5.0.21: + resolution: {integrity: sha512-B9aLfeHD4rmdp89a5P1iw4tr3sFzR0ARiDs4TqatVhvYVMiC60kWODWU8DpEwM/psBQbAvPiTgPbVQlOmlFMQQ==} + engines: {node: '>5.0.0'} + dependencies: + mysql: 2.18.1 + dev: true + + /mysql/2.18.1: + resolution: {integrity: sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==} + engines: {node: '>= 0.6'} + dependencies: + bignumber.js: 9.0.0 + readable-stream: 2.3.7 + safe-buffer: 5.1.2 + sqlstring: 2.3.1 + + /mysql2/2.3.3: + resolution: {integrity: sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==} + engines: {node: '>= 8.0'} + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 4.0.0 + lru-cache: 6.0.0 + named-placeholders: 1.1.2 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + dev: false + + /mysqls/1.2.2: + resolution: {integrity: sha512-YnQHb6oZ39r3IkeojYtdbpbJDVk7cp3MFV08ynqrRkN2TDNJEfIeVrnUeIevV5WBppEUqID8h+sZzaOKzZR8RQ==} + dependencies: + mysql2: 2.3.3 + sqlstring: 2.3.3 + dev: false + + /named-placeholders/1.1.2: + resolution: {integrity: sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==} + engines: {node: '>=6.0.0'} + dependencies: + lru-cache: 4.1.5 + dev: false + + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /nodemailer/6.8.0: + resolution: {integrity: sha512-EjYvSmHzekz6VNkNd12aUqAco+bOkRe3Of5jVhltqKhEsjw/y0PYPJfp83+s9Wzh1dspYAkUW/YNQ350NATbSQ==} + engines: {node: '>=6.0.0'} + dev: false + + /nodemon/2.0.20: + resolution: {integrity: sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7_supports-color@5.5.0 + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.0.7 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt/1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /object-inspect/1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + dev: false + + /on-finished/2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /only/0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: false + + /parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /passthrough-counter/1.0.0: + resolution: {integrity: sha512-Wy8PXTLqPAN0oEgBrlnsXPMww3SYJ44tQ8aVrGAI4h4JZYCS0oYqsPqtPR8OhJpv6qFbpbB7XAn0liKV7EXubA==} + dev: false + + /path-to-regexp/6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /pseudomap/1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: false + + /pstree.remy/1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /qs/6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /qs/6.9.3: + resolution: {integrity: sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==} + engines: {node: '>=0.6'} + dev: false + + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /readable-stream/2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /redis/4.3.1: + resolution: {integrity: sha512-cM7yFU5CA6zyCF7N/+SSTcSJQSRMEKN0k0Whhu6J7n9mmXRoXugfWDBo5iOzGwABmsWKSwGPTU5J4Bxbl+0mrA==} + dependencies: + '@redis/bloom': 1.0.2_@redis+client@1.3.0 + '@redis/client': 1.3.0 + '@redis/graph': 1.0.1_@redis+client@1.3.0 + '@redis/json': 1.0.4_@redis+client@1.3.0 + '@redis/search': 1.1.0_@redis+client@1.3.0 + '@redis/time-series': 1.0.3_@redis+client@1.3.0 + dev: false + + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + + /semver/7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /seq-queue/0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + dev: false + + /setprototypeof/1.2.0: + 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.3 + object-inspect: 1.12.2 + dev: false + + /simple-update-notifier/1.0.7: + resolution: {integrity: sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + + /sqlstring/2.3.1: + resolution: {integrity: sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==} + engines: {node: '>= 0.6'} + + /sqlstring/2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + dev: false + + /statuses/1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: false + + /statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /touch/3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tsscmp/1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: false + + /type-is/1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /undefsafe/2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /unpipe/1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /uuid/8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /vary/1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /yallist/2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: false + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /ylru/1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + dev: false diff --git a/01===sys22/baseSys/userSys/realization/reallization.dirname b/01===sys22/baseSys/userSys/realization/reallization.dirname new file mode 100644 index 0000000..e69de29 diff --git a/01===sys22/baseSys/userSys/realization/src/API/index.js b/01===sys22/baseSys/userSys/realization/src/API/index.js new file mode 100644 index 0000000..48a0074 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/src/API/index.js @@ -0,0 +1,1220 @@ +/** + * 接口请求API + * */ + +const DB = require('../Database/userBase') +// ==================================公共方法================================================= +//#region +// 用户名查重 +function TcheckOnly(crb) { + return new Promise(async (res, rej) => { + const field = 'uuid'; + const where = [ + {'username': crb.username?.trim().toLowerCase(), 'email': crb.email/*, 'phone': crb.phone, 'person': crb.person*/, _type: 'or'}, + {'status': 1, _type: 'and'} + ] + try { + const result = await DB.userInfo.SELECT(field, where) + if (result.length == 0) { + res(global.msg.success(crb, '此用户身份可用!')) + } else { + rej(global.msg.failed(crb, '该用户已存在!')) + } + } catch (e) { + rej(global.msg.failed(e, '查重用户时出现错误!')) + } + }) +} + +// 生成Token +function TmakeToken(uuid) { + return new Promise(async (res, rej) => { + const token = global.token.encrypt({ + uuid, + date: new Date().getTime() + }) + try { + global.Redis.setLogin(uuid, token) + res(token) + } catch (e) { + rej(e) + } + }) +} + +// 发送验证码 +function TsendCode(crb) { + return new Promise(async (res, rej) => { + let type = crb.type + type = type.trim() + if (['signUp', 'signIn', 'reset', 'writeoff'].indexOf(type) == -1) { + rej(global.msg.failed(crb, '不存在验证码请求类型!')) + return + } + type = type.replace(type[0], type.split("")[0].toUpperCase()) + const aSet = 'set' + type + 'Code' + const aGet = 'get' + type + 'Code' + const aDel = 'del' + type + 'Code' + + // 生成Code + const code = global.getStr(global.cfg.user.sign.length) + // 存Redis + // 查看是否存在 + try { + const nowTime = new Date().getTime() + const result = await global.Redis[aGet](crb.email) + // 存在 + if (nowTime - result.time > global.cfg.RedisJSON.timeout) { + // 过期 + await global.Redis[aDel](crb.email) + await global.Redis[aSet](crb.email, code) + global.mail.sendMail(crb.email, code, crb.type).then().catch(e => { + console.e(`发送${type}Code出现错误`, e) + }) + res(global.msg.success(crb, '发送验证码成功!')) + } else { + // 还可用 + rej(global.msg.failed(crb, '近期已发送了一封邮件,请稍后重试!')) + return + } + } catch (e) { + // 不存在,或者报错 + try { + await global.Redis[aSet](crb.email, code) + global.mail.sendMail(crb.email, code, crb.type).then().catch(e => { + console.e(`发送${type}Code邮件出现错误`, e) + }) + res(global.msg.success(crb, '发送验证码成功!')) + } catch (e) { + // 存储出现错误 + console.e(`写入${type}Code出现错误 `, e) + rej(global.msg.failed(crb, '发送验证码失败!')) + return + } + } + }) +} + +// 精简对象 +function CompactObjects(obj) { + for (let i in obj) { + if (!obj[i]) { + delete obj[i] + } + } +} + +// 获取密码 +function getPassword(uuid) { + return new Promise(async (res, rej) => { + try { + const field = 'password'; + const where = {uuid} + const order = 'id desc limit 1' + const result = await DB.userLogin.ORDER(field, where, order) + res(result[0].password) + } catch (e) { + rej(e) + } + }) +} + +// 获取个人角色列表 +function TgetPersonalRoleIdList(crb) { + const page = Math.abs(Number(crb.page) || 1) + , pageSize = Math.abs(Number(crb.pageSize) || 10) + , uuid = crb.uuid + return new Promise(async (res, rej) => { + const field = '*' + const limit = [(page - 1) * pageSize, page * pageSize] + const where = {uuid} + try { + const result = await DB.userRelationRole.LIMIT(field, limit, where) + const count = await DB.userRelationRole.COUNT('id', where) + res({data: result, count: count[0]['COUNT(id)'], page, pageSize}) + } catch (e) { + console.e(`获取个人角色列表失败,数据库错误`, e) + rej(e) + } + }) +} + +// 获取角色权限 +function TgetRoleAuthority(crb) { + return new Promise(async (res, rej) => { + if (!crb.roleId) { + res('缺少必要参数!'); + return + } + + try { + if(!crb.page && !crb.pageSize){ + const SQL = await DB.SQL.sql.query(`SELECT * from user_authority where id in (select authority_id from user_relation_authority where role_id = ${crb.roleId})`) + console.log(SQL) + console.log(await DB.SQL.exec('select authority_id from user_relation_authority where role_id = 6')) + const result2 = await DB.SQL.exec(SQL) + res(result2) + }else{ + const page = Math.abs(Number(crb.page) || 1) + , pageSize = Math.abs(Number(crb.pageSize) || 10) + , limit = [(page - 1) * pageSize, page * pageSize] + const SQL = await DB.SQL.sql.query(`SELECT * from user_authority where id in (select authority_id from user_relation_authority where role_id = ${crb.roleId}) LIMIT ${limit}`) + const COUNTSQL = await DB.SQL.sql.query(`SELECT COUNT(id) from user_authority where id in (select authority_id from user_relation_authority where role_id = ${crb.roleId}) LIMIT ${limit}`) + const result2 = await DB.SQL.exec(SQL) + const COUNTSQL_result = await DB.SQL.exec(COUNTSQL) + res({data:result2,count: COUNTSQL_result[0]['COUNT(id)'], page, pageSize}) + } + } catch (e) { + rej({message: '获取角色权限错误', e}) + } + }) +} + +// 删除权限 +function TdeleteAuthority(authList){ + return new Promise(async (res, rej) => { + try{ + const SQL = DB.SQL.sql.query(`DELETE FROM user_relation_authority WHERE authority_id in (${authList})`) + const result = await DB.SQL.exec(SQL); + res(result) + }catch (e) { + rej('删除权限关系表记录失败,数据库错误。') + console.e('删除权限关系表记录失败,数据库错误。', e) + } + }) +} + +// 删除角色 +function TdeleteRole(roleList){ + return new Promise(async (res, rej) => { + try{ + const SQL = DB.SQL.sql.query(`DELETE FROM user_relation_authority WHERE role_id in (${roleList})`) + const result = await DB.SQL.exec(SQL); + const roleSQL = DB.SQL.sql.query(`DELETE FROM user_relation_role WHERE role_id in (${roleList})`) + const resultRole = await DB.SQL.exec(roleSQL); + res() + }catch (e) { + console.e('删除角色关系表记录失败,数据库错误。', e) + rej('删除角色关系表记录失败',e) + } + }) +} + +//#endregion +// ======================================================================================== + +// ****************************************************登陆前接口******************************************************** +//#region +// 注册 +async function signUp(ctx) { + const crb = ctx.request.body; + crb.username = crb.username?.trim().toLowerCase() + crb.password = crb.password?.trim() + crb.code = crb.code?.trim() + crb.email = crb.email?.trim() + // 判断关键信息是否齐全 + try { + const result = await TcheckOnly(crb) + } catch (e) { + ctx.body = e + return + } + if (!crb.email) { + ctx.body = global.msg.failed(crb, '缺少关键信息,未找到邮箱!') + } else if (!crb.password || crb.password?.toString().trim().length < 8) { + ctx.body = global.msg.failed(crb, '密码未输入或密码长度过短!') + } else if (!crb.code) { + ctx.body = global.msg.failed(crb, '未找到邮箱验证!') + } else { + try { + const result = await global.Redis.getSignUpCode(crb.email) + if (result.code != crb.code?.toString().trim().toUpperCase() || new Date().getTime() - result.time > global.cfg.RedisJSON.timeout) { + // if(false){ + ctx.body = global.msg.failed(crb, '邮箱验证码不匹配!') + } else { + + const uuid = global.makeUUID() + const createtime = new Date().getTime() + // 用户表信息 + const userInfo = { + uuid: uuid, + username: crb.username, + person: crb.person, + phone: Number(crb.phone) || 0, + email: crb.email, + createtime + } + + // 登陆表信息 + const userLogin = { + uuid: uuid, + password: HASH(crb.password), + createtime + } + // 用户其他信息表信息 + const userInfoOther = { + uuid: uuid, + personal: crb.personal, + address: crb.address, + country: crb.country, + sex: Number(crb.sex) || 0, + birthday: Number(crb.birthday) || 0, + nickname: crb.nickname, + personal: crb.personal, + slogan: crb.slogan, + avatar: crb.avatar, + background: crb.background, + updatetime: createtime + } + + try { + await DB.userInfo.INSERT(userInfo) + await global.Redis.delSignUpCode(crb.email) + await DB.userInfoOther.INSERT(userInfoOther) + await DB.userLogin.INSERT(userLogin) + + try { + const token = await TmakeToken(uuid) + ctx.body = global.msg.success({ + tokenStatus: true, + token + }, '注册成功!') + } catch (e) { + ctx.body = global.msg.success({ + tokenStatus: false + }, '注册成功!') + } + } catch (e) { + console.dev(e) + ctx.body = global.msg.failed(crb, '注册失败!') + } + } + } catch (e) { + ctx.body = global.msg.failed(crb, '邮箱验证码不匹配!') + } + } + // username,email,phone,person + // 写用户信息 + // 加密密码 + // 写用户密码 + // 返回token +} +// 登录 +async function signIn(ctx) { + const crb = ctx.request.body; + crb.username = crb.username?.trim().toLowerCase() + crb.password = crb.password?.trim() + crb.code = crb.code?.trim() + crb.email = crb.email?.trim() + if (!crb.username && !crb.email) { + ctx.body = global.msg.failed(crb, '未找到关键用户信息!') + return + } else if (!crb.code && !crb.password) { + ctx.body = global.msg.failed(crb, '未找到关键验证信息!') + return + } else { + + try { + const field = ['email', 'uuid', 'status']; + const where = [ + {'username': crb.username, 'email': crb.email, _type: 'or'} + ] + const result = await DB.userInfo.SELECT(field, where) + if (result.length == 0) { + ctx.body = global.msg.failed(crb, '此用户信息不存在!') + return + } else { + if (result[0].status == 0) { + ctx.body = global.msg.failed(crb, '此用户信息不存在!') + return + } + crb.email = result[0].email + crb.uuid = result[0].uuid + } + } catch (e) { + ctx.body = global.msg.failed(crb, '查找用户信息失败!') + return + } + + if (crb.code) { + // 验证码登录 + try { + const nowTime = new Date().getTime() + const result = await global.Redis.getSignInCode(crb.email) + await global.Redis.delSignInCode(crb.email) + if (nowTime - result.time > global.cfg.RedisJSON.timeout) { + ctx.body = global.msg.failed(crb, '账户验证失败,验证码已过期!') + return + } + if (result.code != crb.code?.toString().trim().toUpperCase()) { + ctx.body = global.msg.failed(crb, '账户验证失败,验证码不匹配!') + return + } + // 获取Token,这里已经成功了 + } catch (e) { + // 未查到 + ctx.body = global.msg.failed(crb, '账户验证失败,验证码不匹配!') + return + } + } else if (crb.password) { + // 密码登录 + try { + const mustPassword = await getPassword(crb.uuid) + if (HASH(crb.password) != mustPassword) { + ctx.body = global.msg.failed(crb, '账户信息和密码不匹配!') + return + } + // 成功 + } catch (e) { + console.e('查找用户密码出错', e) + ctx.body = global.msg.failed(crb, '账户验证失败,系统错误!') + return + } + } + const token = await TmakeToken(crb.uuid) + ctx.body = global.msg.success({ + tokenStatus: true, + token + }, '登陆成功!') + } +} +// 找回密码 +async function reset(ctx) { + const crb = ctx.request.body; + crb.username = crb.username?.trim().toLowerCase() + crb.password = crb.password?.trim() + crb.code = crb.code?.toString().trim().toUpperCase() + crb.email = crb.email?.trim() + // 判断是否存在账户信息 + // 检查是否存在用户名或者密码 + if (!crb.username && !crb.email) { + ctx.body = global.msg.failed(crb, '未找到关键用户信息!') + return + } + // 判断是否存在新密码 + if (!crb.newpassword) { + ctx.body = global.msg.failed(crb, '缺少新密码!') + return + } + // 是否存在Code + if (!crb.code) { + ctx.body = global.msg.failed(crb, '不存在验证码!') + return + } + // 获取uuid + try { + const field = ['email', 'uuid', 'username']; + const where = [ + {'username': crb.username, 'email': crb.email, _type: 'or'} + ] + const result = await DB.userInfo.SELECT(field, where) + if (result.length == 0) { + ctx.body = global.msg.failed(crb, '此用户信息不存在!') + return + } else { + crb.email = result[0].email + crb.uuid = result[0].uuid + crb.username = result[0].username + } + } catch (e) { + ctx.body = global.msg.failed(crb, '查找用户信息失败!') + return + } + // 验证验证码信息 + try { + const nowTime = new Date().getTime() + const result = await global.Redis.getResetCode(crb.email) + if (nowTime - result.time > global.cfg.RedisJSON.timeout) { + ctx.body = global.msg.failed(crb, '账户验证失败,验证码已过期!') + return + } + if (result.code != crb.code?.toString().trim().toUpperCase()) { + ctx.body = global.msg.failed(crb, '账户验证失败,验证码不匹配!') + return + } + try { + await global.Redis.delResetCode(crb.email) + } catch (e) { + console.e('无法删除重置密码Code Redis', e) + ctx.body = global.msg.failed(crb, '账户验证失败,系统错误!') + } + + // 这里已经验证成功 + } catch (e) { + // 未查到 + console.e('查找重置密码Code失败,Redis', e) + ctx.body = global.msg.failed(crb, '账户验证失败,验证码不匹配!') + return + } + // 设置新的密码 + const userLogin = { + uuid: crb.uuid, + password: HASH(crb.newpassword), + createtime: new Date().getTime() + } + try { + await DB.userLogin.INSERT(userLogin) + ctx.body = global.msg.success({tokenStatus: false}, '找回账户成功') + } catch (e) { + console.e('创建新密码失败,重置密码', e) + ctx.body = global.msg.failed(crb, '账户验证失败,验证码不匹配!') + } +} +// 用户名查重 +async function checkOnly(ctx) { + const crb = ctx.request.query; + console.log(crb) + crb.username = crb.username?.trim().toLowerCase() + crb.password = crb.password?.trim() + crb.code = crb.code?.trim() + crb.email = crb.email?.trim() + try { + const result = await TcheckOnly(crb) + ctx.body = result + } catch (e) { + ctx.body = e + } +} +// 发送验证码 +async function sendCode(ctx) { + const crb = ctx.request.query; + crb.username = crb.username?.trim().toLowerCase() + crb.password = crb.password?.trim() + crb.code = crb.code?.trim() + crb.email = crb.email?.trim() + switch (crb.type) { + case 'signUp': + if (!crb.email || !global.mail.checkEmail(crb.email)) { + ctx.body = global.msg.failed(crb, '邮箱未输入,或格式异常!') + return + } + try { + await TcheckOnly({email: crb.email}) + } catch (e) { + ctx.body = global.msg.failed(crb, '此邮箱已存在!') + return + } + try { + const result = await TsendCode(crb) + ctx.body = result + } catch (e) { + ctx.body = e + } + // as12 + break + case 'signIn': + // 检查是否存在用户名或者密码 + if (!crb.username && !crb.email) { + ctx.body = global.msg.failed(crb, '未找到关键用户信息!') + return + } + // 获取Email + if (!crb.email) { + const field = 'email'; + const where = [{'username': crb.username}] + try { + const result = await DB.userInfo.SELECT(field, where) + if (result.length == 0) { + ctx.body = global.msg.failed(crb, '此用户信息不存在!') + return + } else { + crb.email = result[0].email + } + } catch (e) { + console.e(`查找${type}Code email出现错误:${crb.username}`, e) + ctx.body = global.msg.failed(crb, '查找用户信息失败!') + return + } + } + try { + const result = await TsendCode(crb) + ctx.body = result + } catch (e) { + ctx.body = e + } + break + case 'reset': + // 检查是否存在用户名或者密码 + if (!crb.username && !crb.email) { + ctx.body = global.msg.failed(crb, '未找到关键用户信息!') + return + } + // 获取Email + if (!crb.email) { + const field = 'email'; + const where = [{'username': crb.username}] + try { + const result = await DB.userInfo.SELECT(field, where) + if (result.length == 0) { + ctx.body = global.msg.failed(crb, '此用户信息不存在!') + return + } else { + crb.email = result[0].email + } + } catch (e) { + console.e(`查找${type}Code email出现错误:${crb.username}`, e) + ctx.body = global.msg.failed(crb, '查找用户信息失败!') + return + } + } + try { + const result = await TsendCode(crb) + ctx.body = result + } catch (e) { + ctx.body = e + } + break + case 'writeoff': + // 获取Email + if (!crb.email) { + const field = 'email'; + const where = [{'username': crb.username}] + try { + const result = await DB.userInfo.SELECT(field, where) + if (result.length == 0) { + ctx.body = global.msg.failed(crb, '此用户信息不存在!') + return + } else { + crb.email = result[0].email + } + } catch (e) { + console.e(`查找${type}Code email出现错误:${crb.username}`, e) + ctx.body = global.msg.failed(crb, '查找用户信息失败!') + return + } + } + try { + const result = await TsendCode(crb) + ctx.body = result + } catch (e) { + console.e(e.message) + ctx.body = e + } + break + default: + ctx.body = global.msg.failed(crb, '请求验证码失败,用途无法匹配!') + break + } +} +//#endregion +// -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*登陆前接口-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + + +// ####################################################登陆后用户信息接口################################################## +//#region +// 退出登录 +async function signOut(ctx) { + try { + await global.Redis.delLogin(ctx.uuid, ctx.token) + ctx.body = global.msg.success({}, '退出登陆成功!') + } catch (e) { + console.e('退出登陆失败 ', e) + ctx.body = global.msg.failed({}, '退出登陆失败!') + } +} +// 修改用户信息 +async function editUserinfo(ctx) { + const crb = ctx.request.body; + try { + const createtime = new Date().getTime() + // 用户表信息 + const userInfo = { + person: crb.person, + phone: Number(crb.phone) || 0, + createtime + } + // 用户其他信息表信息 + const userInfoOther = { + personal: crb.personal, + address: crb.address, + country: crb.country, + sex: crb.sex ? Number(crb.sex) || 0 : undefined, + birthday: crb.birthday ? Number(crb.birthday.toString().slice(0, 8)) || 0 : undefined, + nickname: crb.nickname, + personal: crb.personal, + slogan: crb.slogan, + avatar: crb.avatar, + background: crb.background, + updatetime: createtime + } + CompactObjects(userInfo) + CompactObjects(userInfoOther) + const where = {uuid: ctx.uuid} + await DB.userInfo.UPDATE(userInfo, where) + await DB.userInfoOther.UPDATE(userInfoOther, where) + ctx.body = global.msg.success({}, '修改信息成功!') + } catch (e) { + console.e('修改信息失败!', e) + ctx.body = global.msg.failed({e}, '修改信息失败!') + } +} +// 修改密码 +async function editPassword(ctx) { + const crb = ctx.request.body; + if (!crb.oldpassword || !crb.newpassword) { + ctx.body = global.msg.failed({}, '缺少关键信息!') + return + } else if (crb.oldpassword == crb.newpassword) { + ctx.body = global.msg.failed({}, '请保持新旧密码的差异性!') + return + } + try { + const mustPassword = await getPassword(ctx.uuid) + if (HASH(crb.oldpassword) != mustPassword) { + ctx.body = global.msg.failed({}, '原始密码不匹配!') + } else { + try { + // 登陆表信息 + const userLogin = { + uuid: ctx.uuid, + password: HASH(crb.newpassword), + createtime: new Date().getTime() + } + await DB.userLogin.INSERT(userLogin) + await signOut(ctx) + ctx.body = global.msg.success({}, '修改密码成功!') + } catch (e) { + console.e('写入用户新密码出错', e) + ctx.body = global.msg.failed({}, '修改密码出现意外,系统错误!') + return + } + } + } catch (e) { + console.e('查找用户密码出错', e) + ctx.body = global.msg.failed({}, '账户验证失败,系统错误!') + return + } +} +// 注销用户 +async function writeoff(ctx) { + const crb = ctx.request.body; + if (!crb.code) { + ctx.body = global.msg.failed({}, '缺少关键信息!') + return + } + const field = 'email'; + const where = [{'uuid': ctx.uuid}] + try { + const result = await DB.userInfo.SELECT(field, where) + console.log(result) + if (result.length == 0) { + ctx.body = global.msg.failed(crb, '此用户邮箱不存在!') + return + } else { + crb.email = result[0].email + } + } catch (e) { + console.e(`查找writeoffCode email出现错误:`, e) + ctx.body = global.msg.failed(crb, '查找用户邮箱失败!') + return + } + try { + const result = await global.Redis.getWriteoffCode(crb.email) + console.log(result) + if (result.code == crb.code || new Date().getTime() - result.time > global.cfg.RedisJSON.timeout) { + const data = { + status: 0, + } + const where = {uuid: ctx.uuid} + try { + await DB.userInfo.UPDATE(data, where) + } catch (e) { + console.e(e) + ctx.body = global.msg.failed(crb, '注销账户失败,系统错误!') + return + } + await signOut(ctx) + ctx.body = global.msg.success(crb, '注销账户成功!') + global.Redis.delWriteoffCode(crb.email) + } else { + ctx.body = global.msg.failed(crb, '注销账户的验证码不匹配!') + } + } catch (e) { + console.e(`无法匹配注销账户的验证码,系统错误:`, e) + if (e.toString().indexOf('not exist') > -1) { + ctx.body = global.msg.failed(crb, '注销账户的验证码不匹配!') + } else { + ctx.body = global.msg.failed(crb, '无法匹配注销账户的验证码,系统错误!') + } + } + +} +// 获取用户信息 +async function getuserInfo(ctx) { + const field = ['*']; + const where = [ + {'uuid': ctx.uuid} + ] + try{ + const result = await DB.userInfo.SELECT(field, where) + const result2 = await DB.userInfoOther.SELECT(field, where) + ctx.body = global.msg.success({userInfo: result[0], userInfoOther: result2[0]}, '获取用户信息成功!') + }catch (e) { + ctx.body = global.msg.failed(result, '获取用户信息失败!') + } +} + +//#endregion +// -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#登陆后用户信息接口-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# + +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^角色^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +//#region +// 创建角色 +async function createRole(ctx) { + const crb = ctx.request.body; + if (!crb.roleName || !crb.roleRemarks) { + ctx.body = global.msg.failed(crb, '缺少关键信息!') + return + } + const userRole = { + role_name: crb.roleName, + role_remarks: crb.roleRemarks + } + const field = '*' + const where = {...userRole, _type: 'or'} + try { + const result = await DB.userRole.SELECT(field, where) + if (result.length > 0) { + ctx.body = global.msg.failed(result, '创建角色失败,已存在相关角色信息!') + return + } + } catch (e) { + console.e('查重角色信息失败,数据库错误。', e) + ctx.body = global.msg.failed(crb, '创建角色失败,系统错误!') + return + } + try { + await DB.userRole.INSERT(userRole) + } catch (e) { + console.e('写入角色失败,数据库错误。', e) + ctx.body = global.msg.failed(crb, '创建角色失败,系统错误!') + return + } + ctx.body = global.msg.success(crb, '创建角色成功!') +} +// 删除角色 +async function deleteRoleList(ctx) { + const crb = ctx.request.body; + if (!crb.roleIdList) { + ctx.body = global.msg.failed(crb, '缺少关键信息!') + return + } + try { + if (!Array.isArray(crb.roleIdList)) { + const result = await DB.userRole.DELETE({id: Number(crb.roleIdList) || 0}) + } else { + const result = await DB.userRole.DELETEINID(crb.roleIdList.join(',')) + } + await TdeleteRole(crb.roleIdList) + ctx.body = global.msg.success({}, '删除角色成功!') + } catch (e) { + console.e('删除角色失败,数据库错误。', e) + ctx.body = global.msg.failed(crb, '删除角色失败,系统错误!') + } +} +// 修改角色信息 +async function editRole(ctx) { + const crb = ctx.request.body; + if (!crb.roleId || !crb.roleName || !crb.roleRemarks) { + ctx.body = global.msg.failed(crb, '缺少关键信息!') + return + } + const userRole = { + role_name: crb.roleName, + role_remarks: crb.roleRemarks + } + const where = {id: crb.roleId} + + const field = '*' + const where2 = {...userRole, _type: 'or'} + try { + const result = await DB.userRole.SELECT(field, where2) + if (result.length <= 1 && result[0]?.id == crb.roleId) { + ctx.body = global.msg.failed(result, '修改角色信息失败,已存在相关角色信息!') + return + } else if (result.length > 1) { + ctx.body = global.msg.failed(result, '创建角色信息失败,已存在相关权限信息!') + return + } + } catch (e) { + console.e('查重角色信息失败,数据库错误。', e) + ctx.body = global.msg.failed(crb, '修改角色信息失败,系统错误!') + return + } + try { + await DB.userRole.UPDATE(userRole, where) + ctx.body = global.msg.success({}, '修改角色信息成功!') + } catch (e) { + console.e('修改角色信息失败,数据库错误', e) + ctx.body = global.msg.failed({}, '修改角色信息失败,系统错误!') + } +} +// 获取全部角色列表 +async function getAllRoleList(ctx) { + const crb = ctx.request.query; + const page = Math.abs(Number(crb.page) || 0) + , pageSize = Math.abs(Number(crb.pageSize) || 10) + + const field = '*' + const limit = [page * pageSize, (page + 1) * pageSize] + const where = '' + try { + const result = await DB.userRole.LIMIT(field, limit, where) + const count = await DB.userRole.COUNT('id', where) + ctx.body = global.msg.success({data: result, count: count, page, pageSize}, '获取全部角色列表成功!') + } catch (e) { + console.e(`获取全部角色列表失败,数据库错误`, e) + ctx.body = global.msg.failed({}, '获取全部角色列表失败,系统错误!') + } +} +// 获取个人角色列表 +async function getPersonalRoleIdList(ctx) { + const crb = ctx.request.query; + if (!crb.uuid) { + ctx.body = global.msg.failed(crb, '缺少必要参数!') + return + } + try { + const result = await TgetPersonalRoleIdList(crb) + ctx.body = global.msg.success(result, '获取个人角色列表成功!') + } catch (e) { + ctx.body = global.msg.failed({}, '获取个人角色列表失败,系统错误!') + } +} +// 添加用户角色关联 +async function addRoleAndUserRelation(ctx) { + const crb = ctx.request.body; + if (!crb.uuidList || !crb.roleIdList) { + ctx.body = global.msg.failed(crb, '缺少必要参数!') + return + } + if (!Array.isArray(crb.uuidList) || !Array.isArray(crb.roleIdList)) { + ctx.body = global.msg.failed(crb, '参数类型必须为数组!') + return + } + const roleRelationList = [] + for (let i of (crb.uuidList)) { + for (let j of crb.roleIdList) { + roleRelationList.push({uuid: i, role_id: j}) + } + } + try{ + // 查重 + const exist = DB.SQL.sql.query(`SELECT * from user_relation_role where (uuid, role_id) in (${(DB.SQL.sql.table('b').data(roleRelationList).insert()).split('VALUES ')[1]})`) + const check = await DB.SQL.exec(exist) + if(check.length !=0){ + let deleteList = [] + for(let i in roleRelationList){ + for(let j of check){ + if(roleRelationList[i].uuid == j.uuid && roleRelationList[i].role_id == j.role_id){ + deleteList.push(i) + } + } + } + deleteList = deleteList.reverse() + for(let i of deleteList){ + roleRelationList.splice(i, 1) + } + } + }catch (e) { + console.e('添加用户角色关联失败,查重失败,数据库错误', e) + ctx.body = global.msg.failed({}, '添加用户角色关联失败,系统错误!') + } + try { + if(roleRelationList.length != 0){ + await DB.userRelationRole.INSERT(roleRelationList) + } + ctx.body = global.msg.success({}, '添加用户角色关联成功!') + } catch (e) { + console.e('添加用户角色关联失败,数据库错误', e) + ctx.body = global.msg.failed({}, '添加用户角色关联失败,系统错误!') + } +} +// 删除用户角色关联 +async function romoveRoleAndUserRelation(ctx) { + const crb = ctx.request.body; + if (!crb.roleRelationIdList) { + ctx.body = global.msg.failed(crb, '缺少必要参数!') + return + } + if (!Array.isArray(crb.roleRelationIdList)) { + ctx.body = global.msg.failed(crb, '参数类型必须为数组!') + return + } + try { + await DB.userRelationRole.DELETEINID(crb.roleRelationIdList.join(',')) + ctx.body = global.msg.success({}, '删除用户角色关联成功!') + } catch (e) { + console.log('添加用户角色关联失败,数据库错误', e) + ctx.body = global.msg.failed({}, '删除用户角色关联失败,系统错误!') + } +} +//#endregion +// -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^角色-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^- + +// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@权限@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +//#region +// 创建权限 +async function createAuthority(ctx) { + const crb = ctx.request.body; + if (!crb.authorityName + || !crb.type + || !crb.authorityRemarks) { + ctx.body = global.msg.failed(crb, '缺少必要参数!') + return + } + const userAuthority = { + authority_name: crb.authorityName, + type: Number(crb.type) || 0, + grade: Number(crb.grade) || -1, + sequence: Number(crb.sequence) || 99, + authority_remarks: crb.authorityRemarks, + } + const field = '*' + const userAuthorityCheck = { + authority_name: crb.authorityName, + authority_remarks: crb.authorityRemarks, + } + try { + const result = await DB.userAuthority.SELECT(field, userAuthorityCheck) + if (result.length > 0) { + ctx.body = global.msg.failed(result, '创建权限失败,已存在相关权限信息!') + return + } + } catch (e) { + console.e('查重权限信息失败,数据库错误。', e) + ctx.body = global.msg.failed(crb, '创建权限失败,系统错误!') + return + } + try { + await DB.userAuthority.INSERT(userAuthority) + ctx.body = global.msg.success({}, '创建权限成功!') + } catch (e) { + console.log('创建权限失败,数据库错误', e) + ctx.body = global.msg.failed({}, '创建权限失败,系统错误!') + } +} + +// 删除权限 +async function romveAuthority(ctx) { + const crb = ctx.request.body; + if (!crb.authorityIdList) { + ctx.body = global.msg.success(crb, '缺少必要参数!') + return + } + if (!Array.isArray(crb.authorityIdList)) { + ctx.body = global.msg.success(crb, '参数类型错误!') + return + } + try { + const result = await DB.userAuthority.DELETEINID(crb.authorityIdList.join(',')) + await TdeleteAuthority(crb.authorityIdList) + ctx.body = global.msg.success({}, '删除权限成功!') + } catch (e) { + console.e('删除权限失败,数据库错误。', e) + ctx.body = global.msg.failed(crb, '删除权限失败,系统错误!') + } +} + +// 修改权限信息 +async function editAuthority(ctx) { + const crb = ctx.request.body; + if (!crb.authorityId || !crb.authorityName || !crb.type || !crb.authorityRemarks) { + ctx.body = global.msg.failed(crb, '缺少关键信息!') + return + } + const userAuthority = { + authority_name: crb.authorityName, + type: Number(crb.type) || 0, + grade: Number(crb.grade) || -1, + sequence: Number(crb.sequence) || 99, + authority_remarks: crb.authorityRemarks, + } + const where = {id: crb.authorityId} + const userAuthorityCheck = { + authority_name: crb.authorityName, + authority_remarks: crb.authorityRemarks, + } + try { + const result = await DB.userAuthority.SELECT(field, userAuthorityCheck) + if (result.length <= 0 && result[0]?.id == crb.authorityId) { + ctx.body = global.msg.failed(result, '创建权限失败,已存在相关权限信息!') + return + } else if (result.length > 1) { + ctx.body = global.msg.failed(result, '创建权限失败,已存在相关权限信息!') + return + } + } catch (e) { + console.e('查重权限信息失败,数据库错误。', e) + ctx.body = global.msg.failed(crb, '创建权限失败,系统错误!') + return + } + try { + await DB.userAuthority.UPDATE(userAuthority, where) + ctx.body = global.msg.success({}, '修改权限信息成功!') + } catch (e) { + console.e('修改权限信息失败,数据库错误', e) + ctx.body = global.msg.failed({}, '修改权限信息失败,系统错误!') + } + +} + +// 获取所有权限 +async function getAllAuthority(ctx) { + const crb = ctx.request.query; + ctx.body = global.msg.success(crb, '缺少必要参数!') + const page = Math.abs(Number(crb.page) || 0) + , pageSize = Math.abs(Number(crb.pageSize) || 10) + + const field = '*' + const limit = [page * pageSize, (page + 1) * pageSize] + const where = '' + try { + const result = await DB.userAuthority.LIMIT(field, limit, where) + const count = await DB.userAuthority.COUNT('id', where) + ctx.body = global.msg.success({data: result, count: count, page, pageSize}, '获取所有权限列表成功!') + } catch (e) { + console.e(`获取所有权限列表失败,数据库错误`, e) + ctx.body = global.msg.failed({}, '获取所有权限列表失败,系统错误!') + } +} + +// 添加角色权限关系 +async function addAuthorityAndRoleRelation(ctx) { + const crb = ctx.request.body; + if (!crb.authorityIdList || !crb.roleIdList) { + ctx.body = global.msg.failed(crb, '缺少必要参数!') + return + } + if (!Array.isArray(crb.authorityIdList) || !Array.isArray(crb.roleIdList)) { + ctx.body = global.msg.failed(crb, '参数类型必须为数组!') + return + } + const authorityRelationList = [] + for (let i of (crb.roleIdList)) { + for (let j of crb.authorityIdList) { + authorityRelationList.push({role_id: i, authority_id: j}) + } + } + try{ + // 查重 + const SQL = DB.SQL.sql.table('user_relation_authority').data(authorityRelationList).insert().split('VALUES ')[1] + const checkSQL = DB.SQL.sql.query(`select * from user_relation_authority where (role_id, authority_id) in (${SQL})`) + const check = await DB.SQL.exec(checkSQL); + if(check.length !=0){ + let deleteList = [] + for(let i in authorityRelationList){ + for(let j of check){ + if(authorityRelationList[i].role_id == j.role_id && authorityRelationList[i].authority_id == j.authority_id){ + deleteList.push(i) + } + } + } + deleteList = deleteList.reverse() + for(let i of deleteList){ + authorityRelationList.splice(i, 1) + } + } + }catch (e) { + ctx.body = global.msg.failed({}, '添加角色权限关联失败,系统错误!') + console.e('添加角色权限关联失败,查重错误,数据库错误', e) + } + try { + if(authorityRelationList.length != 0){ + await DB.userRelationAuthority.INSERT(authorityRelationList) + } + ctx.body = global.msg.success({}, '添加角色权限关联成功!') + } catch (e) { + console.e('添加角色权限关联失败,数据库错误', e) + ctx.body = global.msg.failed({}, '添加角色权限关联失败,系统错误!') + } + +} + +// 删除角色权限关联 +async function removeAuthorityAndRoleRelation(ctx) { + const crb = ctx.request.body; + if (!crb.authorityRelationIdList) { + ctx.body = global.msg.failed(crb, '缺少必要参数!') + return + } + if (!Array.isArray(crb.authorityRelationIdList)) { + ctx.body = global.msg.failed(crb, '参数类型必须为数组!') + return + } + try { + await DB.userRelationRole.DELETEINID(crb.authorityRelationIdList.join(',')) + ctx.body = global.msg.success({}, '删除角色权限关联成功!') + } catch (e) { + console.e('添加角色权限关联失败,数据库错误', e) + ctx.body = global.msg.failed({}, '删除角色权限关联失败,系统错误!') + } +} + +// 清空当前权限的所有使用角色 +async function clearAuthorityRole(ctx) { + const crb = ctx.request.body; + if (!crb.authorityId) { + ctx.body = global.msg.success(crb, '缺少必要参数!') + } + const where = {authority_id: crb.authorityId} + try { + await DB.userRelationAuthority.DELETE(where) + ctx.body = global.msg.success({}, '清空权限所有使用角色成功!') + } catch (e) { + console.log('清空权限所有使用角色失败,数据库错误', e) + ctx.body = global.msg.failed({}, '清空权限所有使用角色失败,系统错误!') + } + +} + +// 获取角色权限 +async function getRoleAuthority(ctx) { + const crb = ctx.request.query; + try { + const result = await TgetRoleAuthority(crb) + console.log(result) + ctx.body = global.msg.success(result, '获取角色权限成功!') + } catch (err) { + const {message, e} = err; + console.e('查找角色权限错误,数据库错误!', e) + ctx.body = global.msg.failed(crb, '查找角色权限错误,系统错误!') + } + +} + +//#endregion +// -@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@权限@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@ + +module.exports = { + // 登陆前---------------------- + signUp, + signIn, + reset, + checkOnly, + sendCode, + // 登陆后---------------------- + // 用户信息侧¥¥¥¥¥¥¥¥¥¥¥¥ + signOut, + editUserinfo, + editPassword, + writeoff, + getuserInfo, + // 角色 ^^^^^^^^^^^^^^^^^^^^^^^ + createRole, + deleteRoleList, + editRole, + getAllRoleList, + getPersonalRoleIdList, + addRoleAndUserRelation, + romoveRoleAndUserRelation, + // 权限 + createAuthority, + romveAuthority, + editAuthority, + getAllAuthority, + addAuthorityAndRoleRelation, + removeAuthorityAndRoleRelation, + clearAuthorityRole, + getRoleAuthority, +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/src/Database/initDatabase.js b/01===sys22/baseSys/userSys/realization/src/Database/initDatabase.js new file mode 100644 index 0000000..b797575 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/src/Database/initDatabase.js @@ -0,0 +1,73 @@ +const { createConnectionNull, createConnectionDatabase } = require('../../tools/database/createConnection') + , config = require('../../config/default.config') + , Importer = require('mysql-import') + +// 创建数据库 +function createDatabase(){ + return new Promise(async (rec, rej) => { + try { + const result = await createConnectionNull() + try{ + const SQL = `Create Database If Not Exists ?? Character Set UTF8;` + const params = config.DATABASE_INIT.database + result.connect.query(SQL, params,async (err,data) => { + if(err){ + rej({ + status:false, + message:'数据库创建失败。', + code:err.code, + errno:err.errno, + sqlMessage:err.sqlMessage + }) + }else{ + result.connect.destroy() + rec({ + status:true, + message:'数据库创建成功。', + // data + }) + } + }) + }catch (e){ + rej(e) + } + }catch (e){ + rej(e) + } + }) +} + +// 创建表,这里使用的是SQL文件导入 +function createTables(){ + return new Promise(async (rec, rej) => { + const importer = new Importer({ + host: config.DATABASE_INIT.host, + user: config.DATABASE_INIT.user, + password: config.DATABASE_INIT.password, + database: config.DATABASE_INIT.database + }); + importer.import(config.DATABASE_INIT.sqlFile).then(()=>{ + const files_imported = importer.getImported(); + rec({ + status: true, + message: '数据表创建成功。', + SQLfile:files_imported + }) + }).catch(err=>{ + console.error(err); + rej({ + status: false, + message: '数据表创建失败。', + code: err.code, + errno: err.errno, + sqlMessage: err.sqlMessage + }) + }); + }) +} + + +module.exports = { + createDatabase, + createTables +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/src/Database/userBase.js b/01===sys22/baseSys/userSys/realization/src/Database/userBase.js new file mode 100644 index 0000000..870fcd6 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/src/Database/userBase.js @@ -0,0 +1,135 @@ +/** + * 数据操作的方法封装 + * */ +const {init, exec, sql, transaction} = require('mysqls') +const config = require("../../config/default.config"); + +init({ + host: config.DATABASE_INIT.host, + user: config.DATABASE_INIT.user, + password: config.DATABASE_INIT.password, + database: config.DATABASE_INIT.database, + port: config.DATABASE_INIT.port, +}) + + +function INSERT(table, data) { + return sql + .table(table) + .data(data) + .insert() +} + +function DELETE(table, data) { + return sql + .table(table) + .where(data) + .delet(); +} + +function UPDATE(table, data, where) { + return sql + .table(table) + .data(data) + .where(where) + .update() +} + +function SELECT(table, field, where) { + return sql + .table(table) + .field(field) + .where(where) + .select() +} + +function ORDER(table, field, where, order){ + return sql + .table(table) + .field(field) + .where(where) + .order(order) + .select() +} + +function LIMIT(table, field, limit, where){ + return sql + .table(table) + .field(field) + .limit(limit) + .where(where) + .select() +} + +function COUNT(table,count, where){ + return sql + .count(count) + .table(table) + .where(where) + .select() +} + +const table = { + userInfo:'user_info', + userInfoOther:'user_info_other', + userLogin:'user_login', + userRole:'user_role', + userAuthority:'user_authority', + userRelationRole:'user_relation_role', + userRelationAuthority:'user_relation_authority' +} + +const DB = { + SQL:{ + exec, sql + } +} +for(let i in table){ + DB[i] = (() => { + return { + INSERT(data){ + const SQL = INSERT(table[i],data) + console.e(SQL); + return exec(SQL) + }, + DELETE(data){ + const SQL = DELETE(table[i],data) + console.e(SQL); + return exec(SQL) + }, + // 批量删除ID关键段 + DELETEINID(data){ + const SQL = `DELETE FROM ${table[i]} WHERE id in (${data})` + console.e(SQL); + return exec(SQL) + }, + UPDATE(data, where){ + const SQL = UPDATE(table[i], data, where) + console.e(SQL); + return exec(SQL) + }, + SELECT(field, where){ + const SQL = SELECT(table[i], field, where) + console.e(SQL); + return exec(SQL) + }, + ORDER(field, where, order){ + const SQL = ORDER(table[i], field, where, order) + console.e(SQL) + return exec(SQL) + }, + LIMIT(field, limit, where){ + const SQL = LIMIT(table[i], field, limit, where) + console.e(SQL) + return exec(SQL) + }, + COUNT(count, where){ + const SQL = COUNT(table[i], count, where) + console.e(SQL) + return exec(SQL) + } + } + })() +} + +module.exports = DB \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/src/Routes/index.js b/01===sys22/baseSys/userSys/realization/src/Routes/index.js new file mode 100644 index 0000000..4cc0e41 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/src/Routes/index.js @@ -0,0 +1,41 @@ +// 用户登陆表 +const router = require('koa-router')(); + +// 全局路由 +router.prefix('/api') + +router.use( + // 用户系统 + require('./user/index'), + // 测试系统 + require('./test/index'), +) +router.get('/', async ctx => { + ctx.body = 'sys22_userSys API!' +}) + +module.exports = router + +/** + * + router.get('/', async ctx => { + console.log('query'.green, ctx.query) + // console.log('body'.green, ctx.request.body) + // Get请求只能传Query参数,POST可以传Query和Body(常用)两种形式的参数。 + ctx.body = 'Hello World'; +}) + router.post('/', async ctx => { + console.log('query'.green, ctx.query) + console.log('body'.green, ctx.request.body) + ctx.body = 'Hello World'; +}) + + // 调用router.routes()来组装匹配好的路由,返回一个合并好的中间件 + // 调用router.allowedMethods()获得一个中间件,当发送了不符合的请求时,会返回 `405 Method Not Allowed` 或 `501 Not Implemented` + app.use(router.routes()); + app.use(router.allowedMethods({ + // throw: true, // 抛出错误,代替设置响应头状态 + // notImplemented: () => '不支持当前请求所需要的功能', + // methodNotAllowed: () => '不支持的请求方式' +})); + * */ \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/src/Routes/test/index.js b/01===sys22/baseSys/userSys/realization/src/Routes/test/index.js new file mode 100644 index 0000000..442ef21 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/src/Routes/test/index.js @@ -0,0 +1,18 @@ +const router = require('koa-router')(); + +router.prefix('/test') + +router.get('/', function (ctx, next) { + ctx.body = 'this is a testes response!' +}) +router.post('/', function (ctx, next) { + console.log(ctx.request.body) + ctx.body = 'this is a testes response!' +}) + +router.get('/bar', function (ctx, next) { + ctx.body = 'this is a testes/bar response' +}) + +// 这里必须要使用router.routes(),多层嵌套 +module.exports = router.routes() \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/src/Routes/user/authority.js b/01===sys22/baseSys/userSys/realization/src/Routes/user/authority.js new file mode 100644 index 0000000..a68ddae --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/src/Routes/user/authority.js @@ -0,0 +1,27 @@ +/** + * 登陆后操作 + * */ + +const router = require('koa-router')(); +const api = require('../../API/index') + +router.prefix('/authority') + +// 创建权限 +router.post('/createAuthority', api.createAuthority) +// 删除权限 +router.del('/romveAuthority', api.romveAuthority) +// 修改权限信息 +router.put('/editAuthority', api.editAuthority) +// 获取所有权限 +router.get('/getAllAuthority', api.getAllAuthority) +// 添加角色权限关系 +router.post('/relation/addAuthorityAndRoleRelation', api.addAuthorityAndRoleRelation) +// 删除角色权限关联 +router.post('/relation/removeAuthorityAndRoleRelation', api.removeAuthorityAndRoleRelation) +// 清空当前权限的所有使用角色 +router.post('/relation/clearAuthorityRole', api.clearAuthorityRole) +// 获取角色权限 +router.get('/getRoleAuthority', api.getRoleAuthority) + +module.exports = router.routes() \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/src/Routes/user/index.js b/01===sys22/baseSys/userSys/realization/src/Routes/user/index.js new file mode 100644 index 0000000..8038ce1 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/src/Routes/user/index.js @@ -0,0 +1,20 @@ +const router = require('koa-router')(); + +router.prefix('/user') + +router.get('/', async ctx => { + ctx.body = '/API/user' +}) +router.use( + // 登陆前操作 + require('./will'), + // // 账户操作 + require('./signed'), + // // 角色 + require('./role'), + // // 权限 + require('./authority') +) + +// 这里必须要使用router.routes(),多层嵌套 +module.exports = router.routes() \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/src/Routes/user/role.js b/01===sys22/baseSys/userSys/realization/src/Routes/user/role.js new file mode 100644 index 0000000..d11f151 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/src/Routes/user/role.js @@ -0,0 +1,25 @@ +/** + * 登陆后操作 + * */ + +const router = require('koa-router')(); +const api = require('../../API/index') + +router.prefix('/role') + +// 创建角色 +router.post('/createRole', api.createRole) +// 删除角色 +router.del('/deleteRoleList', api.deleteRoleList) +// 修改角色信息 +router.put('/editRole', api.editRole) +// 获取全部角色列表 +router.get('/getAllRoleList', api.getAllRoleList) +// 获取个人角色列表 +router.get('/getPersonalRoleIdList', api.getPersonalRoleIdList) +// 添加用户角色关联 +router.post('/relation/addRoleAndUserRelation', api.addRoleAndUserRelation) +// 删除用户角色关联 +router.post('/realtion/romoveRoleAndUserRelation', api.romoveRoleAndUserRelation) + +module.exports = router.routes() \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/src/Routes/user/signed.js b/01===sys22/baseSys/userSys/realization/src/Routes/user/signed.js new file mode 100644 index 0000000..f845d9b --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/src/Routes/user/signed.js @@ -0,0 +1,21 @@ +/** + * 登陆后操作 + * */ + +const router = require('koa-router')(); +const api = require('../../API/index') + +router.prefix('/signed') + +// 退出登录 +router.get('/signOut', api.signOut) +// 修改用户信息 +router.put('/editUserinfo', api.editUserinfo) +// 修改密码 +router.put('/editPassword', api.editPassword) +// 注销用户 +router.post('/writeoff', api.writeoff) +// 获取用户信息 +router.get('/getuserInfo', api.getuserInfo) + +module.exports = router.routes() \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/src/Routes/user/will.js b/01===sys22/baseSys/userSys/realization/src/Routes/user/will.js new file mode 100644 index 0000000..2affdf7 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/src/Routes/user/will.js @@ -0,0 +1,20 @@ +/** + * 登录前操作 + * */ +const router = require('koa-router')(); +const api = require('../../API/index') + +router.prefix('/will') + +// 注册 +router.post('/signUp', api.signUp) +// 登录 +router.post('/signIn', api.signIn) +// 找回密码 +router.post('/reset', api.reset) +// 用户名查重 +router.get('/checkOnly', api.checkOnly) +// 发送验证码 +router.get('/sendCode', api.sendCode) + +module.exports = router.routes() \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/test/redisjson.js b/01===sys22/baseSys/userSys/realization/test/redisjson.js new file mode 100644 index 0000000..ef62dbd --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/test/redisjson.js @@ -0,0 +1,31 @@ +const { createClient } = require('redis'); + +async function redisJSONDemo() { + try { + const TEST_KEY = 'test_node'; + + const client = createClient({ + url: 'redis://uair.cc:6379' + }); + await client.connect(); + + await client.json.set('signUpCode','$',{}) + await client.json.set('signUpCode','expressgy',{code:'9527',time:new Date().getTime()}) + await client.json.set('signUpCode','expressnie',{code:'9527',time:new Date().getTime()}) + await client.json.set('signUpCode','admin',{code:'9527',time:new Date().getTime(),name:"何夕"}) + await client.json.set('signUpCode','张良',{code:'9527',time:new Date().getTime(),name:"何夕"}) + const value = await client.json.get('signUpCode'); + // , { + // // JSON Path: .node = the element called 'node' at root level. + // path: 'pets[0].name', + // } + + console.log(value); + + await client.quit(); + } catch (e) { + console.error(e); + } +} + +redisJSONDemo(); \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/test/testDelToken.js b/01===sys22/baseSys/userSys/realization/test/testDelToken.js new file mode 100644 index 0000000..62b6271 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/test/testDelToken.js @@ -0,0 +1,22 @@ +const { createClient } = require('redis'); + +async function redisJSONDemo() { + try { + const TEST_KEY = 'test_node'; + + const client = createClient({ + url: 'redis://uair.cc:6379' + }); + await client.connect(); + + await client.set('4afcef91d5b45a965bcd4ffbd15b3af3','$') + console.log(await client.get('4afcef91d5b45a965bcd4ffbd15b3af3')) + console.log(await client.del('a76cb34121b5d327ae28ec56469ef6df9b2c16392bee476a4ea69314d57d36403b568654f53e89b473f631b547c2dd4ddb7d721a2f1192d999010a1fe214422dc67f4d1d5248dd86b3cc0acdeba15a89f8a60063d9e20e8d1f2f5b3777cebda3969e1d5f0cc7d7d920b1ac58617f4d832bf58311d9fd077aa16648f4b17f86bb50a37eefe369bf07d1f8cd624bd1ed6fa8dfb6c732a1487b1dbcd98541e8ce0922ace0050a485a3194d5fa823f3e43a2214ccac8c34362006ef90eae0afa89b9efba3e6902e22bd9a9071d79d46429e5be0fae3c381ff14728665c6435cf3b0d')) + + await client.quit(); + } catch (e) { + console.error(e); + } +} + +redisJSONDemo(); \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/test/testRedis.js b/01===sys22/baseSys/userSys/realization/test/testRedis.js new file mode 100644 index 0000000..c01e2ce --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/test/testRedis.js @@ -0,0 +1,35 @@ +// ===============================================UUID && Token======================================================== +// +// async function test() { +// const R = await Redis() +// await R.setLogin('uuid1', 'token11') +// await R.setLogin('uuid1', 'token12') +// await R.setLogin('uuid1', 'token13') +// await R.setLogin('uuid1', 'token14') +// await R.setLogin('uuid1', 'token15') +// console.log(await R.getLogin('uuid1')) +// await R.delLogin('uuid1', 'token15') +// console.log(await R.getLogin('uuid1')) +// // await R.setLogin('uuid1', 'token16') +// // await R.setLogin('uuid1', 'token17') +// // await R.setLogin('uuid1', 'token18') +// // await R.setLogin('uuid1', 'token19') +// // await R.setLogin('uuid1', 'token10') +// // await R.setLogin('uuid2', 'token21') +// // await R.setLogin('uuid2', 'token22') +// // await R.setLogin('uuid2', 'token273') +// // await R.setLogin('uuid2', 'token23') +// // await R.setLogin('uuid2', 'token24') +// // await R.setLogin('uuid2', 'token25') +// // await R.setLogin('uuid2', 'token26') +// // await R.setLogin('uuid2', 'token27') +// // await R.setLogin('uuid2', 'token28') +// // await R.clearLoginArr() +// // console.log(await R.getToken('token21')); +// // console.log(await R.getLogin('uuid1')); +// // console.log(await R.getLogin('uuid2')); +// // console.log('end') +// } + + +// test() \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/test/testTime.js b/01===sys22/baseSys/userSys/realization/test/testTime.js new file mode 100644 index 0000000..c3dc5b2 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/test/testTime.js @@ -0,0 +1,13 @@ + +console.time(0) +var timestamp = timestamp=new Date() +console.timeEnd(0) + + +console.time(1) +var timestamp1 = timestamp.valueOf(); +console.timeEnd(1) + +console.time(2) +var timestamp2 = timestamp.getTime(); +console.timeEnd(2) \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/test/testToken.js b/01===sys22/baseSys/userSys/realization/test/testToken.js new file mode 100644 index 0000000..9b47ef7 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/test/testToken.js @@ -0,0 +1,11 @@ +const token = require('../tools/user/token') + +const a = token.encrypt({user:'xsxsxs'}, 3) + +console.log(a) + +setTimeout(() => { + const b = token.decrypt(a) + + console.log(b) +},2000) diff --git a/01===sys22/baseSys/userSys/realization/test/trimr.js b/01===sys22/baseSys/userSys/realization/test/trimr.js new file mode 100644 index 0000000..c97731d --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/test/trimr.js @@ -0,0 +1,3 @@ +const a = " asxasxas " +console.log(a); +console.log(a.trim()); \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/test/连表查询.js b/01===sys22/baseSys/userSys/realization/test/连表查询.js new file mode 100644 index 0000000..b33b26e --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/test/连表查询.js @@ -0,0 +1,21 @@ +/** + * 数据操作的方法封装 + * */ +const {init, exec, sql, transaction} = require('mysqls') +const config = require("../config/default.config"); + +init({ + host: config.DATABASE_INIT.host, + user: config.DATABASE_INIT.user, + password: config.DATABASE_INIT.password, + database: config.DATABASE_INIT.database, + port: config.DATABASE_INIT.port, +}) + + +let sqlstring = sql.field('authority_id').table('user_relation_authority').where({role_id:4}).select() +let SQQ = sql.query(`SELECT * from user_authority where id in (${sqlstring})`) +console.log(SQQ) +exec(SQQ).then(res => { + console.log(res) +}) \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/tools/RandomString.js b/01===sys22/baseSys/userSys/realization/tools/RandomString.js new file mode 100644 index 0000000..ce77cbe --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/tools/RandomString.js @@ -0,0 +1,10 @@ +function getStr(len, size='big'){ + if(size == 'big'){ + return Math.random().toString(36).slice(-len).toString().toUpperCase(); + }else{ + return Math.random().toString(36).slice(-len).toString().toLowerCase(); + } + +} + +module.exports = getStr \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/tools/console/index.js b/01===sys22/baseSys/userSys/realization/tools/console/index.js new file mode 100644 index 0000000..52150df --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/tools/console/index.js @@ -0,0 +1,70 @@ +const styles = { + // style: [ style code, reset code ] + 'bold' : ['\x1B[1m', '\x1B[22m'], + 'italic' : ['\x1B[3m', '\x1B[23m'], + 'underline' : ['\x1B[4m', '\x1B[24m'], + 'inverse' : ['\x1B[7m', '\x1B[27m'], + 'strikethrough' : ['\x1B[9m', '\x1B[29m'], + 'white' : ['\x1B[37m', '\x1B[39m'], + 'grey' : ['\x1B[90m', '\x1B[39m'], + 'black' : ['\x1B[30m', '\x1B[39m'], + 'blue' : ['\x1B[34m', '\x1B[39m'], + 'cyan' : ['\x1B[36m', '\x1B[39m'], + 'green' : ['\x1B[32m', '\x1B[39m'], + 'magenta' : ['\x1B[35m', '\x1B[39m'], + 'red' : ['\x1B[31m', '\x1B[39m'], + 'yellow' : ['\x1B[33m', '\x1B[39m'], + 'whiteBG' : ['\x1B[47m', '\x1B[49m'], + 'greyBG' : ['\x1B[49;5;8m', '\x1B[49m'], + 'blackBG' : ['\x1B[40m', '\x1B[49m'], + 'blueBG' : ['\x1B[44m', '\x1B[49m'], + 'cyanBG' : ['\x1B[46m', '\x1B[49m'], + 'greenBG' : ['\x1B[42m', '\x1B[49m'], + 'magentaBG' : ['\x1B[45m', '\x1B[49m'], + 'redBG' : ['\x1B[41m', '\x1B[49m'], + 'yellowBG' : ['\x1B[43m', '\x1B[49m'] +}; +function initConsole() { + // 斜体 + console.__proto__.i = function () { + console.log(`\x1B[3m${Array.from(arguments).join(',')}\x1B[0m`) + } + // 粗体 + console.__proto__.b = function () { + console.log(`\x1B[1m${Array.from(arguments).join(',')}\x1B[0m`) + } + // 下划线 + console.__proto__.u = function () { + console.log(`\x1B[4m${Array.from(arguments).join(',')}\x1B[0m`) + } + // 错误 + console.__proto__.e = console.__proto__.err = function () { + console.error(`\x1B[31m${Array.from(arguments).join(',')}\x1B[0m`) + } + // 成功 + console.__proto__.s = console.__proto__.success = function () { + console.log(`\x1B[32m${Array.from(arguments).join(',')}\x1B[0m`) + } + // 警告 + console.__proto__.w = console.__proto__.warning = function () { + console.warn(`\x1B[33m${Array.from(arguments).join(',')}\x1B[0m`) + } + // 一般提示 + console.__proto__.i = console.__proto__.info = function () { + console.log(`\x1B[34m${Array.from(arguments).join(',')}\x1B[0m`) + } + // 青色 + console.__proto__.a = function () { + console.log(`\x1B[36m${Array.from(arguments).join(',')}\x1B[0m`) + } + + // dev + console.__proto__.dev = console.log + + for(let i in styles){ + console.__proto__[i] = function (){ + console.log(`${styles[i][0]}${Array.from(arguments).join(',')}${styles[i][1]}`) + } + } +} +module.exports = initConsole diff --git a/01===sys22/baseSys/userSys/realization/tools/database/createConnection.js b/01===sys22/baseSys/userSys/realization/tools/database/createConnection.js new file mode 100644 index 0000000..52303d8 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/tools/database/createConnection.js @@ -0,0 +1,65 @@ +/** + * 创建数据库连接 + * */ +const mysql = require("mysql"); +const config = require("../../config/default.config"); + +function createConnectionNull() { + return new Promise((rec, rej) => { + const db = mysql.createConnection({ + host: config.DATABASE_INIT.host, + user: config.DATABASE_INIT.user, + password: config.DATABASE_INIT.password, + }); + db.connect(err => { + if (err) { + rej({ + status: false, + message: '数据库连接失败。', + code: err.code, + errno: err.errno, + sqlMessage: err.sqlMessage + }) + } else { + rec({ + status: true, + message: '数据库连接成功。', + connect: db + }) + } + }) + }) +} + +function createConnectionDatabase() { + return new Promise((rec, rej) => { + const db = mysql.createConnection({ + host: config.DATABASE_INIT.host, + user: config.DATABASE_INIT.user, + password: config.DATABASE_INIT.password, + database: config.DATABASE_INIT.database + }); + db.connect(err => { + if (err) { + rej({ + status: false, + message: '数据库连接失败。', + code: err.code, + errno: err.errno, + sqlMessage: err.sqlMessage + }) + } else { + rec({ + status: true, + message: '数据库连接成功。', + connect: db + }) + } + }) + }) +} + +module.exports = { + createConnectionNull, + createConnectionDatabase +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/tools/database/formatSQL.js b/01===sys22/baseSys/userSys/realization/tools/database/formatSQL.js new file mode 100644 index 0000000..9fc0e8d --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/tools/database/formatSQL.js @@ -0,0 +1,14 @@ +/** + * 格式化SQL语句 + * */ + +function formatSQL(tableStruct){ + let field = '' + for(let i of tableStruct.field){ + field += `${i.name} ${i.type} ${i.attribute.join(' ')} comment "${i.comment}",` + } + field = field.slice(0, field.length - 1) + return `Create Table If Not Exists ${tableStruct.tableName} (${field})comment = "${tableStruct.comment}";` +} + +module.exports = formatSQL \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/tools/getEnv.js b/01===sys22/baseSys/userSys/realization/tools/getEnv.js new file mode 100644 index 0000000..07a1926 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/tools/getEnv.js @@ -0,0 +1,17 @@ +/** + * 环境探测 + * */ + +const os = require('os') + +// 获取系统信息 +function getSystem(){ + return { + hostname:os.hostname(), + os:os.type() + os.arch() + } +} + +module.exports = { + getSystem +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/tools/mail.js b/01===sys22/baseSys/userSys/realization/tools/mail.js new file mode 100644 index 0000000..c34148a --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/tools/mail.js @@ -0,0 +1,75 @@ +const nodemailer = require('nodemailer'); //引入模块 + + +const reg = /^[a-zA-Z0-9]+([-_.][A-Za-zd]+)*@([a-zA-Z0-9]+[-.])+[A-Za-zd]{2,5}$/ + +const { EMAILCONFIG,SYSTEM_NAME } = require('../config/default.config') + +const transporter = nodemailer.createTransport({ + //node_modules/nodemailer/lib/well-known/services.json 查看相关的配置,如果使用qq邮箱,就查看qq邮箱的相关配置 + host:EMAILCONFIG.HOST, + // secureConnection:true, + service: 'qq', //类型qq邮箱 + // port: 465, + secure: true, // true for 465, false for other ports + auth: { + user: EMAILCONFIG.USER, // 发送方的邮箱 + pass:EMAILCONFIG.PASS// smtp 的授权码 + } + //pass 不是邮箱账户的密码而是stmp的授权码(必须是相应邮箱的stmp授权码) + //邮箱---设置--账户--POP3/SMTP服务---开启---获取stmp授权码 +}); +const typeList = { + signUp:'账户注册', + signIn:'登录', + reset:'重置密码', + writeoff:'注销账户' +} + +function sendMail(mail, code, type) { + console.log(mail, code) + return new Promise((rec,rej) => { + if(!checkEmail(mail)){ + rej('邮箱格式错误!') + } + // 发送的配置项 + const mailOptions = { + from: '"TOGY.GC" ', // 发送方 + to: mail, //接收者邮箱,多个邮箱用逗号间隔 + subject: `${SYSTEM_NAME}!`, // 标题 + text: 'Hello world?', // 文本内容 + html: `
+

欢迎使用 ${SYSTEM_NAME}

您在某些地方请求了邮箱的验证码,如果不是自己操作请修改账户的密码。

+
此验证码用于 ${typeList[type]}。

+
+
${code}
+
+
`, //页面内容 + // attachments: [{//发送文件 + // filename: 'index.html', //文件名字 + // path: './index.html' //文件路径 + // }, + // { + // filename: 'sendEmail.js', //文件名字 + // content: 'sendEmail.js' //文件路径 + // } + // ] + }; + //发送函数 + transporter.sendMail(mailOptions, (error, info) => { + if (error) { + rej(error,info) + } else { + rec(info) //因为是异步 所有需要回调函数通知成功结果 + } + }); + }) +} + +function checkEmail(email){ + return reg.test(email) +} +module.exports = { + sendMail, + checkEmail +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/tools/redisJSON.js b/01===sys22/baseSys/userSys/realization/tools/redisJSON.js new file mode 100644 index 0000000..c55986f --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/tools/redisJSON.js @@ -0,0 +1,308 @@ +const {createClient} = require('redis') + , {RedisJSON, maxClientOnline, user} = require('../config/default.config') + ,{HASH} = require('../tools/user/encryptionString') + +function initRedisJSON() { + return new Promise(async (res, rej) => { + const client = createClient({ + // https://github.com/redis/node-redis + url: `redis://default:Hxl1314521@${RedisJSON.host}:${RedisJSON.port}` + }); + try { + await client.connect() + RedisJSON.startClear ? client.flushAll() : '' + client.select(RedisJSON.pool) + res(client) + } catch (e) { + rej(e) + } + }) +} + +const codeList = ['signUp', 'signIn', 'reset', 'writeoff'] + +function Redis() { + return new Promise(async (res, rej) => { + try { + const client = await initRedisJSON() + + // 初始化RedisJSON池 + // 同类的 + for(let codeType of codeList){ + await client.json.set(codeType, '$', {}, {NX: true}); + } + // 特殊的 + await client.json.set('login', '$', {}, {NX: true}); + // 执行清理程序 + setInterval(async () => { + clearAllCode(client) + }, RedisJSON.clearTime) + + // 生成对外程序 + const codeMethods = {} + for(let codeType of codeList){ + const nowCodeType = codeType.replace(codeType[0],codeType.split("")[0].toUpperCase()) + codeMethods['set' + nowCodeType + 'Code'] = (emailOrUsername, code) => setCode(client, codeType, emailOrUsername, code) + codeMethods['get' + nowCodeType + 'Code'] = (emailOrUsername) => getCode(client, codeType, emailOrUsername) + codeMethods['del' + nowCodeType + 'Code'] = (emailOrUsername) => delCode(client, codeType, emailOrUsername) + // codeMethods['clear' + nowCodeType + 'Code'] = () => clearCode(client, codeType) + } + const RJ = { + client, + // uuid和Token + setLogin: (uuid, token) => setLogin(client, uuid, token), + getLogin: (uuid) => getLogin(client, uuid), + delLogin: (uuid, token) => delLogin(client, uuid, token), + getToken: (token) => getToken(client, token), + // 'signUp', 'signIn', 'reset' Code + ...codeMethods + } + res(RJ) + } catch (e) { + rej(e) + } + }) +} +// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$统一清理程序$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +function clearAllCode(client){ + return new Promise(async (res, rej) => { + // 清理signUpCOde + try{ + await clearCode(client, 'signUp') + }catch (e) { + console.e('清理注册Code发生异常', e) + } + // 清理登录Code + try{ + await clearCode(client, 'signIn') + }catch (e) { + console.e('清理登录Code发生异常', e) + } + + // 清理找回密码Code + try{ + await clearCode(client, 'reset') + }catch (e) { + console.e('清理找回密码Code发生异常', e) + } + res() + + // 清理UUID + try { + await clearLoginArr(client) + console.dev('清理UUID成功') + } catch (e) { + console.dev('清理UUID发生异常', e) + } + + }) +} + +// ===============================================UUID && Token======================================================== +// login,用于同账号的登陆数量,获取UUID下的TokenList +function getLogin(client, uuid) { + return new Promise(async (res, rej) => { + try { + const result = await client.json.get('login', {path: uuid}) + res(result) + } catch (e) { + if (e.toString().indexOf('not exist') > -1) { + res([]) + } else { + rej(e) + } + } + }) +} +// 添加UUID下的Token +function setLogin(client, uuid, token) { + return new Promise(async (res, rej) => { + try { + const nowTime = new Date().getTime() + const result = await getLogin(client, uuid) + if(result == null){ + console.e('需要重启服务,Redis被清空,没有根节点。') + throw new Error('需要重启服务,Redis被清空,没有根节点。') + } + if (result.length == 0) { + await client.json.set('login', uuid, [{token, time: nowTime}]) + await setToken(client, token, uuid) + res() + } else if (result.length < maxClientOnline) { + await client.json.ARRAPPEND('login', uuid, {token, time: nowTime}) + await setToken(client, token, uuid) + res() + } else { + // 已经达到最大值了 + for (let i = result.length - 1; i >= 0; i--) { + if (nowTime - result[i].time > user.login.timeLimit) { + await delLoginArr(client, uuid, i, result[i].token) + } + } + const result2 = await getLogin(client, uuid) + if(result2.length == maxClientOnline){ + await delLoginArr(client, uuid, 0, result[0].token) + } + await client.json.ARRAPPEND('login', uuid, {token, time: nowTime}) + await setToken(client, token, uuid) + res() + } + } catch (e) { + console.log(e); + rej(e) + } + }) +} +// 删除UUID List中的占用的Token +function delLoginArr(client, uuid, index, token) { + return new Promise(async (res, rej) => { + try { + await client.json.ARRPOP('login', uuid, index) + await delToken(client, token) + res() + } catch (e) { + rej(e) + } + + }) +} +// 退出登录时删除UUID下的Token +function delLogin(client, uuid, token){ + return new Promise(async (res, rej) => { + try{ + const result = await getLogin(client, uuid) + for(let i = result.length - 1; i >= 0 ; i--){ + if(result[i].token == token){ + await delLoginArr(client, uuid, i, token) + } + } + res() + }catch (e) { + rej(e) + } + }) +} +// 清理过期的UUID下的Token +function clearLoginArr(client) { + return new Promise(async (res, rej) => { + const result = await client.json.get('login') + const nowTime = new Date().getTime() + try { + for (let i in result) { + const list = result[i]; + for (let j = list.length - 1; j >= 0; j--) { + if (nowTime - list[j].time > user.login.timeLimit) { + await delLoginArr(client, i, j, list[j].token) + } + } + } + res() + } catch (e) { + rej(e) + } + + }) +} +// 获取Token的UUID +function getToken(client, token) { + return new Promise(async (res, rej) => { + try { + const result = await client.get(token) + res(result) + } catch (e) { + if (e.toString().indexOf('not exist') > -1) { + res([]) + } else { + rej(e) + } + } + }) +} +// 添加Token键值对,在添加UUID时,同步添加 +function setToken(client, token, uuid) { + return new Promise(async (res, rej) => { + try { + await client.set(token, uuid) + res() + }catch (e) { + rej() + } + }) +} +// 删除Token键值对,在删除UUID时,同步删除 +function delToken(client, token) { + return new Promise(async (res, rej) => { + try{ + const a = await client.del(token) + if(a != 1){ + rej('删除token指定的UUID失败') + console.e('删除token指定的UUID失败') + }else{ + console.dev('删除成功', a) + } + res() + }catch (e) { + rej(e) + } + }) +} +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>UUID && Token>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +// 通用设置Code +function setCode(client, type, emailOrUsername, code){ + return new Promise(async (res, rej) => { + try{ + console.log('设置登陆吗') + // 这里不能设置特殊符号 + emailOrUsername = HASH(emailOrUsername,'md5') + const time = new Date().getTime() + const a = await client.json.set(type, emailOrUsername, {code, time}, {NX:true}) + console.log(a) + res() + }catch (e) { + console.log(e) + rej(e) + } + }) +} +function getCode(client, type, emailOrUsername){ + return new Promise(async (res, rej) => { + try{ + emailOrUsername = HASH(emailOrUsername,'md5') + const result = await client.json.get(type, {path: emailOrUsername}) + res(result) + }catch (e) { + rej(e) + } + }) +} +function delCode(client, type, emailOrUsername){ + return new Promise(async (res, rej) => { + try{ + emailOrUsername = HASH(emailOrUsername,'md5') + const result = await client.json.del(type, emailOrUsername) + res(result) + }catch (e) { + rej(e) + } + }) +} +function clearCode(client, type){ + return new Promise(async (res, rej) => { + try{ + const nowTime = new Date().getTime() + const result = await client.json.get(type) + for(let i in result){ + if(nowTime - result[i].time > RedisJSON.timeout){ + await delResetCode(client, type, i) + } + } + res() + }catch (e) { + rej(e) + } + }) +} + + +module.exports = Redis \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/tools/user/encryptionString.js b/01===sys22/baseSys/userSys/realization/tools/user/encryptionString.js new file mode 100644 index 0000000..cb13bb4 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/tools/user/encryptionString.js @@ -0,0 +1,136 @@ +/** + * 加密 + * */ +const crypto = require('crypto'); + +/** + * 配置文件 + * */ +const CFG = global.cfg ? global.cfg.encryption : require('../../config/default.config') +/** + * 加密算法 + * */ + +// 不可逆加密 +const MD5 = "md5" // 32位 + , SHA256 = 'sha256' // 64位 + , SHA512 = 'sha512' // 128位 +// 可逆加密 +const AES128 = 'aes-128-cbc' + , AES256 = 'aes-256-gcm' + +// vi +// ase-128-cbc 加密算法要求key和iv长度都为16 +// const key = Buffer.from('9vApxLk5G3PAsJrM', 'utf8'); +// const iv = Buffer.from('FnJL7EDzjqWjcaY9', 'utf8'); + +// const key = crypto.randomBytes(32); // 256 位的共享密钥 +// const iv = crypto.randomBytes(16); // 初始向量,16 字节 +const key = Buffer.from(HASH(CFG.encryption.secretKey, MD5).slice(0, 16), 'utf8'); +const iv = Buffer.from(HASH(CFG.encryption.salt, MD5).slice(0, 16), 'utf8'); + +/** + * 不可逆加密 + * */ +function HASH(plaintext, algorithm = SHA512) { + const sha512 = crypto.createHash(algorithm) + const sha512Sum = sha512.update(plaintext + CFG.encryption.salt) + const ciphertext = sha512Sum.digest('hex') + return ciphertext +} + +/** + * 可逆加密 + * */ +// 加密 + +// 加密 +function encrypt(plaintext, algorithm = AES128) { + const cipher = crypto.createCipheriv(algorithm, key, iv); // 初始化加密算法 + let ciphertext = cipher.update(plaintext, 'utf8', 'hex'); + ciphertext += cipher.final('hex'); + // return { + // ciphertext, + // tag : cipher.getAuthTag() + // }; + return ciphertext +} + +// 解密 +function decrypt(ciphertext, algorithm = AES128) { + let plaintext = ''; + const cipher = crypto.createDecipheriv(algorithm, key, iv); + plaintext += cipher.update(ciphertext, 'hex', 'utf8'); + plaintext += cipher.final('utf8'); + return plaintext; +} + +// const a = 'i love u!' +// const b = encrypt(a) +// const c = decrypt(b) +// console.log(a, b, c); +// aes128() +// aes256() + +function aes256(){ + 'use strict'; + + const crypto = require('crypto'); + +// 初始化参数 + const text = 'Encryption Testing AES GCM mode'; // 要加密和解密的数据 + const key = crypto.randomBytes(32); // 256 位的共享密钥 + const iv = crypto.randomBytes(16); // 初始向量,16 字节 + const algorithm = 'aes-256-gcm'; // 加密算法和操作模式 + +// 加密 + const cipher = crypto.createCipheriv(algorithm, key, iv); // 初始化加密算法 + let encrypted = cipher.update(text, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + const tag = cipher.getAuthTag(); // 生成标签,用于验证密文的来源 + +// 解密 + const decipher = crypto.createDecipheriv(algorithm, key, iv); // 初始化解密算法 + decipher.setAuthTag(tag); // 传入验证标签,验证密文的来源 + let decrypted = decipher.update(encrypted, 'hex', 'utf8'); + decrypted += decipher.final('utf8'); + + console.log(decrypted); // Encryption Testing AES GCM mode + +} +function aes128(){ +// 加密 + function genSign(src, key, iv) { + let sign = ''; + const cipher = crypto.createCipheriv('aes-128-cbc', key, iv); + sign += cipher.update(src, 'utf8', 'hex'); + sign += cipher.final('hex'); + return sign; + } + +// 解密 + function deSign(sign, key, iv) { + let src = ''; + const cipher = crypto.createDecipheriv('aes-128-cbc', key, iv); + src += cipher.update(sign, 'hex', 'utf8'); + src += cipher.final('utf8'); + return src; + } + + // ase-128-cbc 加密算法要求key和iv长度都为16 + const key = Buffer.from('9vApxLk5G3PAsJrM', 'utf8'); + const iv = Buffer.from('FnJL7EDzjqWjcaY9', 'utf8'); + const sign = genSign('hello world', key, iv); + console.log(sign); // 764a669609b0c9b041faeec0d572fd7a + + +// 解密 + const src=deSign('764a669609b0c9b041faeec0d572fd7a', key, iv); + console.log(src); // hello world +} + +module.exports = { + HASH, + encrypt, + decrypt +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/tools/user/sendEmail.js b/01===sys22/baseSys/userSys/realization/tools/user/sendEmail.js new file mode 100644 index 0000000..5603959 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/tools/user/sendEmail.js @@ -0,0 +1,3 @@ +/** + * 发送验证码 + * */ \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/tools/user/token.js b/01===sys22/baseSys/userSys/realization/tools/user/token.js new file mode 100644 index 0000000..87fdf15 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/tools/user/token.js @@ -0,0 +1,34 @@ +/** + * 生成和验证jwt + * */ +const jwt = require('jsonwebtoken'); +const { encrypt, decrypt } = require('./encryptionString') + +// authorization +// Token.decrypt(ctx.header.authorization); // 获取其中的令牌 + +const CFG = global.cfg ? global.cfg.encryption : require('../../config/default.config') + +module.exports = { + // 加密 + encrypt: (token, time = CFG.user.login.timeLimit) => { + // 需要设置超时时间 + return encrypt(jwt.sign(token, CFG.encryption.secretKey, {expiresIn: time / 1000})) + }, + // 解密 + decrypt: (token) => { + try { + token = decrypt(token) + let data = jwt.verify(token, CFG.encryption.secretKey); + return { + token:true, + id:data + }; + } catch (e) { + return { + token:false, + data:e + } + } + } +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/realization/tools/uuid.js b/01===sys22/baseSys/userSys/realization/tools/uuid.js new file mode 100644 index 0000000..8ceeba5 --- /dev/null +++ b/01===sys22/baseSys/userSys/realization/tools/uuid.js @@ -0,0 +1,11 @@ +/** + * 生成uuid + * */ +const { v4: uuidv4 } = require('uuid'); +// 需要去重- 然后转换成字符串 + +function makeUUID(){ + return uuidv4().split('-').join("") +} + +module.exports = makeUUID \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/userSys.dirname b/01===sys22/baseSys/userSys/userSys.dirname new file mode 100644 index 0000000..e69de29 diff --git a/01===sys22/baseSys/userSys/vision/.gitignore b/01===sys22/baseSys/userSys/vision/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/01===sys22/baseSys/userSys/vision/index.html b/01===sys22/baseSys/userSys/vision/index.html new file mode 100644 index 0000000..b144ba0 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/index.html @@ -0,0 +1,14 @@ + + + + + + + + sys22 + + +
+ + + diff --git a/01===sys22/baseSys/userSys/vision/package.json b/01===sys22/baseSys/userSys/vision/package.json new file mode 100644 index 0000000..5d56d3f --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/package.json @@ -0,0 +1,25 @@ +{ + "name": "vision", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "start": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "animate.css": "^4.1.1", + "mobx": "^6.6.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.4.2" + }, + "devDependencies": { + "@types/react": "^18.0.17", + "@types/react-dom": "^18.0.6", + "@vitejs/plugin-react": "^2.1.0", + "sass": "^1.55.0", + "vite": "^3.1.0" + } +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/pnpm-lock.yaml b/01===sys22/baseSys/userSys/vision/pnpm-lock.yaml new file mode 100644 index 0000000..925aed9 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/pnpm-lock.yaml @@ -0,0 +1,1174 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + animate.css: + specifier: ^4.1.1 + version: 4.1.1 + mobx: + specifier: ^6.6.2 + version: 6.12.4 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + react-router-dom: + specifier: ^6.4.2 + version: 6.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + devDependencies: + '@types/react': + specifier: ^18.0.17 + version: 18.3.3 + '@types/react-dom': + specifier: ^18.0.6 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^2.1.0 + version: 2.2.0(vite@3.2.10(sass@1.77.6)) + sass: + specifier: ^1.55.0 + version: 1.77.6 + vite: + specifier: ^3.1.0 + version: 3.2.10(sass@1.77.6) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.7': + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.7': + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.7': + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.24.7': + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.24.7': + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.24.7': + resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.7': + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.7': + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.7': + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.7': + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.24.7': + resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.24.7': + resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.24.7': + resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.24.7': + resolution: {integrity: sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.24.7': + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.7': + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.7': + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + engines: {node: '>=6.9.0'} + + '@esbuild/android-arm@0.15.18': + resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/linux-loong64@0.15.18': + resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@remix-run/router@1.16.1': + resolution: {integrity: sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==} + engines: {node: '>=14.0.0'} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + + '@vitejs/plugin-react@2.2.0': + resolution: {integrity: sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + + animate.css@4.1.1: + resolution: {integrity: sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + caniuse-lite@1.0.30001636: + resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + electron-to-chromium@1.4.805: + resolution: {integrity: sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==} + + esbuild-android-64@0.15.18: + resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + esbuild-android-arm64@0.15.18: + resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + esbuild-darwin-64@0.15.18: + resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + esbuild-darwin-arm64@0.15.18: + resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + esbuild-freebsd-64@0.15.18: + resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + esbuild-freebsd-arm64@0.15.18: + resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + esbuild-linux-32@0.15.18: + resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + esbuild-linux-64@0.15.18: + resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + esbuild-linux-arm64@0.15.18: + resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + esbuild-linux-arm@0.15.18: + resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + esbuild-linux-mips64le@0.15.18: + resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + esbuild-linux-ppc64le@0.15.18: + resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + esbuild-linux-riscv64@0.15.18: + resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + esbuild-linux-s390x@0.15.18: + resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + esbuild-netbsd-64@0.15.18: + resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + esbuild-openbsd-64@0.15.18: + resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + esbuild-sunos-64@0.15.18: + resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + esbuild-windows-32@0.15.18: + resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + esbuild-windows-64@0.15.18: + resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + esbuild-windows-arm64@0.15.18: + resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + esbuild@0.15.18: + resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + immutable@4.3.6: + resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} + engines: {node: '>=12'} + + mobx@6.12.4: + resolution: {integrity: sha512-uIymg89x+HmItX1p3MG+d09irn2k63J6biftZ5Ok+UpNojS1I3NJPLfcmJT9ANnUltNlHi+HQqrVyxiAN8ISYg==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.23.1: + resolution: {integrity: sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.23.1: + resolution: {integrity: sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + + sass@1.77.6: + resolution: {integrity: sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==} + engines: {node: '>=14.0.0'} + hasBin: true + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + vite@3.2.10: + resolution: {integrity: sha512-Dx3olBo/ODNiMVk/cA5Yft9Ws+snLOXrhLtrI3F4XLt4syz2Yg8fayZMWScPKoz12v5BUv7VEmQHnsfpY80fYw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/compat-data@7.24.7': {} + + '@babel/core@7.24.7': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.7': + dependencies: + '@babel/types': 7.24.7 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-compilation-targets@7.24.7': + dependencies: + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + browserslist: 4.23.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/helper-hoist-variables@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.24.7': {} + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-string-parser@7.24.7': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.7': {} + + '@babel/helpers@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/template@7.24.7': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/traverse@7.24.7': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.7': + dependencies: + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@esbuild/android-arm@0.15.18': + optional: true + + '@esbuild/linux-loong64@0.15.18': + optional: true + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@remix-run/router@1.16.1': {} + + '@types/prop-types@15.7.12': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.3 + + '@types/react@18.3.3': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@vitejs/plugin-react@2.2.0(vite@3.2.10(sass@1.77.6))': + dependencies: + '@babel/core': 7.24.7 + '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) + magic-string: 0.26.7 + react-refresh: 0.14.2 + vite: 3.2.10(sass@1.77.6) + transitivePeerDependencies: + - supports-color + + animate.css@4.1.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + binary-extensions@2.3.0: {} + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.1: + dependencies: + caniuse-lite: 1.0.30001636 + electron-to-chromium: 1.4.805 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.1) + + caniuse-lite@1.0.30001636: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-name@1.1.3: {} + + convert-source-map@2.0.0: {} + + csstype@3.1.3: {} + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + electron-to-chromium@1.4.805: {} + + esbuild-android-64@0.15.18: + optional: true + + esbuild-android-arm64@0.15.18: + optional: true + + esbuild-darwin-64@0.15.18: + optional: true + + esbuild-darwin-arm64@0.15.18: + optional: true + + esbuild-freebsd-64@0.15.18: + optional: true + + esbuild-freebsd-arm64@0.15.18: + optional: true + + esbuild-linux-32@0.15.18: + optional: true + + esbuild-linux-64@0.15.18: + optional: true + + esbuild-linux-arm64@0.15.18: + optional: true + + esbuild-linux-arm@0.15.18: + optional: true + + esbuild-linux-mips64le@0.15.18: + optional: true + + esbuild-linux-ppc64le@0.15.18: + optional: true + + esbuild-linux-riscv64@0.15.18: + optional: true + + esbuild-linux-s390x@0.15.18: + optional: true + + esbuild-netbsd-64@0.15.18: + optional: true + + esbuild-openbsd-64@0.15.18: + optional: true + + esbuild-sunos-64@0.15.18: + optional: true + + esbuild-windows-32@0.15.18: + optional: true + + esbuild-windows-64@0.15.18: + optional: true + + esbuild-windows-arm64@0.15.18: + optional: true + + esbuild@0.15.18: + optionalDependencies: + '@esbuild/android-arm': 0.15.18 + '@esbuild/linux-loong64': 0.15.18 + esbuild-android-64: 0.15.18 + esbuild-android-arm64: 0.15.18 + esbuild-darwin-64: 0.15.18 + esbuild-darwin-arm64: 0.15.18 + esbuild-freebsd-64: 0.15.18 + esbuild-freebsd-arm64: 0.15.18 + esbuild-linux-32: 0.15.18 + esbuild-linux-64: 0.15.18 + esbuild-linux-arm: 0.15.18 + esbuild-linux-arm64: 0.15.18 + esbuild-linux-mips64le: 0.15.18 + esbuild-linux-ppc64le: 0.15.18 + esbuild-linux-riscv64: 0.15.18 + esbuild-linux-s390x: 0.15.18 + esbuild-netbsd-64: 0.15.18 + esbuild-openbsd-64: 0.15.18 + esbuild-sunos-64: 0.15.18 + esbuild-windows-32: 0.15.18 + esbuild-windows-64: 0.15.18 + esbuild-windows-arm64: 0.15.18 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globals@11.12.0: {} + + has-flag@3.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + immutable@4.3.6: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + js-tokens@4.0.0: {} + + jsesc@2.5.2: {} + + json5@2.2.3: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.26.7: + dependencies: + sourcemap-codec: 1.4.8 + + mobx@6.12.4: {} + + ms@2.1.2: {} + + nanoid@3.3.7: {} + + node-releases@2.0.14: {} + + normalize-path@3.0.0: {} + + path-parse@1.0.7: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-refresh@0.14.2: {} + + react-router-dom@6.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.16.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.23.1(react@18.3.1) + + react-router@6.23.1(react@18.3.1): + dependencies: + '@remix-run/router': 1.16.1 + react: 18.3.1 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rollup@2.79.1: + optionalDependencies: + fsevents: 2.3.3 + + sass@1.77.6: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.6 + source-map-js: 1.2.0 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@6.3.1: {} + + source-map-js@1.2.0: {} + + sourcemap-codec@1.4.8: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + update-browserslist-db@1.0.16(browserslist@4.23.1): + dependencies: + browserslist: 4.23.1 + escalade: 3.1.2 + picocolors: 1.0.1 + + vite@3.2.10(sass@1.77.6): + dependencies: + esbuild: 0.15.18 + postcss: 8.4.38 + resolve: 1.22.8 + rollup: 2.79.1 + optionalDependencies: + fsevents: 2.3.3 + sass: 1.77.6 + + yallist@3.1.1: {} diff --git a/01===sys22/baseSys/userSys/vision/public/vite.svg b/01===sys22/baseSys/userSys/vision/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/App.jsx b/01===sys22/baseSys/userSys/vision/src/App.jsx new file mode 100644 index 0000000..146bd8e --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/App.jsx @@ -0,0 +1,14 @@ +import {useState} from 'react' +import { useRoutes } from 'react-router-dom' +import indexRouterList from "@/router" + + +export default function App() { + const indexRoute = useRoutes(indexRouterList) + return ( +
+ {indexRoute} +
+ ) +} + diff --git a/01===sys22/baseSys/userSys/vision/src/api/index.js b/01===sys22/baseSys/userSys/vision/src/api/index.js new file mode 100644 index 0000000..c08d260 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/api/index.js @@ -0,0 +1,101 @@ +class Net { + constructor(option = {}) { + this.baseUrl = option.baseUrl ? option.baseUrl.slice(-1) != '/' ? option.baseUrl + '/' : option.baseUrl : '' + } + + get(url, data = null, option = null) { + return new Promise((res, rej) => { + let URL + if (url[0] != '/') { + URL = this.baseUrl + url + } else { + URL = this.baseUrl + url.slice(1) + } + data = data?.replace(/:/g, '=').replace(/,/g, '&').replace(/{/g, '?').replace(/}/g, '').replace(/"/g, '') + if(data){ + URL = URL + data + } + const headers = new Headers({ + 'Content-Type': 'application/json' + }) + const token = window.localStorage.getItem('token') + if(token){ + headers.append('Authorization', token) + } + fetch(URL, { + method: 'GET', + headers, + }).then( + response => { + if (response.status >= 200 && response.status < 300) { + response.json().then( + json => { + res(json) + } + ).catch( + e => rej(e) + ) + } else { + rej(response.statusText) + } + } + ).catch( + e => { + rej(e) + } + ) + }) + } + + post(url, data = null, option = null) { + return new Promise((res, rej) => { + let URL + if (url[0] != '/') { + URL = this.baseUrl + url + } else { + URL = this.baseUrl + url.slice(1) + } + const form = new FormData(); + for (let i in data) { + form.append(i, data[i]); + } + const headers = new Headers() + const token = window.localStorage.getItem('token') + if(token){ + headers.append('Authorization', token) + } + + fetch(URL, { + method: 'POST', + body: form, + headers + }).then( + response => { + if (response.status >= 200 && response.status < 300) { + response.json().then( + json => { + res(json) + } + ).catch( + e => rej(e) + ) + } else { + rej(response.statusText) + } + } + ).catch( + e => { + rej(e) + } + ) + }) + } + + request(option) { + + } +} + +export const net = new Net({ + baseUrl: 'api/user' +}) diff --git a/01===sys22/baseSys/userSys/vision/src/assets/index.css b/01===sys22/baseSys/userSys/vision/src/assets/index.css new file mode 100644 index 0000000..72dd361 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/assets/index.css @@ -0,0 +1,111 @@ +:root { + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; + + --animate-duration: 900ms; + --animate-delay: 0.9s; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +html,body{ + height: 100% !important; + width: 100% !important; + overflow: hidden; +} +#root,.App{ + height: 100%; + width: 100%; + overflow: hidden; +} + +body { + margin: 0; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} +#modalRoot{ + position: absolute; + height: 100%; + width: 100%; + overflow: hidden; + top:0; + left: 0; + align-items: center; + justify-content: center; + display: none; + backdrop-filter: blur(50px); + animation: modalRootShow ease-in-out 500ms forwards; +} +@keyframes modalRootShow { + from{ + background: #33333300; + } + to{ + background: #66666633; + } +} +@keyframes modalRootHide { + from{ + background: #33333333; + } + to{ + background: #66666600; + } +} + +fieldset, img,input,button { border:none; padding:0;margin:0;outline-style:none; } diff --git a/01===sys22/baseSys/userSys/vision/src/assets/react.svg b/01===sys22/baseSys/userSys/vision/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/components/Button/index.jsx b/01===sys22/baseSys/userSys/vision/src/components/Button/index.jsx new file mode 100644 index 0000000..07aab7d --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/components/Button/index.jsx @@ -0,0 +1,53 @@ +import BPEMR from './index.module.scss' +import {useState, useEffect} from "react"; + +export default function Button(props) { + // console.log(props) + + const [size, setSize] = useState(props.size) + const [type, setType] = useState(props.type) + const [loading, setLoading] = useState(props.loading) + const [disable, setDisable] = useState(props.disable) + if (props.onClick && typeof props.onClick === 'function') { + + } else { + if (props.onClick) { + throw new Error('onClick必须位函数') + } + } + + useEffect(() => { + setSize(props.size ? props.size : 'default') + setType(props.type ? props.type : 'default') + setLoading(props.loading ? BPEMR.loading : '') + setDisable(props.disable ? BPEMR.disable : '') + }, [props.size, props.type, props.disable, props.loading, props.onClick]) + + const sizeOp = { + default: BPEMR.defaultsize, + undersize: BPEMR.undersize, + oversize: BPEMR.oversize, + } + const typeOp = { + default: BPEMR.defaultColor, + + error: BPEMR.eColor, + error2: BPEMR.e2Color, + error3: BPEMR.e3Color, + + success: BPEMR.sColor, + success2: BPEMR.s3Color, + success3: BPEMR.s2Color, + + warning: BPEMR.wColor, + warning1: BPEMR.w2Color, + warning3: BPEMR.w3Color, + } + const classname = [BPEMR.BPEMR_button, loading, disable, sizeOp[size], typeOp[type]].join(' ') + return ( +
+
{ + }}>{props.children}
+
+ ) +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/components/Button/index.module.scss b/01===sys22/baseSys/userSys/vision/src/components/Button/index.module.scss new file mode 100644 index 0000000..47ddf22 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/components/Button/index.module.scss @@ -0,0 +1,162 @@ +.BPEMR_button_box{ + position: relative; + width: fit-content; + width: -webkit-fit-content; + width: -moz-fit-content; + padding: 5px 0; +} +.BPEMR_button { + position: relative; + width: fit-content; + width: -webkit-fit-content; + width: -moz-fit-content; + line-height: 2em; + padding: 0 1em; + margin: 0.5em 0; + user-select: none; + cursor: pointer; + border-radius: 5px; + transition: all ease-in-out 200ms; + color: #fefefe; +} +.BPEMR_button.loading{ + $jump : jump; + animation: jump .4s ease-in-out infinite alternate; + @keyframes jump { + 0%{top:0px} + 33%{top:-2px} + 66%{top:-8px} + 100%{top:-10px} + } + &{ + box-shadow: 0 5px 20px -10px #33333399; + } +} +.BPEMR_button.disable{ + cursor: no-drop; + &:hover{ + box-shadow: none !important; + } +} + +.BPEMR_button.defaultsize { + font-size: 1rem; + + &:hover { + box-shadow: 0px 0 5px 0px #33333399; + } +} + +.BPEMR_button.oversize { + font-size: 1.2rem; + + &:hover { + box-shadow: 0px 0 7px 0px #33333399; + } +} + +.BPEMR_button.undersize { + font-size: 0.8rem; + + &:hover { + box-shadow: 0px 0 3px 1px #99999999; + } +} + + +.BPEMR_button.defaultColor { + color: #222831; + background: #fefefe; + border: 1px solid #bcbcbc; + + &:active { + background: #fff !important; + } +} + +.BPEMR_button.eColor { + background: #E84545; + background: #ff4d4f; + border: 1px solid #ff4d4f; + + &:active { + background: #ff4d4fcc !important; + border: 1px solid #ff4d4fcc !important; + } +} + +.BPEMR_button.e2Color { + background: #F6416C; + border: 1px solid #F6416C; + &:active { + background: #F6416Ccc !important; + border: 1px solid #F6416Ccc !important; + } +} + +.BPEMR_button.e3Color { + background: #FF165D; + border: 1px solid #FF165D; + &:active { + background: #E84545ee !important; + border: 1px solid #E84545cc !important; + } +} + +.BPEMR_button.sColor { + background: #17B978; + border: 1px solid #17B978; + &:active { + background: #17B978cc !important; + border: 1px solid #17B978cc !important; + } +} + +.BPEMR_button.s2Color { + background: #3EC1D3; + border: 1px solid #3EC1D3; + &:active { + background: #3EC1D3cc !important; + border: 1px solid #3EC1D3cc !important; + } +} + +.BPEMR_button.s3Color { + background: #00ADB5; + border: 1px solid #00ADB5; + &:active { + background: #00ADB5cc !important; + border: 1px solid #00ADB5cc !important; + } +} + +.BPEMR_button.wColor { + background: #FF9A00; + border: 1px solid #FF9A00; + &:active { + background: #FF9A00cc !important; + border: 1px solid #FF9A00cc !important; + } +} + +.BPEMR_button.w2Color { + background: #FF6F3C; + border: 1px solid #FF6F3C; + &:active { + background: #FF6F3Ccc !important; + border: 1px solid #FF6F3Ccc !important; + } +} + +.BPEMR_button.w3Color { + background: #FFC93C; + border: 1px solid #FFC93C; + &:active { + background: #FFC93Ccc !important; + border: 1px solid #FFC93Ccc !important; + } +} + + + + diff --git a/01===sys22/baseSys/userSys/vision/src/components/Modal/close.svg b/01===sys22/baseSys/userSys/vision/src/components/Modal/close.svg new file mode 100644 index 0000000..d2ebbf8 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/components/Modal/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/components/Modal/index.jsx b/01===sys22/baseSys/userSys/vision/src/components/Modal/index.jsx new file mode 100644 index 0000000..ad106b4 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/components/Modal/index.jsx @@ -0,0 +1,68 @@ +import React, { useEffect, useState } from "react"; +import { createPortal } from "react-dom"; +import BPEMR from './index.module.scss'; +import closeSvg from './close.svg' + +export default function Dialog(props){ + const modalRoot = document.body.querySelector('#modalRoot') + let node = window.document.createElement("div"); + if(modalRoot){ + node = modalRoot; + }else{ + node.id='modalRoot' + window.document.body.appendChild(node) + } + + const [state, setState] = useState(props.state) + if(typeof props.width === 'number' || Number(props.width) != 'NaN'){ + + }else{ + throw new Error('width必须为数字') + } + const [width, setWidth] = useState(Number(props.width)) + + const [temCloseAnimation, settemCloseAnimation] = useState(BPEMR.temModalShow) + + useEffect(() => { + setState(props.state) + setWidth(props.width) + if(state){ + modalRoot.style.animation = '' + modalRoot.style.display = 'flex' + }else{ + modalRoot.style.display = 'none' + settemCloseAnimation(BPEMR.temModalShow) + } + }) + + useEffect(() => { + modalRoot.style.animation = 'modalRootHide ease-in-out 500ms forwards' + },[temCloseAnimation]) + + + + if(!props.close){ + throw new Error('缺少弹窗关闭参数。') + }else if(typeof props.close != 'function'){ + throw new Error('弹窗必须返回关闭程序。') + } + + + + function close(){ + settemCloseAnimation(BPEMR.temModalHide) + setTimeout(() => { + props.close(false) + }, 500) + } + + const className = [BPEMR.BPEMR_Dialog_Tem, temCloseAnimation].join(' ') + + return createPortal( +
+
+
{props.children}
+
, + node + ); +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/components/Modal/index.module.scss b/01===sys22/baseSys/userSys/vision/src/components/Modal/index.module.scss new file mode 100644 index 0000000..692e7a6 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/components/Modal/index.module.scss @@ -0,0 +1,64 @@ + +$modalShow:modalShow; +$modalHide:modalHide; + +.BPEMR_Dialog_Tem{ + position:relative; + background: #fefefe; + min-width: 10em !important; + max-width: 90vw !important; + border-radius: 5px; + padding: 1.5em; + box-sizing: border-box; + overflow: overlay; + & > .close{ + position: absolute; + top:0.5em; + right: 0.5em; + width: 1.5em; + height: 1.5em; + border-radius: 1.5em; + cursor: pointer; + box-shadow: 0px 1px 10px -1px #33333333; + transition: box-shadow ease-in-out 300ms; + & > img { + height: 1.5em; + } + &:hover{ + box-shadow: 1px 1px 10px -3px #333; + } + } +} +.temModalShow{ + animation: modalShow ease-in-out 300ms forwards; +} +.temModalHide{ + animation: modalHide ease-in-out 300ms forwards; +} + +@keyframes modalShow { + 0%{ + transform: scale(0.3); + box-shadow: 5px 10px 30px -10px #33333300; + } + 80%{ + transform: scale(1.1); + } + 100%{ + transform: scale(1); + box-shadow: 5px 10px 30px -10px #333333aa; + } +} +@keyframes modalHide { + 0%{ + transform: scale(1); + box-shadow: 5px 10px 30px -10px #333333aa; + } + 20%{ + transform: scale(1.1); + } + 100%{ + transform: scale(0); + box-shadow: 5px 10px 30px -10px #33333300; + } +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/components/RouterAuth/index.jsx b/01===sys22/baseSys/userSys/vision/src/components/RouterAuth/index.jsx new file mode 100644 index 0000000..98cd4fb --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/components/RouterAuth/index.jsx @@ -0,0 +1,15 @@ +import {useNavigate, useLocation} from "react-router-dom"; +import {useEffect} from "react"; + +export default function RouterAuth(props){ + const navigate = useNavigate(); + const location = useLocation(); + useEffect(() => { + const path = window.location.pathname + // console.log(location) + if(path == '/homes'){ + navigate('/home') + } + }) + return props.children +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/config/sys22.js b/01===sys22/baseSys/userSys/vision/src/config/sys22.js new file mode 100644 index 0000000..9c327a8 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/config/sys22.js @@ -0,0 +1,5 @@ +import icon from '../assets/react.svg' +export const config = { + projectName:'sys_22', + icon, +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/main.jsx b/01===sys22/baseSys/userSys/vision/src/main.jsx new file mode 100644 index 0000000..570b6cf --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/main.jsx @@ -0,0 +1,38 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import {BrowserRouter} from "react-router-dom"; +import App from './App' +import '@/assets/index.css' +import RouterAuth from "./components/RouterAuth"; + +import {config} from "./config/sys22"; + +// console.log(config) + +document.title = config.projectName +changeFavicon(config.icon) + +ReactDOM.createRoot(document.getElementById('root')).render( + + + + + + + +) + +function changeFavicon(link){ + let $favicon = document.querySelector('link[rel="icon"]'); + // If a element already exists, + // change its href to the given link. + if ($favicon !== null) { + $favicon.href = link; + // Otherwise, create a new element and append it to . + } else { + $favicon = document.createElement("link"); + $favicon.rel = "icon"; + $favicon.href = link; + document.head.appendChild($favicon); + } +}; \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/router/index.jsx b/01===sys22/baseSys/userSys/vision/src/router/index.jsx new file mode 100644 index 0000000..ca24059 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/router/index.jsx @@ -0,0 +1,37 @@ +import { Navigate } from 'react-router-dom' + +import Index from '@/view/Index' +import SignIn from '@/view/SignIn' +import SignUp from '@/view/SignUp' +import Home from '@/view/Home' +import Setting from '@/view/Home/Setting' + +export default [ + // 路由表 + { + path:'/', + element: + }, + { + path:'/signIn', + element: + }, + { + path:'/signUp', + element: + }, + { + path: '/home', + element: , + children:[ + { + path:'setting', + element: + } + ] + }, + { + path: "", + element: + } +] \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/store/index.js b/01===sys22/baseSys/userSys/vision/src/store/index.js new file mode 100644 index 0000000..e4f65b5 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/store/index.js @@ -0,0 +1,5 @@ +import UserStore from './userStore' +import NetStore from "./netStore"; + +export const userStore = new UserStore() +export const netStore = new NetStore() \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/store/netStore.js b/01===sys22/baseSys/userSys/vision/src/store/netStore.js new file mode 100644 index 0000000..a016aaf --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/store/netStore.js @@ -0,0 +1,124 @@ +import {observable, action, computed, makeObservable} from "mobx"; +import {config} from "@/config/sys22"; +import {userStore} from "./index"; + +import {net} from "@/api"; + + +class NetStore { + // 系统配置 + // config = config; + + constructor() { + // mobx6 和以前版本这是最大的区别 + makeObservable(this, { + // config: observable, + // name: observable, + // sex: observable, + // userObj: observable, + // setName: action, + // titleName: computed + }); + + } + + // 用户名查重 + checkOnly(data) { + return new Promise(res => { + net.get('/will/checkOnly', data).then( + response => { + console.log(response) + res(response.status) + }, + e => { + console.log(e) + } + ) + }) + } + + // 登录 + signIn(data) { + return new Promise(res => { + net.post('/will/signIn', data).then( + response => { + console.log(response) + res(response.status) + if (response.status) { + userStore.setToken(response.data.token) + } + }, + e => { + console.log(e) + } + ) + }) + } + + // 发送验证码 + sendCode(data, type = 'signIn') { + return new Promise(res => { + net.get('/will/sendCode', { + ...data, + type + }).then( + response => { + console.log(response) + res(response.status) + }, + e => { + console.log(e) + } + ) + }) + } + + // 注册 + signUp(data){ + return new Promise(res => { + net.post('/will/signUp', data).then( + response => { + console.log(response) + res(response.status) + if (response.status) { + userStore.setToken(response.data.token) + } + }, + e => { + console.log(e) + } + ) + }) + } + + // 获取用户信息 + getUserInfo(){ + return new Promise(res => { + net.get('/signed/getuserInfo').then( + response => { + res(response.data) + }, + e => { + console.log(e) + } + ) + }) + } + + // setName(v) { + // console.log('触发action'); + // this.name = v; + // } + // setUserObj(obj) { + // this.userObj = obj; + // } + // + // get titleName(){ + // return this.name+'___111'; + // } + // get userObject() { + // return this.userObj; + // } +} + +export default NetStore \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/store/userStore.js b/01===sys22/baseSys/userSys/vision/src/store/userStore.js new file mode 100644 index 0000000..2185c35 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/store/userStore.js @@ -0,0 +1,123 @@ +import { observable, action, computed, makeObservable} from "mobx"; +import {config} from "@/config/sys22"; +import {netStore} from "./index"; + + +class UserStore { + // 系统配置 + config = config; + // Token + token = null; + // 登陆时的注册名称 + signInUsername = null; + // home页跳转状态 + homePageGotoStatus = true; + // 用户信息 + userInfo = null; + + + + name = 'kangkang000'; + sex = '男'; + userObj = { + name: 'kangkang000', + age: 23, + token: '12345689' + } + + constructor() { + // mobx6 和以前版本这是最大的区别 + makeObservable(this, { + config: observable, + token:observable, + signInUsername:observable, + homePageGotoStatus:observable, + userInfo:observable, + + name: observable, + sex: observable, + userObj: observable, + setName: action, + titleName: computed + }); + + } + + // 设置Token + setToken(token){ + window.localStorage.setItem('token',token) + this.token = token + } + // 获取Token + get token(){ + if(!this.token){ + this.token = window.localStorage.getItem('token') + return this.token + }else{ + return this.token + } + } + + // 设置SignInUsername + setSignInUsername(username){ + this.signInUsername = username + } + get signInUsername(){ + return this.signInUsername + } + + // 设置home页跳转状态 + setHomePageGotoStatus(state){ + this.homePageGotoStatus = state + } + get homePageGotoStatus(){ + return this.homePageGotoStatus + } + + // 获取用户信息 + getUserInfo(){ + return new Promise(async res => { + this.userInfo = window.localStorage.getItem('userInfo') + if(!this.userInfo){ + res(await this.setUserInfo()) + }else{ + res(JSON.parse(this.userInfo)) + } + + }) + } + // 强制刷新UserInfo + setUserInfo(){ + return new Promise(async res => { + netStore.getUserInfo().then( + resp => { + window.localStorage.setItem('userInfo',JSON.stringify(resp)) + console.log(resp) + res(resp) + }, + e => { + console.log(e); + } + ) + }) + } + + + + setName(v) { + console.log('触发action'); + this.name = v; + } + setUserObj(obj) { + this.userObj = obj; + } + + get titleName(){ + return this.name+'___111'; + } + get userObject() { + return this.userObj; + } +} + +export default UserStore \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/Home/Setting/index.jsx b/01===sys22/baseSys/userSys/vision/src/view/Home/Setting/index.jsx new file mode 100644 index 0000000..d8320a6 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/Home/Setting/index.jsx @@ -0,0 +1,38 @@ +import {userStore, netStore} from "@/store"; +import {useEffect, useState} from "react"; +import css from './index.module.scss'; +import star from './start.svg' + + + +export default function Setting(){ + const [userInfo, setUserInfo] = useState(null) + useEffect(() => { + async function fetchData() { + setUserInfo(await userStore.getUserInfo()) + } + fetchData() + },[0]) + + return
+ {/*头部*/} + {/*
*/} + {/*身子*/} +
+ {/*左侧菜单*/} +
+
+
+ +
+
{userInfo?.userInfoOther.nickname}
+
{userInfo?.userInfoOther.slogan}
+
+
+
+
+ {/*右侧主体*/} +
body
+
+
+} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/Home/Setting/index.module.scss b/01===sys22/baseSys/userSys/vision/src/view/Home/Setting/index.module.scss new file mode 100644 index 0000000..dea5635 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/Home/Setting/index.module.scss @@ -0,0 +1,77 @@ +.Setting{ + position: relative; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + .header{ + position: relative; + flex-shrink: 0; + height: 40px; + background: #1a1a1a; + margin-bottom: 1rem; + border-radius: 2rem; + } + .body{ + position: relative; + flex: 1; + width: 100%; + overflow: hidden; + //background: #1a1a1a; + display: flex; + .menu{ + position: relative; + width: 20rem; + background: #fefefe; + border-radius: 0.5rem; + box-sizing: border-box; + padding: 1rem; + & > div{ + position: relative; + padding: 1rem; + background: #fefefeee; + margin: 1rem 0; + border-radius: 0.5rem; + } + & > div.myself{ + margin-top: 0px; + & > div.avatar{ + position: relative; + margin-bottom: 1rem; + display: flex; + align-items: center; + justify-content: center; + padding: 1rem 0; + & > img{ + width: 5rem; + } + } + & > div.nickname{ + position: relative; + line-height: 3rem; + font-size: 1.1rem; + text-align: center; + } + & > div.slogan{ + position: relative; + max-width: 100%; + width: 100%; + + overflow:hidden; + white-space: nowrap; + text-overflow: ellipsis; + -o-text-overflow:ellipsis; + text-align: center; + } + } + } + .main{ + position: relative; + border-radius: 0.5rem; + background: #1a1a1a; + margin-left: 1rem; + flex: 1; + padding: 1rem; + } + } +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/Home/Setting/start.svg b/01===sys22/baseSys/userSys/vision/src/view/Home/Setting/start.svg new file mode 100644 index 0000000..1c258fe --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/Home/Setting/start.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/Home/bg0.jpg b/01===sys22/baseSys/userSys/vision/src/view/Home/bg0.jpg new file mode 100644 index 0000000..ec4b38c Binary files /dev/null and b/01===sys22/baseSys/userSys/vision/src/view/Home/bg0.jpg differ diff --git a/01===sys22/baseSys/userSys/vision/src/view/Home/index.jsx b/01===sys22/baseSys/userSys/vision/src/view/Home/index.jsx new file mode 100644 index 0000000..e7922b0 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/Home/index.jsx @@ -0,0 +1,79 @@ +import {Outlet, useNavigate} from 'react-router-dom' +import {userStore, netStore} from "@/store"; +import css from './index.module.scss' +import {useEffect, useState} from "react"; +import start from './start.svg'; +import setting from './setting.svg'; +import rocket from './rocket.svg' +import bg0 from './bg0.jpg' +export default function Home(){ + const navigate = useNavigate() + useEffect(() => { + // home页动画状态 + userStore.setHomePageGotoStatus(false) + setTimeout(() => { + userStore.setHomePageGotoStatus(true) + setMainStyle([css.main].join(' ')) + }, 900) + // 获取userInfo + },[0]) + + // 跳转 + const [oldPath, setOldPath] = useState('') + function goto(path){ + if(oldPath == path)return; + // 记录上次跳转位置,防止重复 + setOldPath(path) + // 修改可用状态 + userStore.setHomePageGotoStatus(false) + // 展开动画 + setMainStyle([css.temPageshow, css.main].join(' ')) + // 跳转 + navigate(path) + setTimeout(() => { + userStore.setHomePageGotoStatus(true) + setMainStyle(css.main) + }, 900) + } + // 全页 + const [homeStyle,setHomeStyle] = useState(['animate__fadeIn', 'animate__animated', 'animate__faster'].join(' ')) + // 主体 + const [mainStyle, setMainStyle] = useState([css.temPageshow, css.main].join(' ')) + + + // 菜单 + const [menuStyle, setMenuStyle] = useState([css.temUpShow, css.menu].join(' ')) + return( +
+
+ {/*主体*/} +
+ {/*菜单*/} +
+
+
+
userStore.homePageGotoStatus ? goto('/home') : ''} className={css.startIco}>
+
+
+
+ {/* 个人设置 */} +
+
设置
+
userStore.homePageGotoStatus ? goto('setting') : ''}>
+
+
+ {/* 用户系统 */} +
+
系统
+
+
+
+
+
+
+
+ {/*路由堆放点*/} + {/**/} +
+ ) +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/Home/index.module.scss b/01===sys22/baseSys/userSys/vision/src/view/Home/index.module.scss new file mode 100644 index 0000000..42d4dd5 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/Home/index.module.scss @@ -0,0 +1,245 @@ +.Home { + position: relative; + height: 100%; + width: 100%; + //background-image: linear-gradient(to bottom, transparent 75%, #ffffff 100%), radial-gradient(at 0% 0%, hsla(154, 4%, 50%, 0.25) 0, transparent 50%), radial-gradient(at 0% 50%, hsla(120, 5%, 50%, 0.23) 0, transparent 50%), radial-gradient(at 40% 40%, hsla(120, 4%, 50%, 0.21) 0, transparent 50%), radial-gradient(at 80% 0%, #ffffff 0, transparent 50%), radial-gradient(at 80% 50%, #ffffff 0, transparent 50%), radial-gradient(at 80% 50%, #ffffff 0, transparent 50%), linear-gradient(to bottom, transparent 75%, #ffffff 100%); + display: flex; + align-items: center; + justify-content: center; + user-select: none; + + & > div { + position: relative; + height: 100%; + width: 100%; + + display: flex; + flex-direction: column; + + overflow: hidden; + + background-image: url("bg0.jpg"); + background-position: center; + background-size: cover; + background-repeat: no-repeat; + + & > div.main { + position: relative; + flex: 1; + display: flex; + flex-direction: column; + padding: 1rem; + + & > div { + position: relative; + height: 100%; + width: 100%; + overflow: hidden; + border-radius: 1rem; + padding: 1rem; + box-sizing: border-box; + background-color: #cccccc11; + backdrop-filter: blur(20px); + box-shadow: 0 0 10px 3px #33333366; + + & > div { + overflow: hidden; + } + } + } + + & > div.menu { + position: relative; + flex-shrink: 0; + height: 5rem; + width: 100%; + + & > div.menuContainer { + position: relative; + margin: 0 auto; + width: fit-content; + width: -webkit-fit-content; + width: -moz-fit-content; + height: 100%; + border-radius: 1rem 1rem 0 0; + box-shadow: -1px -1px 10px 1px #66666699; + background: #ddddddaa; + backdrop-filter: blur(20px); + padding: 0 2rem; + display: flex; + align-items: center; + + & > div.start { + position: relative; + height: 100%; + display: flex; + align-items: center; + + & > div.startIco { + position: relative; + height: 100%; + width: 5rem; + display: flex; + align-items: center; + justify-content: center; + + & > img { + height: 4.5rem; + cursor: pointer; + transition: height ease-in-out 300ms; + background: #00000000; + + &:hover { + height: 5rem; + } + } + } + } + + & > div.kong { + position: relative; + width: 3px; + height: 3rem; + margin: 0 1rem; + border-radius: 1rem; + background: #fff; + } + + & > div.touchBar { + position: relative; + height: 100%; + display: flex; + align-items: center; + + & > div.cmdBox { + position: relative; + height: 100%; + width: 4rem; + + &:hover div:nth-child(1) { + //display: block; + opacity: 1; + top: -2.6rem; + } + + &:hover div:nth-child(3) { + width: 1rem; + opacity: 1; + box-shadow: 0px 3px 10px 2px #000; + } + + & > div:nth-child(1) { + position: absolute; + //display: none; + width: 100%; + top: -10px; + left: 0; + opacity: 0; + border-radius: 5px; + background: #FF9A00aa; + width: 4rem; + line-height: 1.6rem; + text-align: center; + margin: 0 auto; + right: 0; + font-size: 0.9rem; + transition: all ease-in-out 300ms; + } + + & > div:nth-child(2) { + position: relative; + height: 100%; + width: 4rem; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + + &:hover img { + width: 2.5rem; + } + + + & > img { + width: 2rem; + transition: width ease-in-out 300ms; + } + + } + + & > div:nth-child(3) { + position: absolute; + //background: #666; + opacity: 1; + width: 0; + height: 0px; + margin: 0 auto; + border-radius: 1rem; + left: 0; + right: 0; + bottom: 14px; + transition: all ease-in-out 300ms; + } + } + } + } + } + } +} + +$upShow: upShow; +$downHide: downHide; +@keyframes upShow { + from { + top: 100%; + } + to { + top: 0; + } +} +.temUpShow{ + animation: upShow ease-in-out 400ms forwards; +} +.temDownHide{ + +} +$pageshow: pageshow; +$pagehide: pagehide; +@keyframes pageshow { + 0% { + transform: scale(0); + } + 60% { + transform: scale(1.01); + } + 75% { + transform: scale(0.98); + } + 90% { + transform: scale(1.005); + } + 100% { + transform: scale(1); + } +} + +@keyframes pagehide { + 0% { + transform: scale(1); + } + 30% { + transform: scale(1.1); + } + 100% { + transform: scale(0); + display: none !important; + } +} +.temPageshow { + display: flex !important; + animation: pageshow ease-in-out 600ms forwards; +} + +.temPagehide { + animation: pagehide ease-in-out 600ms forwards; +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/Home/rocket.svg b/01===sys22/baseSys/userSys/vision/src/view/Home/rocket.svg new file mode 100644 index 0000000..b3cd64d --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/Home/rocket.svg @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/Home/setting.svg b/01===sys22/baseSys/userSys/vision/src/view/Home/setting.svg new file mode 100644 index 0000000..85eb5e2 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/Home/setting.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/Home/start.svg b/01===sys22/baseSys/userSys/vision/src/view/Home/start.svg new file mode 100644 index 0000000..859c362 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/Home/start.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/Index/background.jpg b/01===sys22/baseSys/userSys/vision/src/view/Index/background.jpg new file mode 100644 index 0000000..05f9cbf Binary files /dev/null and b/01===sys22/baseSys/userSys/vision/src/view/Index/background.jpg differ diff --git a/01===sys22/baseSys/userSys/vision/src/view/Index/index.jsx b/01===sys22/baseSys/userSys/vision/src/view/Index/index.jsx new file mode 100644 index 0000000..5f21886 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/Index/index.jsx @@ -0,0 +1,23 @@ +import css from './index.module.scss' +import background from './background.jpg' +import { useNavigate } from "react-router-dom"; +import 'animate.css' +import {useState} from "react"; + + + +export default function Index(){ + const navigate = useNavigate(); + const [goOutAnimate, setGoOutAnimate] = useState('animate__fadeInDown') + function go(){ + setGoOutAnimate('animate__fadeOutUp'); + setTimeout(() => { + navigate('/signIn') + },900) + } + return (
+
+
幽意
+
+
) +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/Index/index.module.scss b/01===sys22/baseSys/userSys/vision/src/view/Index/index.module.scss new file mode 100644 index 0000000..65a9b40 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/Index/index.module.scss @@ -0,0 +1,28 @@ +.Index{ + position: relative; + height: 100%; + width: 100%; + background-image: url("./background.jpg"); + background-position: center 100%; + background-repeat: no-repeat; + background-size:cover; + -moz-user-select:none; + -webkit-user-select:none; + user-select:none; + cursor: pointer; + & > div{ + position: relative; + height: 100%; + width: 100%; + backdrop-filter: blur(15px); + background: #33333333; + display: flex; + align-items: center; + justify-content: center; + & >div.title{ + font-size: 2.5rem; + color:#fefefe; + letter-spacing: 20px; + } + } +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/SignIn/index.jsx b/01===sys22/baseSys/userSys/vision/src/view/SignIn/index.jsx new file mode 100644 index 0000000..d6b8755 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/SignIn/index.jsx @@ -0,0 +1,246 @@ +import css from './index.module.scss' +import {userStore, netStore} from "@/store"; +import {useEffect, useRef, useState} from "react"; +import next from './next.svg'; +import Button from "@/components/Button"; +import {useNavigate} from "react-router-dom"; + + +export default function Login(){ + // 用户信息 + const [userInfo, setUserInfo] = useState('') + // 用户输入长度确认 + const [userInfoState, setUserInfoState] = useState('') + // 登录容器样式 + const [loginStyle, setLoginStyle] = useState(['animate__zoomIn', 'animate__animated', 'animate__faster'].join(' ')) + // 当前页 + const [pageNum, setPageNum] = useState(1) + // 第一屏样式 + const [page1Style, setPage1Style] = useState(css.page1) + // 第二屏样式 + const [page2Style, setPage2Style] = useState(css.page2) + // 登录或者注册 + const [signInOrOut, setSignInOrOut] = useState(true) + // 请求用户信息存在的状态 + const [checkUserInfoState, setCheckUserInfoState] = useState(true) + // 登陆方式 + const [loginMethod, setLoginMethod] = useState('') + // 密码 + const [password, setPassword] = useState('') + // 验证码 + const [verfCode, setVerfCode] = useState('') + // 发送验证码按钮状态 + const [sendBut, setSendBut] = useState(false) + // 路由跳转 + const navigate = useNavigate(); + + + // input + const input1 = useRef() + const input2 = useRef() + const input3 = useRef() + + + useEffect(() => { + if(pageNum == 1){ + input1.current.focus() + } + if(!signInOrOut){ + setTimeout(() => { + if(loginMethod == ''){ + input2.current.focus() + }else{ + input3.current.focus() + } + },800) + } + }, [pageNum,signInOrOut]) + + // 用户信息输入 + const userInfoInput = event => { + if(event.target.value.length >= 8){ + setUserInfoState(css.temNextShow) + }else if(event.target.value.length < 8){ + if(userInfo.length >= 8){ + setUserInfoState(css.temNextHide) + }else{ + setUserInfoState('') + } + } + setUserInfo(event.target.value) + } + const handleUserInfoKeyDown = event => { + // console.log(event) + switch (event.code){ + case 'Enter': + checkUserInfo() + break; + case 'Tab': + checkUserInfo() + event.preventDefault() + break; + } + } + // 密码输入 + const passwordInput = event => { + setPassword(event.target.value) + } + const handlePasswordKeyDown = event => { + if(event.code == 'Enter'){ + signIn() + } + } + // 验证码输入 + const verfCodeInput = event => { + setVerfCode(event.target.value) + } + + // 点击下一步,检验用户信息是否存在 + async function checkUserInfo(){ + if(!userInfoState && checkUserInfoState){ + return + } + setCheckUserInfoState(false) + const state = await netStore.checkOnly({username: userInfo}) + setPage1Style([css.page1, css.temSlideOutLeft].join(' ')) + setPage2Style([css.page2, css.temSlideOutLeft].join(' ')) + setSignInOrOut(state) + + + } + // 返回按钮的状态控制,300ms内不允许点击 + let goBackPage1State = true + // 返回第一页 + function goBackPage1(){ + if(goBackPage1State){ + goBackPage1State = false + setTimeout(() => { + goBackPage1State = true + },300) + }else{ + return + } + setSignInOrOut(true) + setCheckUserInfoState(true) + setPage1Style([css.page1, css.temSlideInLeft].join(' ')) + setPage2Style([css.page2, css.temSlideInLeft].join(' ')) + } + // 切换登陆方式 + function changeLoginMethod(){ + loginMethod == '' ? setLoginMethod(css.left) : setLoginMethod('') + loginMethod != '' ? input2.current.focus() : input3.current.focus() + } + // 发送验证码 + async function sendEmail(){ + setSendBut(true) + let status = 60 + const sendEmailInterval = setInterval(() => { + status-- + if(status == 0){ + setSendBut(false) + clearInterval(sendEmailInterval) + } + },1000) + const state = await netStore.sendCode({username:userInfo}) + console.log(state) + } + // 登录 + let signInState = true + async function signIn(){ + console.log('点击登录') + if(!signInState){ + return + } + setTimeout(() => { + signInState = true + },3000) + const data = { + username:userInfo + } + if(loginMethod == ''){ + // 密码登录 + data.password = password; + if(password.length < 8){ + alert('密码长度不正确') + return + } + }else{ + // 验证码登录 + if(verfCode.length != 4){ + alert('验证码格式错误') + return + } + data.code = verfCode; + } + const state = await netStore.signIn(data) + signInState = true + if(state){ + setLoginStyle(['animate__zoomOut', 'animate__animated', 'animate__faster'].join(' ')) + setTimeout(() => { + navigate('/home') + },500) + }else{ + alert('登陆失败') + } + } + + // 注册 + function signUp(){ + userStore.setSignInUsername(userInfo) + setLoginStyle(['animate__zoomOut', 'animate__animated', 'animate__faster'].join(' ')) + setTimeout(() => { + navigate('/signUp') + },500) + } + + return( +
+
+
{userStore.config.projectName}
+
+ {/*密码登录和验证码登陆切换*/} +
+ {!signInOrOut &&
+
+
+
验证码
+
} +
+ {/*登录页第一屏,输入用户信息*/} +
+
+
+
+
+ +
+
+
+ {/*登录页第二屏,输入验证信息或前往注册*/} +
+ {!signInOrOut && +
+
+
+
+
+
+
+
+
+
+
} +
+
返回
+
signInOrOut ? signUp() : signIn() }> + {!signInOrOut &&
登录
} + {signInOrOut &&
注册
} +
+
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/SignIn/index.module.scss b/01===sys22/baseSys/userSys/vision/src/view/SignIn/index.module.scss new file mode 100644 index 0000000..8ce328f --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/SignIn/index.module.scss @@ -0,0 +1,433 @@ +.login { + position: relative; + height: 100%; + width: 100%; + + background-image: linear-gradient(to bottom, transparent 75%, #ffffff 100%), radial-gradient(at 0% 0%, hsla(154, 4%, 50%, 0.25) 0, transparent 50%), radial-gradient(at 0% 50%, hsla(120, 5%, 50%, 0.23) 0, transparent 50%), radial-gradient(at 40% 40%, hsla(120, 4%, 50%, 0.21) 0, transparent 50%), radial-gradient(at 80% 0%, #ffffff 0, transparent 50%), radial-gradient(at 80% 50%, #ffffff 0, transparent 50%), radial-gradient(at 80% 50%, #ffffff 0, transparent 50%), linear-gradient(to bottom, transparent 75%, #ffffff 100%); + background-position: center; + background-size: cover; + background-repeat: no-repeat; + + display: flex; + align-items: center; + justify-content: center; + + user-select: none; + + & > div { + position: relative; + width: 18rem; + height: 25rem; + backdrop-filter: blur(20px); + + display: flex; + flex-direction: column; + + overflow: hidden; + + background: #00ADB5; + border-radius: 1rem; + padding: 1rem; + box-sizing: border-box; + + & > div.title { + position: relative; + font-size: 1.6rem; + line-height: 4rem; + text-align: center; + flex-shrink: 0; + } + + & > div.icon { + position: relative; + text-align: center; + height: 4rem; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + + & > img { + width: 2rem; + } + } + + & > div:nth-child(3) { + position: relative; + flex-shrink: 0; + height: 1.5rem; + + & > div { + position: relative; + width: 7rem; + border-radius: 2rem; + border: 1px solid #fefefe; + display: flex; + font-size: 0.8rem; + line-height: 1.3rem; + margin: 0 auto; + + & > div { + position: relative; + flex: 1; + text-align: center; + cursor: pointer; + color: #fefefe; + } + + & > div:nth-child(1) { + border-radius: 2rem; + position: absolute; + width: 50%; + left: 0; + background: #535bf2; + height: 100%; + transition: left ease-in-out 300ms; + } + + & > div:nth-child(1).left { + left: 50%; + } + } + } + + & > div.loginBox { + position: relative; + flex: 1; + height: 100%; + width: 100%; + padding: 1rem; + box-sizing: border-box; + overflow: hidden; + display: flex; + //flex-wrap: wrap; + + & > div.page1 { + position: relative; + height: 100%; + width: 100%; + display: flex; + flex-shrink: 0; + flex-direction: column; + + & > div { + position: relative; + + display: flex; + align-items: center; + justify-content: center; + } + + & > div:nth-child(1) { + flex: 1; + + & > input { + width: 100%; + border-radius: 5px; + font-size: 1rem; + line-height: 1.5rem; + padding: 0.5rem; + box-sizing: border-box; + text-align: center; + } + } + + & > div:nth-child(2) { + height: 0; + overflow: hidden; + + & > div { + position: relative; + background: #535bf2; + height: 3.5rem; + width: 3.5rem; + margin: 0 auto; + cursor: pointer; + border-radius: 1.8rem; + display: flex; + align-items: center; + justify-content: center; + + transition: box-shadow ease-in-out 300ms; + + &:hover { + box-shadow: 0px 0px 10px -1px #33333399; + } + + & > img { + width: 2rem; + padding: 0.8rem; + } + } + } + } + + & > div.page2 { + position: relative; + height: 100%; + width: 100%; + display: flex; + flex-shrink: 0; + flex-direction: column; + margin-left: 2rem; + + & > div { + position: relative; + flex: 1; + display: flex; + align-items: center; + justify-content: center; + } + + & > div.input { + position: relative; + display: block; + + & > div { + position: absolute; + left: 0; + right: 0; + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + + & input { + width: 100%; + border-radius: 5px; + font-size: 1rem; + line-height: 1.5rem; + padding: 0.5rem; + box-sizing: border-box; + text-align: center; + } + } + + & > div:nth-child(1) { + } + + & > div:nth-child(2) { + position: relative; + width: 100%; + + & > div { + display: flex; + width: 100%; + overflow: hidden; + & > input { + display: block; + flex: 1; + } + + & > div:nth-child(2) { + position: relative; + flex-shrink: 0; + width: 6rem; + //margin-left: 0.5rem; + font-size: 0.8px; + display: flex; + align-items: center; + justify-content: center; + & > div{ + padding: 0; + margin: 0; + } + } + } + } + + // 登陆方式切换动画 + $tdShow: tdShow; + $tdHide: tdHide; + @keyframes tdHide { + 0% { + transform: rotateX(0deg); + opacity: 1; + } + 100% { + transform: rotateX(90deg); + opacity: 0; + display: none; + overflow: hidden; + } + } + @keyframes tdShow { + 0% { + transform: rotateX(90deg); + opacity: 0; + display: none; + overflow: hidden; + } + 100% { + transform: rotateX(0deg); + opacity: 1; + } + } + + .temTdHide { + animation: tdHide ease-in-out 500ms forwards; + } + + .temTdShow { + animation: tdShow ease-in-out 500ms forwards; + } + + $tdShow2: tdShow2; + $tdHide2: tdHide2; + @keyframes tdHide2 { + 0% { + transform: rotateX(0deg); + opacity: 1; + } + 100% { + transform: rotateX(90deg); + opacity: 0; + display: none; + overflow: hidden; + } + } + @keyframes tdShow2 { + 0% { + transform: rotateX(-90deg); + opacity: 0; + display: none; + overflow: hidden; + } + 100% { + transform: rotateX(0deg); + opacity: 1; + } + } + + .temTdHide2 { + animation: tdHide2 ease-in-out 500ms forwards; + } + + .temTdShow2 { + animation: tdShow2 ease-in-out 500ms forwards; + } + } + + & > div.button { + position: relative; + overflow: hidden; + display: flex; + + & > div { + position: relative; + display: flex; + align-items: center; + justify-content: center; + height: 2.5rem; + background: #535bf2; + border-radius: 5px; + color: #fefefe; + cursor: pointer; + } + + & > div:nth-child(1) { + width: 4.5rem; + transition: width ease-in-out 300ms; + + &:hover { + width: 8rem; + } + } + + & > div:nth-child(2) { + flex: 1; + margin-left: 1rem; + text-align: center; + } + } + } + } + } +} + + +$nextShow: nextShow; +$nextHide: nextHide; +@keyframes nextShow { + 0% { + height: 0; + } + 100% { + height: 50%; + } +} + +@keyframes nextHide { + 0% { + height: 50%; + } + 100% { + height: 0; + } +} + +.temNextShow { + animation: nextShow ease-in-out 300ms forwards; +} + +.temNextHide { + animation: nextHide ease-in-out 300ms forwards; +} + +$slideOutLeft: slideOutLeft; +$slideOutRight: slideOutRight; +$slideInLeft: slideInLeft; +$slideInRight: slideInRight; + +@keyframes slideOutLeft { + from { + left: 0; + } + to { + left: calc(-100% - 2rem); + } +} + +@keyframes slideOutRight { + from { + left: 0; + } + to { + left: calc(100% - 2rem); + } +} + +@keyframes slideInLeft { + from { + left: -100% + } + to { + left: 0; + } +} + +@keyframes slideInRight { + from { + left: 100% + } + to { + left: 0; + } +} + +.temSlideOutLeft { + animation: slideOutLeft ease-in-out 500ms forwards; +} + +.temSlideOutRight { + animation: slideOutRight ease-in-out 500ms forwards; +} + +.temSlideInLeft { + animation: slideInLeft ease-in-out 500ms forwards; +} + +.temSlideInRight { + animation: slideInRight ease-in-out 500ms forwards; +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/SignIn/next.svg b/01===sys22/baseSys/userSys/vision/src/view/SignIn/next.svg new file mode 100644 index 0000000..09d79f3 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/SignIn/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/SignUp/index.jsx b/01===sys22/baseSys/userSys/vision/src/view/SignUp/index.jsx new file mode 100644 index 0000000..4271699 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/SignUp/index.jsx @@ -0,0 +1,272 @@ +import css from './index.module.scss' +import {userStore, netStore} from "@/store"; +import {useState} from "react"; +import next from './next.svg'; +import Button from "@/components/Button"; +import {useNavigate} from "react-router-dom"; + +export default function SignUp() { + // 用户名 + const [username, setUsername] = useState(userStore.signInUsername ? userStore.signInUsername : '') + // 密码 + const [password, setPassword] = useState('') + // 电子邮件 + const [email, setEmail] = useState('') + // 手机号 + const [phone, setPhone] = useState('') + // 性别 + const [sex, setSex] = useState('') + // 昵称 + const [nickname, setNickname] = useState('') + // 身份证 + const [personal, setPersonal] = useState('') + // 邮箱验证码 + const [code, setCode] = useState('') + // 路由跳转 + const navigate = useNavigate(); + + // 设置值 + const method = { + username: setUsername, + password: setPassword, + email: setEmail, + phone: setPhone, + sex: setSex, + nickname: setNickname, + personal: setPersonal, + code: setCode + } + // 用户名可使用状态 + const [userCanuse, setUserCanuse] = useState('') + // 邮箱可使用状态 + const [emailCanuse, setEmailCanuse] = useState('') + // 昵称不可为空 + const [nicknameCanuse, setNicknameCanuse] = useState('') + // 密码验证 + const [passwordCanuse, setPasswordCanuse] = useState('') + // 验证码验证 + const [codeCanuse, setCodeCanuse] = useState('') + + // 当前页 + const [nowPage, setNowPage] = useState(1) + + // 输入 + function handleChangeInput(event) { + const inputType = event.target.getAttribute('iname') + if (inputType == 'code') { + if (event.target.value.length >= 0 && event.target.value.length <= 4) { + method[inputType](event.target.value) + } + } else { + method[inputType](event.target.value) + } + + } + + // 用户名验证 + const [checkUserStatus, setCheckUserStatus] = useState(true) + function handleUsernameKeyUp() { + if (!checkUserStatus) { + setCheckUserStatus(true) + } + } + async function handleUsernameBlur() { + if(username.length < 8){ + setUserCanuse('账户名称异常!') + return + } + if (checkUserStatus) { + setCheckUserStatus(false) + const status = await netStore.checkOnly({ + username: username.trim().toLowerCase() + }) + if (status) { + setUserCanuse('') + } else { + setUserCanuse('此用户名称已存在!') + } + } + } + + // 邮箱验证 + const [checkEmailStatus, setCheckEmailStatus] = useState(true) + function handleEmailKeyUp(event) { + if (!checkEmailStatus) { + setCheckEmailStatus(true) + } + } + async function handleEmailBlur() { + if (checkEmailStatus) { + if (/^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(email)) { + + } else { + setEmailCanuse('邮箱格式错误!') + return + } + setCheckEmailStatus(false); + // 验证邮箱 + const status = await netStore.checkOnly({ + email: email.trim().toLowerCase() + }) + if (status) { + setEmailCanuse('') + } else { + setEmailCanuse('此邮箱已存在!') + } + + } + } + + // 验证昵称 + function handleCheckNickname() { + if (nickname.length < 1 || nickname.length > 16) { + setNicknameCanuse('昵称不规范!') + }else{ + setNicknameCanuse('') + } + } + function handleNicknameKeyUp(event){ + console.log(event.target.value) + switch (event.code){ + case 'Enter': + nextPage() + break; + } + } + + // 下一页,发送邮件验证 + async function nextPage() { + if(nickname.length < 2 || username.length < 8 || email.length < 6){ + alert('请验证输入') + }else if (nicknameCanuse.length != 0 || userCanuse.length != 0 || emailCanuse.length != 0) { + alert('请验证输入') + } else { + // 下一页 + setPage1Style([css.page1, css.temPagehide].join(' ')) + setTimeout(() => { + setPage2Style([css.page2, css.temPageshow].join(' ')) + }, 450) + // 发送验证码 + const res = await netStore.sendCode({username,email}, 'signUp') + console.log(res) + setNowPage(2) + } + } + + // 验证密码 + function handleCheckPassword() { + if (password.length < 8 || password.length > 128) { + setPasswordCanuse('密码格式异常!') + }else{ + setPasswordCanuse('') + } + } + // 验证验证码 + function handleCheckCode() { + if (code.length != 4) { + setCodeCanuse('验证码格式异常!') + }else{ + setCodeCanuse('') + } + } + // 注册 + async function SIGNUP(){ + if(password.length < 8 || code.length != 4){ + alert('请验证输入!') + }else if(codeCanuse.length !=0 || passwordCanuse.length != 0){ + alert('请验证输入!') + }else{ + const res = await netStore.signUp({ + username, + password, + code, + email, + nickname + }) + if(res){ + alert('注册成功') + } + setSignUpStyle(['animate__slideOutDown', 'animate__animated', 'animate__fast'].join(' ')) + setTimeout(() => { + navigate('/home') + }, 500) + } + } + + const [signUpStyle, setSignUpStyle] = useState(['animate__slideInUp', 'animate__animated', 'animate__fast'].join(' ')) + const [page1Style, setPage1Style] = useState([css.page1, css.temPageshow].join(' ')) + const [page2Style, setPage2Style] = useState([css.page2].join(' ')) + + return
+
+
注册
+ {/*
*/} +
+
+
+
+
账户
+
{userCanuse}
+
+
+ +
+
+
+
+
+
+
+
邮箱
+
{emailCanuse}
+
+
+ +
+
+
+
+
昵称
+
{nicknameCanuse}
+
+
+ +
+
+
+
+
+
+
+
+
+
密码
+
{passwordCanuse}
+
+
+ +
+
+
+
+
验证码
+
{codeCanuse}
+
+
+ +
+
+
+
+
+
+
+
+
+
+} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/SignUp/index.module.scss b/01===sys22/baseSys/userSys/vision/src/view/SignUp/index.module.scss new file mode 100644 index 0000000..7220287 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/SignUp/index.module.scss @@ -0,0 +1,225 @@ +.SignUp { + position: relative; + height: 100%; + width: 100%; + + background-image: linear-gradient(to bottom, transparent 75%, #ffffff 100%), radial-gradient(at 0% 0%, hsla(154, 4%, 50%, 0.25) 0, transparent 50%), radial-gradient(at 0% 50%, hsla(120, 5%, 50%, 0.23) 0, transparent 50%), radial-gradient(at 40% 40%, hsla(120, 4%, 50%, 0.21) 0, transparent 50%), radial-gradient(at 80% 0%, #ffffff 0, transparent 50%), radial-gradient(at 80% 50%, #ffffff 0, transparent 50%), radial-gradient(at 80% 50%, #ffffff 0, transparent 50%), linear-gradient(to bottom, transparent 75%, #ffffff 100%); + background-position: center; + background-size: cover; + background-repeat: no-repeat; + + display: flex; + align-items: center; + justify-content: center; + + user-select: none; + + & > div { + position: relative; + width: 300px; + height: 450px; + backdrop-filter: blur(20px); + + display: flex; + flex-direction: column; + + overflow: hidden; + + background: #00ADB5; + border-radius: 1rem; + padding: 1rem; + box-sizing: border-box; + + & > div.title { + position: relative; + font-size: 1.6rem; + line-height: 4rem; + text-align: center; + flex-shrink: 0; + } + + & > div.icon { + position: relative; + text-align: center; + height: 4rem; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + + & > img { + width: 2rem; + } + } + + & > div.signUpBox { + position: relative; + flex: 1; + box-sizing: border-box; + padding: 1rem; + display: flex; + overflow: hidden; + flex-direction: column; + //background: red; + & > div.username { + position: relative; + margin-bottom: 1rem; + flex-shrink: 0; + } + + & > div:nth-child(2) { + position: relative; + flex: 1; + + & > div{ + width: 100%; + } + + & > div.page1 { + position: absolute; + display: flex; + flex-direction: column; + height: 100%; + + & > div { + position: relative; + flex: 1; + } + + & > div:nth-child(3) { + display: flex; + align-items: center; + justify-content: center; + + & > div { + background: #535bf2; + height: 3.5rem; + width: 3.5rem; + margin: 0 auto; + cursor: pointer; + border-radius: 1.8rem; + display: flex; + align-items: center; + justify-content: center; + + transition: box-shadow ease-in-out 300ms; + + &:hover { + box-shadow: 0px 0px 10px -1px #33333399; + } + + & > img { + width: 2rem; + padding: 0.8rem; + } + } + } + } + & > div.page2 { + position: absolute; + left: 0; + top: 0; + height: 100%; + display: none; + flex-direction: column; + & > div{ + position: relative; + flex: 1; + } + & > div:nth-child(3){ + display: flex; + align-items: center; + justify-content: center; + } + } + } + } + } +} + +.inputBox { + & > div.title { + position: relative; + margin: 0.5rem 0; + padding: 0; + display: flex; + + & > div { + position: relative; + } + + & > div.label { + flex-shrink: 0; + width: 5rem; + font-size: 1rem; + } + + & > div.message { + position: relative; + flex: 1; + overflow: hidden; + color: #E84545ee; + font-size: 0.9rem; + display: flex; + align-items: center; + justify-content: center; + } + } + + & > div.input { + position: relative; + width: 100%; + overflow: hidden; + display: flex; + + & > input { + flex: 1; + border-radius: 5px; + line-height: 2rem; + box-sizing: border-box; + padding: 0.1rem 0.3rem; + text-align: center; + } + } +} + +$pageshow: pageshow; +$pagehide: pagehide; +@keyframes pageshow { + 0% { + transform: scale(0); + } + 60% { + transform: scale(1.05); + } + 75% { + transform: scale(0.95); + } + 90% { + transform: scale(1.03); + } + 100% { + transform: scale(1); + } +} + +@keyframes pagehide { + 0% { + transform: scale(1); + } + 30% { + transform: scale(1.1); + } + 100% { + transform: scale(0); + display: none !important; + } +} +.temPageshow { + display: flex !important; + animation: pageshow ease-in-out 600ms forwards; +} + +.temPagehide { + animation: pagehide ease-in-out 600ms forwards; +} \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/src/view/SignUp/next.svg b/01===sys22/baseSys/userSys/vision/src/view/SignUp/next.svg new file mode 100644 index 0000000..09d79f3 --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/src/view/SignUp/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/test/backdrop.html b/01===sys22/baseSys/userSys/vision/test/backdrop.html new file mode 100644 index 0000000..d53385d --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/test/backdrop.html @@ -0,0 +1,68 @@ + + + + + Title + + + + +
+
+
+ 这是文字 +
+ +
+
+
+
+ +
+
+ + + \ No newline at end of file diff --git a/01===sys22/baseSys/userSys/vision/vite.config.js b/01===sys22/baseSys/userSys/vision/vite.config.js new file mode 100644 index 0000000..853308f --- /dev/null +++ b/01===sys22/baseSys/userSys/vision/vite.config.js @@ -0,0 +1,28 @@ +import {defineConfig} from 'vite' +import react from '@vitejs/plugin-react' +import {resolve} from "path"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + resolve: { + alias: [ + { + find: '@', + replacement: resolve(__dirname, 'src') + }, + ] + }, + server: { + proxy: { + '/api': { // 匹配请求路径,localhost:3000/snow + target: 'http://localhost:3000', // 代理的目标地址 + changeOrigin: true, // 开发模式,默认的origin是真实的 origin:localhost:3000 代理服务会把origin修改为目标地址 + // secure: true, // 是否https接口 + // ws: true, // 是否代理websockets + // rewrite target目标地址 + '/abc',如果接口是这样的,那么不用重写 + // rewrite: (path) => path.replace(/^\/snow/, '') // 路径重写,本项目不需要重写 + } + } + }, +}) diff --git a/01===sys22/list.md b/01===sys22/list.md new file mode 100644 index 0000000..29820ba --- /dev/null +++ b/01===sys22/list.md @@ -0,0 +1,8 @@ +# 文档结构说明 + +```bash +|------baseSys # 基础系统 +|------.gitignore # git排除文件 +|------list.md # 根目录结构说明 +|------README.md # 系统说明 +``` \ No newline at end of file diff --git a/02=A.I.N.Y/README.md b/02=A.I.N.Y/README.md new file mode 100644 index 0000000..311adda --- /dev/null +++ b/02=A.I.N.Y/README.md @@ -0,0 +1,12 @@ +# A.I.N.Y + +希望可以坚持下去 + +# HotoKiss 2023-01-04 + +> 参考素锦 背景图 `/src/assets/index.png` + +前端: + +1. 参考HELLO WORLD的开场动画,调用素锦的北京 +2. 线框风格 diff --git a/02=A.I.N.Y/Ying-Drosophila/.gitignore b/02=A.I.N.Y/Ying-Drosophila/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/02=A.I.N.Y/Ying-Drosophila/index.html b/02=A.I.N.Y/Ying-Drosophila/index.html new file mode 100644 index 0000000..25e8fad --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
+ + + diff --git a/02=A.I.N.Y/Ying-Drosophila/package.json b/02=A.I.N.Y/Ying-Drosophila/package.json new file mode 100644 index 0000000..267e22e --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/package.json @@ -0,0 +1,24 @@ +{ + "name": "ying-drosophila", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "start": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "mobx": "^6.7.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.6.1", + "sass": "^1.57.1" + }, + "devDependencies": { + "@types/react": "^18.0.26", + "@types/react-dom": "^18.0.9", + "@vitejs/plugin-react": "^3.0.0", + "vite": "^4.0.0" + } +} \ No newline at end of file diff --git a/02=A.I.N.Y/Ying-Drosophila/pnpm-lock.yaml b/02=A.I.N.Y/Ying-Drosophila/pnpm-lock.yaml new file mode 100644 index 0000000..a9e36a8 --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/pnpm-lock.yaml @@ -0,0 +1,1070 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + mobx: + specifier: ^6.7.0 + version: 6.12.4 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + react-router-dom: + specifier: ^6.6.1 + version: 6.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + sass: + specifier: ^1.57.1 + version: 1.77.6 + devDependencies: + '@types/react': + specifier: ^18.0.26 + version: 18.3.3 + '@types/react-dom': + specifier: ^18.0.9 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^3.0.0 + version: 3.1.0(vite@4.5.3(sass@1.77.6)) + vite: + specifier: ^4.0.0 + version: 4.5.3(sass@1.77.6) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.7': + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.7': + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.7': + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.24.7': + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.24.7': + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.24.7': + resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.7': + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.7': + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.7': + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.7': + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.24.7': + resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.24.7': + resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.24.7': + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.7': + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.7': + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + engines: {node: '>=6.9.0'} + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@remix-run/router@1.16.1': + resolution: {integrity: sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==} + engines: {node: '>=14.0.0'} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + + '@vitejs/plugin-react@3.1.0': + resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.1.0-beta.0 + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + caniuse-lite@1.0.30001636: + resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + electron-to-chromium@1.4.805: + resolution: {integrity: sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + immutable@4.3.6: + resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + + mobx@6.12.4: + resolution: {integrity: sha512-uIymg89x+HmItX1p3MG+d09irn2k63J6biftZ5Ok+UpNojS1I3NJPLfcmJT9ANnUltNlHi+HQqrVyxiAN8ISYg==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.23.1: + resolution: {integrity: sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.23.1: + resolution: {integrity: sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + sass@1.77.6: + resolution: {integrity: sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==} + engines: {node: '>=14.0.0'} + hasBin: true + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + vite@4.5.3: + resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/compat-data@7.24.7': {} + + '@babel/core@7.24.7': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.7': + dependencies: + '@babel/types': 7.24.7 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.24.7': + dependencies: + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + browserslist: 4.23.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/helper-hoist-variables@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.24.7': {} + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-string-parser@7.24.7': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.7': {} + + '@babel/helpers@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/template@7.24.7': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/traverse@7.24.7': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.7': + dependencies: + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@remix-run/router@1.16.1': {} + + '@types/prop-types@15.7.12': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.3 + + '@types/react@18.3.3': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@vitejs/plugin-react@3.1.0(vite@4.5.3(sass@1.77.6))': + dependencies: + '@babel/core': 7.24.7 + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) + magic-string: 0.27.0 + react-refresh: 0.14.2 + vite: 4.5.3(sass@1.77.6) + transitivePeerDependencies: + - supports-color + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + binary-extensions@2.3.0: {} + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.1: + dependencies: + caniuse-lite: 1.0.30001636 + electron-to-chromium: 1.4.805 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.1) + + caniuse-lite@1.0.30001636: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-name@1.1.3: {} + + convert-source-map@2.0.0: {} + + csstype@3.1.3: {} + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + electron-to-chromium@1.4.805: {} + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globals@11.12.0: {} + + has-flag@3.0.0: {} + + immutable@4.3.6: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + js-tokens@4.0.0: {} + + jsesc@2.5.2: {} + + json5@2.2.3: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.27.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + mobx@6.12.4: {} + + ms@2.1.2: {} + + nanoid@3.3.7: {} + + node-releases@2.0.14: {} + + normalize-path@3.0.0: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-refresh@0.14.2: {} + + react-router-dom@6.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.16.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.23.1(react@18.3.1) + + react-router@6.23.1(react@18.3.1): + dependencies: + '@remix-run/router': 1.16.1 + react: 18.3.1 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rollup@3.29.4: + optionalDependencies: + fsevents: 2.3.3 + + sass@1.77.6: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.6 + source-map-js: 1.2.0 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@6.3.1: {} + + source-map-js@1.2.0: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + update-browserslist-db@1.0.16(browserslist@4.23.1): + dependencies: + browserslist: 4.23.1 + escalade: 3.1.2 + picocolors: 1.0.1 + + vite@4.5.3(sass@1.77.6): + dependencies: + esbuild: 0.18.20 + postcss: 8.4.38 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + sass: 1.77.6 + + yallist@3.1.1: {} diff --git a/02=A.I.N.Y/Ying-Drosophila/public/vite.svg b/02=A.I.N.Y/Ying-Drosophila/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/02=A.I.N.Y/Ying-Drosophila/src/App.jsx b/02=A.I.N.Y/Ying-Drosophila/src/App.jsx new file mode 100644 index 0000000..1e1c31b --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/App.jsx @@ -0,0 +1,14 @@ +import {useState} from 'react' +import { useRoutes } from 'react-router-dom' +import indexRouterList from "./router" + + +export default function App() { + const indexRoute = useRoutes(indexRouterList) + return ( +
+ {indexRoute} +
+ ) +} + diff --git a/02=A.I.N.Y/Ying-Drosophila/src/assets/default.css b/02=A.I.N.Y/Ying-Drosophila/src/assets/default.css new file mode 100644 index 0000000..749f8a6 --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/assets/default.css @@ -0,0 +1,31 @@ +html{ + font-size: 62.5%; +} +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + /* 'Cantarell', */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color:#333; +} +p, h1, h2, h3, h4, h5, h6{ + margin: 0; + padding: 0; +} +fieldset, img,input,button { border:none; padding:0;margin:0;outline-style:none; } +ul, ol { list-style:none; } +textarea { resize:none; } +img {border:0; vertical-align:middle;} + +a{color:#333; text-decoration:none; } +a:hover{color:#C81623;} +h1,h2,h3,h4,h5,h6{text-decoration:none;font-weight:normal;} +s,i,em{font-style:normal;text-decoration:none;} +.col-red{color: #C81623!important;} +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} \ No newline at end of file diff --git a/02=A.I.N.Y/Ying-Drosophila/src/assets/default.scss b/02=A.I.N.Y/Ying-Drosophila/src/assets/default.scss new file mode 100644 index 0000000..d81b5ff --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/assets/default.scss @@ -0,0 +1,15 @@ +@mixin widthAuto{ + /*div宽度适应文字*/ + width:fit-content; + width:-webkit-fit-content; + width:-moz-fit-content; +} +@mixin noSelect{ + /*无法选中*/ + -webkit-touch-callout:none; + -webkit-user-select:none; + -khtml-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; +} \ No newline at end of file diff --git a/02=A.I.N.Y/Ying-Drosophila/src/assets/index.png b/02=A.I.N.Y/Ying-Drosophila/src/assets/index.png new file mode 100644 index 0000000..6ed756b Binary files /dev/null and b/02=A.I.N.Y/Ying-Drosophila/src/assets/index.png differ diff --git a/02=A.I.N.Y/Ying-Drosophila/src/assets/react.svg b/02=A.I.N.Y/Ying-Drosophila/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/02=A.I.N.Y/Ying-Drosophila/src/components/RouterAuth/index.jsx b/02=A.I.N.Y/Ying-Drosophila/src/components/RouterAuth/index.jsx new file mode 100644 index 0000000..98cd4fb --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/components/RouterAuth/index.jsx @@ -0,0 +1,15 @@ +import {useNavigate, useLocation} from "react-router-dom"; +import {useEffect} from "react"; + +export default function RouterAuth(props){ + const navigate = useNavigate(); + const location = useLocation(); + useEffect(() => { + const path = window.location.pathname + // console.log(location) + if(path == '/homes'){ + navigate('/home') + } + }) + return props.children +} \ No newline at end of file diff --git a/02=A.I.N.Y/Ying-Drosophila/src/main.jsx b/02=A.I.N.Y/Ying-Drosophila/src/main.jsx new file mode 100644 index 0000000..9f732da --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/main.jsx @@ -0,0 +1,16 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import {BrowserRouter} from "react-router-dom"; +import App from './App' +import './assets/default.css' +import RouterAuth from "./components/RouterAuth"; + +ReactDOM.createRoot(document.getElementById('root')).render( + + + + + + + +) diff --git a/02=A.I.N.Y/Ying-Drosophila/src/router/index.jsx b/02=A.I.N.Y/Ying-Drosophila/src/router/index.jsx new file mode 100644 index 0000000..8a7d828 --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/router/index.jsx @@ -0,0 +1,34 @@ +import { Navigate } from 'react-router-dom' + +import Index from '../view/Index' +import Home from '../view/Home' + +export default [ + // 路由表 + { + path:'/', + element: + }, + // { + // path:'/signIn', + // element: + // }, + // { + // path:'/signUp', + // element: + // }, + { + path: '/home', + element: , + // children:[ + // { + // path:'setting', + // element: + // } + // ] + }, + { + path: "", + element: + } +] \ No newline at end of file diff --git a/02=A.I.N.Y/Ying-Drosophila/src/store/default.js b/02=A.I.N.Y/Ying-Drosophila/src/store/default.js new file mode 100644 index 0000000..363a584 --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/store/default.js @@ -0,0 +1,58 @@ +import { observable, action, computed, makeObservable} from "mobx"; + +class DefaultStore { + // Token + token = null; + // 登陆时的注册名称 + signInUsername = null; + // home页跳转状态 + homePageGotoStatus = true; + // 用户信息 + userInfo = null; + + + + name = 'kangkang000'; + sex = '男'; + userObj = { + name: 'kangkang000', + age: 23, + token: '12345689' + } + + constructor() { + // mobx6 和以前版本这是最大的区别 + makeObservable(this, { + token:observable, + signInUsername:observable, + homePageGotoStatus:observable, + userInfo:observable, + + name: observable, + sex: observable, + userObj: observable, + setName: action, + titleName: computed + }); + + } + + + setName(v) { + console.log('触发action'); + this.name = v; + } + setUserObj(obj) { + this.userObj = obj; + } + + + get titleName(){ + return this.name+'___111'; + } + get userObject() { + return this.userObj; + } +} + +export default DefaultStore \ No newline at end of file diff --git a/02=A.I.N.Y/Ying-Drosophila/src/store/index.js b/02=A.I.N.Y/Ying-Drosophila/src/store/index.js new file mode 100644 index 0000000..a069bbb --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/store/index.js @@ -0,0 +1,3 @@ +import DefaultStore from './default' + +export const defaultStore = new DefaultStore() \ No newline at end of file diff --git a/02=A.I.N.Y/Ying-Drosophila/src/view/Home/index.jsx b/02=A.I.N.Y/Ying-Drosophila/src/view/Home/index.jsx new file mode 100644 index 0000000..eee43cf --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/view/Home/index.jsx @@ -0,0 +1,23 @@ +import {defaultStore} from "../../store"; +import css from './index.module.scss' + +export default function Home() { + + console.log(defaultStore.titleName) + + return ( +
+
+
+ +
+
+
+ ) +} \ No newline at end of file diff --git a/02=A.I.N.Y/Ying-Drosophila/src/view/Home/index.module.scss b/02=A.I.N.Y/Ying-Drosophila/src/view/Home/index.module.scss new file mode 100644 index 0000000..d1d98d3 --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/view/Home/index.module.scss @@ -0,0 +1,59 @@ +@import '../../assets/default.scss'; + +.Home { + position: relative; + height: 100vh; + width: 100vw; + overflow: hidden; + + &>header { + position: relative; + width: 100%; + + &>.container { + position: relative; + width: 80%; + max-width: 1200px; + margin: 0 auto; + + &>nav { + position: relative; + width: 100%; + display: flex; + margin: 1rem; + + &>div.content { + @include widthAuto; + position: relative; + border: 1px solid #33333399; + box-sizing: border-box; + padding: 1rem 1.5rem; + cursor: pointer; + letter-spacing: 0.5rem; + + &>div.sub { + position: absolute; + left: -0.8rem; + bottom: -0.5rem; + background-color: #99999999; + width: calc(100% + 0.6rem); + height: calc(100% + 0.3rem); + } + + &>div.sup { + position: absolute; + right: -0.8rem; + top: -0.4rem; + background-color: #aaaaaa99; + width: calc(100% + 0.5rem); + height: calc(100% + 0.7rem); + } + &>div.text{ + position: relative; + font-size: 1.4rem; + } + } + } + } + } +} \ No newline at end of file diff --git a/02=A.I.N.Y/Ying-Drosophila/src/view/Index/index.jsx b/02=A.I.N.Y/Ying-Drosophila/src/view/Index/index.jsx new file mode 100644 index 0000000..8d43144 --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/view/Index/index.jsx @@ -0,0 +1,27 @@ +import { useState } from 'react' +import css from './index.module.scss'; + +import {useNavigate} from 'react-router-dom' + +function App() { + const [count, setCount] = useState(0) + const navigate = useNavigate() + + return ( +
navigate('/home')}> +
+
+
HELLO
+
+
+
 WORL
+
 WORL
+
+
+
死生契阔,与子成说。执子之手,与子偕老。
+
+
+ ) +} + +export default App diff --git a/02=A.I.N.Y/Ying-Drosophila/src/view/Index/index.module.scss b/02=A.I.N.Y/Ying-Drosophila/src/view/Index/index.module.scss new file mode 100644 index 0000000..c0f6df9 --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/src/view/Index/index.module.scss @@ -0,0 +1,107 @@ +@import '../../assets/default.scss'; +$sign: sign; + +.index { + @include noSelect; + position: relative; + height: 100vh; + width: 100vw; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + + background: { + image: url('../../assets/index.png'); + position: center 100%; + repeat: no-repeat; + size: cover; + } + + ; + + &::before { + content: ''; + background-color: #cccccc33; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + backdrop-filter: blur(20px); + } + + .title_container { + position: relative; + font-size: 4rem; + line-height: 1.6em; + + .title { + position: relative; + display: flex; + letter-spacing: 0.1em; + font-weight: bold; + + .space { + position: relative; + width: 1em; + } + + .reversal { + position: relative; + + .base { + position: relative; + } + + .face { + position: absolute; + width: 0; + top: 0; + left: 0; + color: #fefefe; + background-color: #333; + overflow: hidden; + + // animation: sign linear 600ms forwards; + animation: { + name: sign; + timing-function: linear; + duration: 400ms; + delay: 1000ms; + fill-mode: forwards; + // iteration-count: infinite; + } + + ; + // animation-name 规定需要绑定到选择器的 keyframe 名称。。 + // animation-duration 规定完成动画所花费的时间,以秒或毫秒计。 + // animation-timing-function 规定动画的速度曲线。 + // animation-delay 规定在动画开始之前的延迟。 + // animation-iteration-count 规定动画应该播放的次数。 + // animation-direction 规定是否应该轮流反向播放动画。 + } + } + } + + .describe { + position: relative; + font-family: serif; + font-size: 1.3rem; + letter-spacing: 0.5rem; + text-align: center; + text-align-last:justify; + } + } +} + +@keyframes sign { + from { + width: 0; + } + + to { + width: 100%; + } +} \ No newline at end of file diff --git a/02=A.I.N.Y/Ying-Drosophila/vite.config.js b/02=A.I.N.Y/Ying-Drosophila/vite.config.js new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/02=A.I.N.Y/Ying-Drosophila/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/03=nest-learn/.eslintrc.js b/03=nest-learn/.eslintrc.js new file mode 100644 index 0000000..259de13 --- /dev/null +++ b/03=nest-learn/.eslintrc.js @@ -0,0 +1,25 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}; diff --git a/03=nest-learn/.gitignore b/03=nest-learn/.gitignore new file mode 100644 index 0000000..22f55ad --- /dev/null +++ b/03=nest-learn/.gitignore @@ -0,0 +1,35 @@ +# compiled output +/dist +/node_modules + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json \ No newline at end of file diff --git a/03=nest-learn/.prettierrc b/03=nest-learn/.prettierrc new file mode 100644 index 0000000..bb05c7f --- /dev/null +++ b/03=nest-learn/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "tabWidth": 4 +} \ No newline at end of file diff --git a/03=nest-learn/README.md b/03=nest-learn/README.md new file mode 100644 index 0000000..7322da3 --- /dev/null +++ b/03=nest-learn/README.md @@ -0,0 +1,7 @@ +# HotoKiss 2023-03-11 + +nestjs微服务学习,一点点没啥用 + +后端: + +1. fastify文件上传 diff --git a/03=nest-learn/nest-cli.json b/03=nest-learn/nest-cli.json new file mode 100644 index 0000000..f9aa683 --- /dev/null +++ b/03=nest-learn/nest-cli.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true + } +} diff --git a/03=nest-learn/package.json b/03=nest-learn/package.json new file mode 100644 index 0000000..35aca74 --- /dev/null +++ b/03=nest-learn/package.json @@ -0,0 +1,74 @@ +{ + "name": "nest-learn", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "scripts": { + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "nest start", + "start:dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@fastify/multipart": "^7.4.2", + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0", + "@nestjs/mapped-types": "*", + "@nestjs/platform-fastify": "^9.3.9", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", + "nacos": "^2.5.1", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.2.0" + }, + "devDependencies": { + "@nestjs/cli": "^9.0.0", + "@nestjs/schematics": "^9.0.0", + "@nestjs/testing": "^9.0.0", + "@types/express": "^4.17.13", + "@types/jest": "29.2.4", + "@types/node": "18.11.18", + "@types/supertest": "^2.0.11", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^8.0.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "jest": "29.3.1", + "prettier": "^2.3.2", + "source-map-support": "^0.5.20", + "supertest": "^6.1.3", + "ts-jest": "29.0.3", + "ts-loader": "^9.2.3", + "ts-node": "^10.0.0", + "tsconfig-paths": "4.1.1", + "typescript": "^4.7.4" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/03=nest-learn/pnpm-lock.yaml b/03=nest-learn/pnpm-lock.yaml new file mode 100644 index 0000000..b2d94ee --- /dev/null +++ b/03=nest-learn/pnpm-lock.yaml @@ -0,0 +1,6458 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@fastify/multipart': + specifier: ^7.4.2 + version: 7.7.3 + '@nestjs/common': + specifier: ^9.0.0 + version: 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/core': + specifier: ^9.0.0 + version: 9.4.3(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/mapped-types': + specifier: '*' + version: 2.0.5(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + '@nestjs/platform-fastify': + specifier: ^9.3.9 + version: 9.4.3(@fastify/static@6.12.0)(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@9.4.3(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(reflect-metadata@0.1.14)(rxjs@7.8.1)) + class-transformer: + specifier: ^0.5.1 + version: 0.5.1 + class-validator: + specifier: ^0.14.0 + version: 0.14.1 + nacos: + specifier: ^2.5.1 + version: 2.6.0 + reflect-metadata: + specifier: ^0.1.13 + version: 0.1.14 + rxjs: + specifier: ^7.2.0 + version: 7.8.1 + devDependencies: + '@nestjs/cli': + specifier: ^9.0.0 + version: 9.5.0 + '@nestjs/schematics': + specifier: ^9.0.0 + version: 9.2.0(chokidar@3.5.3)(typescript@4.9.5) + '@nestjs/testing': + specifier: ^9.0.0 + version: 9.4.3(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@9.4.3(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(reflect-metadata@0.1.14)(rxjs@7.8.1)) + '@types/express': + specifier: ^4.17.13 + version: 4.17.21 + '@types/jest': + specifier: 29.2.4 + version: 29.2.4 + '@types/node': + specifier: 18.11.18 + version: 18.11.18 + '@types/supertest': + specifier: ^2.0.11 + version: 2.0.16 + '@typescript-eslint/eslint-plugin': + specifier: ^5.0.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^5.0.0 + version: 5.62.0(eslint@8.57.0)(typescript@4.9.5) + eslint: + specifier: ^8.0.1 + version: 8.57.0 + eslint-config-prettier: + specifier: ^8.3.0 + version: 8.10.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^4.0.0 + version: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8) + jest: + specifier: 29.3.1 + version: 29.3.1(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + prettier: + specifier: ^2.3.2 + version: 2.8.8 + source-map-support: + specifier: ^0.5.20 + version: 0.5.21 + supertest: + specifier: ^6.1.3 + version: 6.3.4 + ts-jest: + specifier: 29.0.3 + version: 29.0.3(@babel/core@7.24.7)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(jest@29.3.1(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)))(typescript@4.9.5) + ts-loader: + specifier: ^9.2.3 + version: 9.5.1(typescript@4.9.5)(webpack@5.82.1) + ts-node: + specifier: ^10.0.0 + version: 10.9.2(@types/node@18.11.18)(typescript@4.9.5) + tsconfig-paths: + specifier: 4.1.1 + version: 4.1.1 + typescript: + specifier: ^4.7.4 + version: 4.9.5 + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@angular-devkit/core@16.0.1': + resolution: {integrity: sha512-2uz98IqkKJlgnHbWQ7VeL4pb+snGAZXIama2KXi+k9GsRntdcw+udX8rL3G9SdUGUF+m6+147Y1oRBMHsO/v4w==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/schematics-cli@16.0.1': + resolution: {integrity: sha512-6KLA125dpgd6oJGtiO2JpZAb92uOG3njQGIt7NFcuQGW/5GO7J41vMXH9cBAfdtbV8SIggSmR/cIEE9ijfj6YQ==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + + '@angular-devkit/schematics@16.0.1': + resolution: {integrity: sha512-A9D0LTYmiqiBa90GKcSuWb7hUouGIbm/AHbJbjL85WLLRbQA2PwKl7P5Mpd6nS/ZC0kfG4VQY3VOaDvb3qpI9g==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.7': + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.7': + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.7': + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.24.7': + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.24.7': + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.24.7': + resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.7': + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.7': + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.7': + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.7': + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.24.7': + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.24.7': + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.7': + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.7': + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.1': + resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fastify/accept-negotiator@1.1.0': + resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} + engines: {node: '>=14'} + + '@fastify/ajv-compiler@3.5.0': + resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} + + '@fastify/busboy@1.2.1': + resolution: {integrity: sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==} + engines: {node: '>=14'} + + '@fastify/cors@8.3.0': + resolution: {integrity: sha512-oj9xkka2Tg0MrwuKhsSUumcAkfp2YCnKxmFEusi01pjk1YrdDsuSYTHXEelWNW+ilSy/ApZq0c2SvhKrLX0H1g==} + + '@fastify/deepmerge@1.3.0': + resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} + + '@fastify/error@3.4.1': + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + + '@fastify/fast-json-stringify-compiler@4.3.0': + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + + '@fastify/formbody@7.4.0': + resolution: {integrity: sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==} + + '@fastify/merge-json-schemas@0.1.1': + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + + '@fastify/middie@8.3.0': + resolution: {integrity: sha512-h+zBxCzMlkEkh4fM7pZaSGzqS7P9M0Z6rXnWPdUEPfe7x1BCj++wEk/pQ5jpyYY4pF8AknFqb77n7uwh8HdxEA==} + + '@fastify/multipart@7.7.3': + resolution: {integrity: sha512-MG4Gd9FNEXc8qx0OgqoXM10EGO/dN/0iVQ8SrpFMU3d6F6KUfcqD2ZyoQhkm9LWrbiMgdHv5a43x78lASdn5GA==} + + '@fastify/send@2.1.0': + resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} + + '@fastify/static@6.12.0': + resolution: {integrity: sha512-KK1B84E6QD/FcQWxDI2aiUCwHxMJBI1KeCUzm1BwYpPY1b742+jeKruGHP2uOluuM6OkBPI8CIANrXcCRtC2oQ==} + + '@fastify/swagger-ui@1.10.2': + resolution: {integrity: sha512-f2mRqtblm6eRAFQ3e8zSngxVNEtiYY7rISKQVjPA++ZsWc5WYlPVTb6Bx0G/zy0BIoucNqDr/Q2Vb/kTYkOq1A==} + + '@fastify/swagger@8.14.0': + resolution: {integrity: sha512-sGiznEb3rl6pKGGUZ+JmfI7ct5cwbTQGo+IjewaTvtzfrshnryu4dZwEsjw0YHABpBA+kCz3kpRaHB7qpa67jg==} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + + '@nestjs/cli@9.5.0': + resolution: {integrity: sha512-Z7q+3vNsQSG2d2r2Hl/OOj5EpfjVx3OfnJ9+KuAsOdw1sKLm7+Zc6KbhMFTd/eIvfx82ww3Nk72xdmfPYCulWA==} + engines: {node: '>= 12.9.0'} + hasBin: true + + '@nestjs/common@9.4.3': + resolution: {integrity: sha512-Gd6D4IaYj01o14Bwv81ukidn4w3bPHCblMUq+SmUmWLyosK+XQmInCS09SbDDZyL8jy86PngtBLTdhJ2bXSUig==} + peerDependencies: + cache-manager: <=5 + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + cache-manager: + optional: true + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/core@9.4.3': + resolution: {integrity: sha512-Qi63+wi55Jh4sDyaj5Hhx2jOpKqT386aeo+VOKsxnd+Ql9VvkO/FjmuwBGUyzkJt29ENYc+P0Sx/k5LtstNpPQ==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/microservices': ^9.0.0 + '@nestjs/platform-express': ^9.0.0 + '@nestjs/websockets': ^9.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + + '@nestjs/mapped-types@2.0.5': + resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + class-transformer: ^0.4.0 || ^0.5.0 + class-validator: ^0.13.0 || ^0.14.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/platform-fastify@9.4.3': + resolution: {integrity: sha512-FgJyYpZQn97oaarzGKTwcKkrRZs9tv2OdwO0/roO0l/ytnG7eigc7Y3Hv/bDcxl2LngAhY3uXMAg3MMueWojsA==} + peerDependencies: + '@fastify/static': ^6.0.0 + '@fastify/view': ^7.0.0 + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + peerDependenciesMeta: + '@fastify/static': + optional: true + '@fastify/view': + optional: true + + '@nestjs/schematics@9.2.0': + resolution: {integrity: sha512-wHpNJDPzM6XtZUOB3gW0J6mkFCSJilzCM3XrHI1o0C8vZmFE1snbmkIXNyoi1eV0Nxh1BMymcgz5vIMJgQtTqw==} + peerDependencies: + typescript: '>=4.3.5' + + '@nestjs/testing@9.4.3': + resolution: {integrity: sha512-LDT8Ai2eKnTzvnPaJwWOK03qTaFap5uHHsJCv6dL0uKWk6hyF9jms8DjyVaGsaujCaXDG8izl1mDEER0OmxaZA==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + '@nestjs/microservices': ^9.0.0 + '@nestjs/platform-express': ^9.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nuxtjs/opencollective@0.3.2': + resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.10': + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/express-serve-static-core@4.19.3': + resolution: {integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.2.4': + resolution: {integrity: sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/node@18.11.18': + resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/superagent@8.1.7': + resolution: {integrity: sha512-NmIsd0Yj4DDhftfWvvAku482PZum4DBW7U51OvS8gvOkDDY0WT1jsVyDV3hK+vplrsYw8oDwi9QxOM7U68iwww==} + + '@types/supertest@2.0.16': + resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==} + + '@types/validator@13.12.0': + resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + engines: {node: '>=0.4.0'} + hasBin: true + + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + avvio@8.3.2: + resolution: {integrity: sha512-st8e519GWHa/azv8S87mcJvZs4WsgTBjOw/Ih1CP6u+8SZvcOeAYNG6JbsIrAUUJJ7JfmrnOkR8ipDS+u9SIRQ==} + + await-event@2.1.0: + resolution: {integrity: sha512-hADm2dFnyugZnfFoJ0Oug2T9xAT2gFdvxZXXnWUOFsHL+VTCvj4Q7oBOinUYzvAFeAD5HN1YSrP78iS3/SQ7iQ==} + + await-first@1.0.0: + resolution: {integrity: sha512-SK20HicVu6lXvNM0nS1flurrs4/1NdhvccvEn52Gf+vpERZnnkKBnJvAQDsYkzJnsHs1bRNNKEiobEet7a/0TA==} + engines: {node: '>= 6.0.0'} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.0.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + byte@2.0.0: + resolution: {integrity: sha512-rNiK8YxOMvquToaBubKxA10sjRIZ/taDqtc/1jLQA4X7aNDlA1XGx4Ciml3YxL8DskFz1XX3WFskSp0peKYSKg==} + engines: {node: '>= 8.0.0'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001636: + resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + circular-json-for-egg@1.0.0: + resolution: {integrity: sha512-BzMR1dg0+YqcFoMETHq0gFeQNNKliXI1Oe+C0nx/4npLaohsR7/Oj3UFht65MLwF7zs6x13gOr+f4+JeYni6vw==} + + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + + class-transformer@0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + + class-validator@0.14.1: + resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + cluster-client@2.1.2: + resolution: {integrity: sha512-0DdRIA04ws90MTE+w4WfgiTcBoIgk7HX24KpZSqfmUfuUzlsNBlOL7WvupYfpJNAF0lAOknw2DWmPRxP6K0YlQ==} + engines: {node: '>= 8.0.0'} + + co-gather@1.0.1: + resolution: {integrity: sha512-f3v1koF5sPfFhmI901quN9dwvHz02swCOqoAFi/DmODKARIMyOEdrUxIyAxYBS8nxf+WcbXPHrjcnel1A5suIw==} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + + copy-to@2.0.1: + resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-user-agent@1.0.0: + resolution: {integrity: sha512-bDF7bg6OSNcSwFWPu4zYKpVkJZQYVrAANMYB8bc9Szem1D0yKdm4sa/rOCs2aC9+2GMqQ7KnwtZRvDhmLF0dXw==} + engines: {node: '>= 0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + digest-header@1.1.0: + resolution: {integrity: sha512-glXVh42vz40yZb9Cq2oMOt70FIoWiv+vxNvdKdU8CwjLad25qHM3trLxhl9bVjdr6WaslIXhWpn0NO8T/67Qjg==} + engines: {node: '>= 8.0.0'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + egg-errors@2.3.2: + resolution: {integrity: sha512-E+Sx7IBVrfRyHSjFXaq4sCZ3Uk3ka9PYySaQ8VbRZmLEt9ENBCD99yVzLIeWUH2QfzvkrjY9El1eHmLeRx7cfw==} + engines: {node: '>=8.9.0'} + + egg-logger@2.9.1: + resolution: {integrity: sha512-TPYdNthc7yGV+08A2U4g1T1wgRAjfTnsYC53JgfdKiYukaH3na1KPXEu+TEWni7IooqkFGkQ0t0WY+ylWFnvbw==} + engines: {node: '>=8.5.0'} + + electron-to-chromium@1.4.805: + resolution: {integrity: sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} + engines: {node: '>=10.13.0'} + + equals@1.0.5: + resolution: {integrity: sha512-wI15a6ZoaaXPv+55+Vh2Kqn3+efKRv8QPtcGTjW5xmanMnQzESdAt566jevtMZyt3W/jwLDTzXpMph5ECDJ2zg==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.3: + resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@8.10.0: + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@4.2.1: + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-json-stringify@5.16.0: + resolution: {integrity: sha512-A4bg6E15QrkuVO3f0SwIASgzMzR6XC4qTyTqhf3hYXy0iazbAdZKwkE+ox4WgzKyzM6ygvbdq3r134UjOaaAnA==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@2.4.0: + resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} + + fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + + fastify@4.18.0: + resolution: {integrity: sha512-L5o/2GEkBastQ3HV0dtKo7SUZ497Z1+q4fcqAoPyq6JCQ/8zdk1JQEoTQwnBWCp+EmA7AQa6mxNqSAEhzP0RwQ==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-my-way@7.7.0: + resolution: {integrity: sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==} + engines: {node: '>=14'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + fork-ts-checker-webpack-plugin@8.0.0: + resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + + formstream@1.5.1: + resolution: {integrity: sha512-q7ORzFqotpwn3Y/GBK2lK7PjtZZwJHz9QE9Phv8zb5IrL9ftGLyi2zjGURON3voK8TaZ+mqJKERYN4lrHYTkUQ==} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inquirer@8.2.4: + resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} + engines: {node: '>=12.0.0'} + + inquirer@8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + engines: {node: '>=12.0.0'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-class-hotfix@0.0.6: + resolution: {integrity: sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-type-of@1.4.0: + resolution: {integrity: sha512-EddYllaovi5ysMLMEN7yzHEKh8A850cZ7pykrY1aNRQGn/CDjRDE9qEWbIdt7xGEVJmjBXzU/fNnC4ABTm8tEQ==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.3.1: + resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jkroso-type@1.1.1: + resolution: {integrity: sha512-zZgay+fPG6PgMUrpyFADmQmvLo39+AZa7Gc5pZhev2RhDxwANEq2etwD8d0e6rTg5NkwOIlQmaEmns3draC6Ng==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + + json-schema-resolver@2.0.0: + resolution: {integrity: sha512-pJ4XLQP4Q9HTxl6RVDLJ8Cyh1uitSs0CzDBAz1uoJ4sRD/Bk7cFSXL1FUXDW3zJ7YnfliJx6eu8Jn283bpZ4Yg==} + engines: {node: '>=10'} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + ko-sleep@1.1.4: + resolution: {integrity: sha512-s05WGpvvzyTuRlRE8fM7ru2Z3O+InbJuBcckTWKg2W+2c1k6SnFa3IfiSSt0/peFrlYAXgNoxuJWWVNmWh+K/A==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + libphonenumber-js@1.11.3: + resolution: {integrity: sha512-RU0CTsLCu2v6VEzdP+W6UU2n5+jEpMDRkGxUeBgsAJgre3vKgm17eApISH9OQY4G0jZYJVIc8qXmz6CJFueAFg==} + + light-my-request@5.9.1: + resolution: {integrity: sha512-UT7pUk8jNCR1wR7w3iWfIjx32DiB2f3hFdQSOwy3/EPQ3n3VocyipUxcyRZR0ahoev+fky69uA+GejPa9KuHKg==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + + lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + macos-release@2.5.1: + resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} + engines: {node: '>=6'} + + magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mnemonist@0.39.5: + resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + mz-modules@2.1.0: + resolution: {integrity: sha512-sjk8lcRW3vrVYnZ+W+67L/2rL+jbO5K/N6PFGIcLWTiYytNr22Ah9FDXFs+AQntTM1boZcoHi5qS+CV1seuPog==} + engines: {node: '>=6.0.0'} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nacos-config@2.6.0: + resolution: {integrity: sha512-oTUN1CjjNQ83xmNoFOxgtBIIfeKNedhSG0Ece+Vf6R1PGCCcILs4fxFEMJKlrgo/+hCMizeOawVnbuP9ND2A5A==} + engines: {node: '>= 8.0.0'} + + nacos-naming@2.6.0: + resolution: {integrity: sha512-yS2jSuUzesuYsAwvz6TbfdD9z5s20CkUxkgG/GDATPnDpZPJhPj7lVfJrduWSh1FoajIFQ7tQgBZcS3EFcnIdw==} + engines: {node: '>= 8.0.0'} + + nacos@2.6.0: + resolution: {integrity: sha512-Brd0b5ZtaqmfFk3szmt0mBEnvvIjZLPJBYELm6i5Kovg7sPAQK0SCgHz5R5kX/ZYFwEYPp3ymSn/85w0Qk/VlA==} + engines: {node: '>= 8.0.0'} + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-hex@1.0.1: + resolution: {integrity: sha512-iwpZdvW6Umz12ICmu9IYPRxg0tOLGmU3Tq2tKetejCj3oZd7b2nUXwP3a7QA5M9glWy8wlPS1G3RwM/CdsUbdQ==} + engines: {node: '>=8.0.0'} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + + os-name@1.0.3: + resolution: {integrity: sha512-f5estLO2KN8vgtTRaILIgEGBoBrMnZ3JQ7W9TMZCnOIGwHe8TRGSpcagnWDo+Dfhd/z08k9Xe75hvciJJ8Qaew==} + engines: {node: '>=0.10.0'} + hasBin: true + + os-name@4.0.1: + resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + osenv@0.1.5: + resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} + deprecated: This package is no longer supported. + + osx-release@1.1.0: + resolution: {integrity: sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==} + engines: {node: '>=0.10.0'} + hasBin: true + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@3.2.0: + resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + + pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + + pino@8.21.0: + resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process-warning@2.3.2: + resolution: {integrity: sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + qs@6.12.1: + resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + reflect-metadata@0.1.14: + resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + ret@0.2.2: + resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} + engines: {node: '>=4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@4.4.1: + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex2@2.0.0: + resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + sdk-base@3.6.0: + resolution: {integrity: sha512-jxHUIrRLlAoRFRwiXKhOGjd6BeFWO/jz7tv+E7lbMSef6F9jzFN2Sv3hLW58oDDKscKaBGG6vQdkbXn7isE7fw==} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serialize-json@1.0.3: + resolution: {integrity: sha512-TJvXOXSUEH4Lh2FNy1mYzNkUyBG7Ti5fRKGAbcpaDX3mLq23aT/5unC+cIFc5JTDi4/BHTaYLhynrboCCYrFaQ==} + engines: {node: '>= 4.0.0'} + + set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + sonic-boom@3.8.1: + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stream-wormhole@1.1.0: + resolution: {integrity: sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==} + engines: {node: '>=4.0.0'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + superagent@8.1.2: + resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} + engines: {node: '>=6.4.0 <13 || >=14'} + deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net + + supertest@6.3.4: + resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} + engines: {node: '>=6.4.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tcp-base@3.2.0: + resolution: {integrity: sha512-fFAqH8QTbheuEbXLdbxTSe31Gkw6Lg3nq4loyrxIXM6+ILGdbYXEblgyuu7UltOkOHbP/q2iqaC+gIXXu0C5bg==} + engines: {node: '>= 6.0.0'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.31.1: + resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-decoding@1.0.0: + resolution: {integrity: sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@2.7.0: + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-lru@11.2.6: + resolution: {integrity: sha512-0PU3c9PjMnltZaFo2sGYv/nnJsMjG0Cxx8X6FXHPPGjFyoo1SJDxvUXW1207rdiSxYizf31roo+GrkIByQeZoA==} + engines: {node: '>=12'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-jest@29.0.3: + resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-loader@9.5.1: + resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tsconfig-paths-webpack-plugin@4.0.1: + resolution: {integrity: sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==} + engines: {node: '>=10.13.0'} + + tsconfig-paths@4.1.1: + resolution: {integrity: sha512-VgPrtLKpRgEAJsMj5Q/I/mXouC6A/7eJ/X4Nuk6o0cRPwBtznYxTCU4FodbexbzH9somBPEXYi0ZkUViUpJ21Q==} + engines: {node: '>=6'} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + uid@2.0.2: + resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} + engines: {node: '>=8'} + + unescape@1.0.1: + resolution: {integrity: sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==} + engines: {node: '>=0.10.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urlencode@1.1.0: + resolution: {integrity: sha512-OOAOh9owHXr/rCN1tteSnYwIvsrGHamSz0hafMhmQa7RcS4+Ets6/2iVClVGjt9jkDW84UqoMw/Gmpc7QolX6A==} + + urllib@2.42.0: + resolution: {integrity: sha512-cuXJStXonP776Mm5Z0R0TcYbLvSo+5J+CPuFzN/Hwc1Hfd3AEvbowLKXNt3NG91FONfFLgNenBhMx/mHORbc4w==} + engines: {node: '>= 0.10.0'} + peerDependencies: + proxy-agent: ^5.0.0 + peerDependenciesMeta: + proxy-agent: + optional: true + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utility@1.18.0: + resolution: {integrity: sha512-PYxZDA+6QtvRvm//++aGdmKG/cI07jNwbROz0Ql+VzFV1+Z0Dy55NI4zZ7RHc9KKpBePNFwoErqIuqQv/cjiTA==} + engines: {node: '>= 0.12.0'} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-node-externals@3.0.0: + resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} + engines: {node: '>=6'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.82.1: + resolution: {integrity: sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + win-release@1.1.1: + resolution: {integrity: sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==} + engines: {node: '>=0.10.0'} + + windows-release@4.0.0: + resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} + engines: {node: '>=10'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@angular-devkit/core@16.0.1(chokidar@3.5.3)': + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + jsonc-parser: 3.2.0 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 3.5.3 + + '@angular-devkit/schematics-cli@16.0.1(chokidar@3.5.3)': + dependencies: + '@angular-devkit/core': 16.0.1(chokidar@3.5.3) + '@angular-devkit/schematics': 16.0.1(chokidar@3.5.3) + ansi-colors: 4.1.3 + inquirer: 8.2.4 + symbol-observable: 4.0.0 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/schematics@16.0.1(chokidar@3.5.3)': + dependencies: + '@angular-devkit/core': 16.0.1(chokidar@3.5.3) + jsonc-parser: 3.2.0 + magic-string: 0.30.0 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/compat-data@7.24.7': {} + + '@babel/core@7.24.7': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.7': + dependencies: + '@babel/types': 7.24.7 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.24.7': + dependencies: + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + browserslist: 4.23.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/helper-hoist-variables@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.24.7': {} + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-string-parser@7.24.7': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.7': {} + + '@babel/helpers@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/template@7.24.7': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/traverse@7.24.7': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.7': + dependencies: + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@colors/colors@1.5.0': + optional: true + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.5 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@fastify/accept-negotiator@1.1.0': {} + + '@fastify/ajv-compiler@3.5.0': + dependencies: + ajv: 8.16.0 + ajv-formats: 2.1.1(ajv@8.16.0) + fast-uri: 2.4.0 + + '@fastify/busboy@1.2.1': + dependencies: + text-decoding: 1.0.0 + + '@fastify/cors@8.3.0': + dependencies: + fastify-plugin: 4.5.1 + mnemonist: 0.39.5 + + '@fastify/deepmerge@1.3.0': {} + + '@fastify/error@3.4.1': {} + + '@fastify/fast-json-stringify-compiler@4.3.0': + dependencies: + fast-json-stringify: 5.16.0 + + '@fastify/formbody@7.4.0': + dependencies: + fast-querystring: 1.1.2 + fastify-plugin: 4.5.1 + + '@fastify/merge-json-schemas@0.1.1': + dependencies: + fast-deep-equal: 3.1.3 + + '@fastify/middie@8.3.0': + dependencies: + '@fastify/error': 3.4.1 + fastify-plugin: 4.5.1 + path-to-regexp: 6.2.2 + reusify: 1.0.4 + + '@fastify/multipart@7.7.3': + dependencies: + '@fastify/busboy': 1.2.1 + '@fastify/deepmerge': 1.3.0 + '@fastify/error': 3.4.1 + '@fastify/swagger': 8.14.0 + '@fastify/swagger-ui': 1.10.2 + end-of-stream: 1.4.4 + fastify-plugin: 4.5.1 + secure-json-parse: 2.7.0 + stream-wormhole: 1.1.0 + transitivePeerDependencies: + - supports-color + + '@fastify/send@2.1.0': + dependencies: + '@lukeed/ms': 2.0.2 + escape-html: 1.0.3 + fast-decode-uri-component: 1.0.1 + http-errors: 2.0.0 + mime: 3.0.0 + + '@fastify/static@6.12.0': + dependencies: + '@fastify/accept-negotiator': 1.1.0 + '@fastify/send': 2.1.0 + content-disposition: 0.5.4 + fastify-plugin: 4.5.1 + glob: 8.1.0 + p-limit: 3.1.0 + + '@fastify/swagger-ui@1.10.2': + dependencies: + '@fastify/static': 6.12.0 + fastify-plugin: 4.5.1 + openapi-types: 12.1.3 + rfdc: 1.4.1 + yaml: 2.4.5 + + '@fastify/swagger@8.14.0': + dependencies: + fastify-plugin: 4.5.1 + json-schema-resolver: 2.0.0 + openapi-types: 12.1.3 + rfdc: 1.4.1 + yaml: 2.4.5 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.11.18 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.11.18 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.11.18 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 18.11.18 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 18.11.18 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.24.7 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.7 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 18.11.18 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@lukeed/csprng@1.1.0': {} + + '@lukeed/ms@2.0.2': {} + + '@nestjs/cli@9.5.0': + dependencies: + '@angular-devkit/core': 16.0.1(chokidar@3.5.3) + '@angular-devkit/schematics': 16.0.1(chokidar@3.5.3) + '@angular-devkit/schematics-cli': 16.0.1(chokidar@3.5.3) + '@nestjs/schematics': 9.2.0(chokidar@3.5.3)(typescript@4.9.5) + chalk: 4.1.2 + chokidar: 3.5.3 + cli-table3: 0.6.3 + commander: 4.1.1 + fork-ts-checker-webpack-plugin: 8.0.0(typescript@4.9.5)(webpack@5.82.1) + inquirer: 8.2.5 + node-emoji: 1.11.0 + ora: 5.4.1 + os-name: 4.0.1 + rimraf: 4.4.1 + shelljs: 0.8.5 + source-map-support: 0.5.21 + tree-kill: 1.2.2 + tsconfig-paths: 4.2.0 + tsconfig-paths-webpack-plugin: 4.0.1 + typescript: 4.9.5 + webpack: 5.82.1 + webpack-node-externals: 3.0.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + + '@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)': + dependencies: + iterare: 1.2.1 + reflect-metadata: 0.1.14 + rxjs: 7.8.1 + tslib: 2.5.3 + uid: 2.0.2 + optionalDependencies: + class-transformer: 0.5.1 + class-validator: 0.14.1 + + '@nestjs/core@9.4.3(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(reflect-metadata@0.1.14)(rxjs@7.8.1)': + dependencies: + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nuxtjs/opencollective': 0.3.2 + fast-safe-stringify: 2.1.1 + iterare: 1.2.1 + path-to-regexp: 3.2.0 + reflect-metadata: 0.1.14 + rxjs: 7.8.1 + tslib: 2.5.3 + uid: 2.0.2 + transitivePeerDependencies: + - encoding + + '@nestjs/mapped-types@2.0.5(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)': + dependencies: + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + reflect-metadata: 0.1.14 + optionalDependencies: + class-transformer: 0.5.1 + class-validator: 0.14.1 + + '@nestjs/platform-fastify@9.4.3(@fastify/static@6.12.0)(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@9.4.3(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(reflect-metadata@0.1.14)(rxjs@7.8.1))': + dependencies: + '@fastify/cors': 8.3.0 + '@fastify/formbody': 7.4.0 + '@fastify/middie': 8.3.0 + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(reflect-metadata@0.1.14)(rxjs@7.8.1) + fastify: 4.18.0 + light-my-request: 5.9.1 + path-to-regexp: 3.2.0 + tslib: 2.5.3 + optionalDependencies: + '@fastify/static': 6.12.0 + + '@nestjs/schematics@9.2.0(chokidar@3.5.3)(typescript@4.9.5)': + dependencies: + '@angular-devkit/core': 16.0.1(chokidar@3.5.3) + '@angular-devkit/schematics': 16.0.1(chokidar@3.5.3) + jsonc-parser: 3.2.0 + pluralize: 8.0.0 + typescript: 4.9.5 + transitivePeerDependencies: + - chokidar + + '@nestjs/testing@9.4.3(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@9.4.3(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(reflect-metadata@0.1.14)(rxjs@7.8.1))': + dependencies: + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(reflect-metadata@0.1.14)(rxjs@7.8.1) + tslib: 2.5.3 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@nuxtjs/opencollective@0.3.2': + dependencies: + chalk: 4.1.2 + consola: 2.15.3 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@sinclair/typebox@0.27.8': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.24.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.24.7 + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 18.11.18 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 18.11.18 + + '@types/cookiejar@2.1.5': {} + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 8.56.10 + '@types/estree': 1.0.5 + + '@types/eslint@8.56.10': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.5': {} + + '@types/express-serve-static-core@4.19.3': + dependencies: + '@types/node': 18.11.18 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.3 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 18.11.18 + + '@types/http-errors@2.0.4': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@29.2.4': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + '@types/json-schema@7.0.15': {} + + '@types/methods@1.1.4': {} + + '@types/mime@1.3.5': {} + + '@types/node@18.11.18': {} + + '@types/parse-json@4.0.2': {} + + '@types/qs@6.9.15': {} + + '@types/range-parser@1.2.7': {} + + '@types/semver@7.5.8': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 18.11.18 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 18.11.18 + '@types/send': 0.17.4 + + '@types/stack-utils@2.0.3': {} + + '@types/superagent@8.1.7': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 18.11.18 + + '@types/supertest@2.0.16': + dependencies: + '@types/superagent': 8.1.7 + + '@types/validator@13.12.0': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.32': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(typescript@4.9.5)': + dependencies: + '@eslint-community/regexpp': 4.10.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + debug: 4.3.5 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare-lite: 1.4.0 + semver: 7.6.2 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@4.9.5)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + debug: 4.3.5 + eslint: 8.57.0 + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@4.9.5)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + debug: 4.3.5 + eslint: 8.57.0 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.5 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.2 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@4.9.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + + '@webassemblyjs/helper-wasm-section@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + '@webassemblyjs/wasm-gen@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + '@webassemblyjs/wasm-parser@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + abstract-logging@2.0.1: {} + + acorn-import-assertions@1.9.0(acorn@8.12.0): + dependencies: + acorn: 8.12.0 + + acorn-jsx@5.3.2(acorn@8.12.0): + dependencies: + acorn: 8.12.0 + + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.0 + + acorn@8.12.0: {} + + address@1.2.2: {} + + ajv-formats@2.1.1(ajv@8.12.0): + optionalDependencies: + ajv: 8.12.0 + + ajv-formats@2.1.1(ajv@8.16.0): + optionalDependencies: + ajv: 8.16.0 + + ajv-formats@3.0.1(ajv@8.16.0): + optionalDependencies: + ajv: 8.16.0 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ajv@8.16.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + asap@2.0.6: {} + + asynckit@0.4.0: {} + + atomic-sleep@1.0.0: {} + + avvio@8.3.2: + dependencies: + '@fastify/error': 3.4.1 + fastq: 1.17.1 + + await-event@2.1.0: {} + + await-first@1.0.0: + dependencies: + ee-first: 1.1.1 + + babel-jest@29.7.0(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.24.7) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.24.7 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + + babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) + + babel-preset-jest@29.6.3(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.1: + dependencies: + caniuse-lite: 1.0.30001636 + electron-to-chromium: 1.4.805 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.1) + + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + byte@2.0.0: + dependencies: + debug: 3.2.7 + long: 4.0.0 + utility: 1.18.0 + transitivePeerDependencies: + - supports-color + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001636: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + char-regex@1.0.2: {} + + chardet@0.7.0: {} + + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-trace-event@1.0.4: {} + + ci-info@3.9.0: {} + + circular-json-for-egg@1.0.0: {} + + cjs-module-lexer@1.3.1: {} + + class-transformer@0.5.1: {} + + class-validator@0.14.1: + dependencies: + '@types/validator': 13.12.0 + libphonenumber-js: 1.11.3 + validator: 13.12.0 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + cli-table3@0.6.3: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + cli-width@3.0.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + cluster-client@2.1.2: + dependencies: + byte: 2.0.0 + co: 4.6.0 + debug: 4.3.5 + egg-logger: 2.9.1 + is-type-of: 1.4.0 + json-stringify-safe: 5.0.1 + long: 4.0.0 + mz-modules: 2.1.0 + sdk-base: 3.6.0 + serialize-json: 1.0.3 + tcp-base: 3.2.0 + utility: 1.18.0 + transitivePeerDependencies: + - supports-color + + co-gather@1.0.1: + dependencies: + co: 4.6.0 + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@2.20.3: {} + + commander@4.1.1: {} + + component-emitter@1.3.1: {} + + concat-map@0.0.1: {} + + consola@2.15.3: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie@0.5.0: {} + + cookiejar@2.1.4: {} + + copy-to@2.0.1: {} + + core-util-is@1.0.3: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + create-jest@29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-require@1.1.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + dedent@1.5.3: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + default-user-agent@1.0.0: + dependencies: + os-name: 1.0.3 + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-newline@3.1.0: {} + + dezalgo@1.0.4: + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + + diff-sequences@29.6.3: {} + + diff@4.0.2: {} + + digest-header@1.1.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + ee-first@1.1.1: {} + + egg-errors@2.3.2: {} + + egg-logger@2.9.1: + dependencies: + chalk: 2.4.2 + circular-json-for-egg: 1.0.0 + debug: 2.6.9 + depd: 2.0.0 + egg-errors: 2.3.2 + iconv-lite: 0.4.24 + mkdirp: 0.5.6 + utility: 1.18.0 + transitivePeerDependencies: + - supports-color + + electron-to-chromium@1.4.805: {} + + emittery@0.13.1: {} + + emoji-regex@8.0.0: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.17.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + equals@1.0.5: + dependencies: + jkroso-type: 1.1.1 + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-module-lexer@1.5.3: {} + + escalade@3.1.2: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@8.10.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8): + dependencies: + eslint: 8.57.0 + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + optionalDependencies: + eslint-config-prettier: 8.10.0(eslint@8.57.0) + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.5 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + execa@4.1.0: + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit@0.1.2: {} + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-content-type-parse@1.1.0: {} + + fast-decode-uri-component@1.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-json-stringify@5.16.0: + dependencies: + '@fastify/merge-json-schemas': 0.1.1 + ajv: 8.16.0 + ajv-formats: 3.0.1(ajv@8.16.0) + fast-deep-equal: 3.1.3 + fast-uri: 2.4.0 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.4.1 + + fast-levenshtein@2.0.6: {} + + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fast-uri@2.4.0: {} + + fastify-plugin@4.5.1: {} + + fastify@4.18.0: + dependencies: + '@fastify/ajv-compiler': 3.5.0 + '@fastify/error': 3.4.1 + '@fastify/fast-json-stringify-compiler': 4.3.0 + abstract-logging: 2.0.1 + avvio: 8.3.2 + fast-content-type-parse: 1.1.0 + fast-json-stringify: 5.16.0 + find-my-way: 7.7.0 + light-my-request: 5.9.1 + pino: 8.21.0 + process-warning: 2.3.2 + proxy-addr: 2.0.7 + rfdc: 1.4.1 + secure-json-parse: 2.7.0 + semver: 7.6.2 + tiny-lru: 11.2.6 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-my-way@7.7.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 2.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + fork-ts-checker-webpack-plugin@8.0.0(typescript@4.9.5)(webpack@5.82.1): + dependencies: + '@babel/code-frame': 7.24.7 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + fs-extra: 10.1.0 + memfs: 3.5.3 + minimatch: 3.1.2 + node-abort-controller: 3.1.1 + schema-utils: 3.3.0 + semver: 7.6.2 + tapable: 2.2.1 + typescript: 4.9.5 + webpack: 5.82.1 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formidable@2.1.2: + dependencies: + dezalgo: 1.0.4 + hexoid: 1.0.0 + once: 1.4.0 + qs: 6.12.1 + + formstream@1.5.1: + dependencies: + destroy: 1.2.0 + mime: 2.6.0 + node-hex: 1.0.1 + pause-stream: 0.0.11 + + forwarded@0.2.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-monkey@1.0.6: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-package-type@0.1.0: {} + + get-stream@5.2.0: + dependencies: + pump: 3.0.0 + + get-stream@6.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + glob@9.3.5: + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.11.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hexoid@1.0.0: {} + + html-escaper@2.0.2: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + human-signals@1.1.1: {} + + human-signals@2.1.0: {} + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-local@3.1.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + inquirer@8.2.4: + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + + inquirer@8.2.5: + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + + interpret@1.4.0: {} + + ipaddr.js@1.9.1: {} + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-class-hotfix@0.0.6: {} + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-interactive@1.0.0: {} + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-stream@2.0.1: {} + + is-type-of@1.4.0: + dependencies: + core-util-is: 1.0.3 + is-class-hotfix: 0.0.6 + isstream: 0.1.2 + + is-unicode-supported@0.1.0: {} + + isexe@2.0.0: {} + + isstream@0.1.2: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.2: + dependencies: + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.3.5 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterare@1.2.1: {} + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.11.18 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)): + dependencies: + '@babel/core': 7.24.7 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.7) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 18.11.18 + ts-node: 10.9.2(@types/node@18.11.18)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.11.18 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 18.11.18 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.7 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.24.7 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.11.18 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.11.18 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.11.18 + chalk: 4.1.2 + cjs-module-lexer: 1.3.1 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) + '@babel/types': 7.24.7 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.11.18 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.11.18 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@27.5.1: + dependencies: + '@types/node': 18.11.18 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest-worker@29.7.0: + dependencies: + '@types/node': 18.11.18 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.3.1(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jkroso-type@1.1.1: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@2.5.2: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-ref-resolver@1.0.1: + dependencies: + fast-deep-equal: 3.1.3 + + json-schema-resolver@2.0.0: + dependencies: + debug: 4.3.5 + rfdc: 1.4.1 + uri-js: 4.4.1 + transitivePeerDependencies: + - supports-color + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: {} + + json5@2.2.3: {} + + jsonc-parser@3.2.0: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@3.0.3: {} + + ko-sleep@1.1.4: + dependencies: + ms: 2.1.3 + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + libphonenumber-js@1.11.3: {} + + light-my-request@5.9.1: + dependencies: + cookie: 0.5.0 + process-warning: 2.3.2 + set-cookie-parser: 2.6.0 + + lines-and-columns@1.2.4: {} + + loader-runner@4.3.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + long@4.0.0: {} + + lru-cache@10.2.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + macos-release@2.5.1: {} + + magic-string@0.30.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + make-dir@4.0.0: + dependencies: + semver: 7.6.2 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + memfs@3.5.3: + dependencies: + fs-monkey: 1.0.6 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@2.6.0: {} + + mime@3.0.0: {} + + mimic-fn@2.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@8.0.4: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@4.2.8: {} + + minipass@7.1.2: {} + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mnemonist@0.39.5: + dependencies: + obliterator: 2.0.4 + + ms@2.0.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + mute-stream@0.0.8: {} + + mz-modules@2.1.0: + dependencies: + glob: 7.2.3 + ko-sleep: 1.1.4 + mkdirp: 0.5.6 + pump: 3.0.0 + rimraf: 2.7.1 + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nacos-config@2.6.0: + dependencies: + cluster-client: 2.1.2 + co-gather: 1.0.1 + debug: 3.2.7 + iconv-lite: 0.4.24 + is-type-of: 1.4.0 + mz: 2.7.0 + mz-modules: 2.1.0 + osenv: 0.1.5 + sdk-base: 3.6.0 + urlencode: 1.1.0 + urllib: 2.42.0 + utility: 1.18.0 + transitivePeerDependencies: + - proxy-agent + - supports-color + + nacos-naming@2.6.0: + dependencies: + address: 1.2.2 + equals: 1.0.5 + mz-modules: 2.1.0 + sdk-base: 3.6.0 + urllib: 2.42.0 + utility: 1.18.0 + uuid: 3.4.0 + transitivePeerDependencies: + - proxy-agent + + nacos@2.6.0: + dependencies: + nacos-config: 2.6.0 + nacos-naming: 2.6.0 + transitivePeerDependencies: + - proxy-agent + - supports-color + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + node-abort-controller@3.1.1: {} + + node-emoji@1.11.0: + dependencies: + lodash: 4.17.21 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-hex@1.0.1: {} + + node-int64@0.4.0: {} + + node-releases@2.0.14: {} + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + object-assign@4.1.1: {} + + object-inspect@1.13.1: {} + + obliterator@2.0.4: {} + + on-exit-leak-free@2.1.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + openapi-types@12.1.3: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + os-homedir@1.0.2: {} + + os-name@1.0.3: + dependencies: + osx-release: 1.1.0 + win-release: 1.1.1 + + os-name@4.0.1: + dependencies: + macos-release: 2.5.1 + windows-release: 4.0.0 + + os-tmpdir@1.0.2: {} + + osenv@0.1.5: + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + + osx-release@1.1.0: + dependencies: + minimist: 1.2.8 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.2.2 + minipass: 7.1.2 + + path-to-regexp@3.2.0: {} + + path-to-regexp@6.2.2: {} + + path-type@4.0.0: {} + + pause-stream@0.0.11: + dependencies: + through: 2.3.8 + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pino-abstract-transport@1.2.0: + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + + pino-std-serializers@6.2.2: {} + + pino@8.21.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 6.2.2 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.8.1 + thread-stream: 2.7.0 + + pirates@4.0.6: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pluralize@8.0.0: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@2.8.8: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + process-warning@2.3.2: {} + + process-warning@3.0.0: {} + + process@0.11.10: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@2.3.1: {} + + pure-rand@6.1.0: {} + + qs@6.12.1: + dependencies: + side-channel: 1.0.6 + + queue-microtask@1.2.3: {} + + quick-format-unescaped@4.0.4: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + react-is@18.3.1: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + real-require@0.2.0: {} + + rechoir@0.6.2: + dependencies: + resolve: 1.22.8 + + reflect-metadata@0.1.14: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve.exports@2.0.2: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + ret@0.2.2: {} + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rimraf@4.4.1: + dependencies: + glob: 9.3.5 + + run-async@2.4.1: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.6.3 + + safe-buffer@5.2.1: {} + + safe-regex2@2.0.0: + dependencies: + ret: 0.2.2 + + safe-stable-stringify@2.4.3: {} + + safer-buffer@2.1.2: {} + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + sdk-base@3.6.0: + dependencies: + await-event: 2.1.0 + await-first: 1.0.0 + co: 4.6.0 + is-type-of: 1.4.0 + + secure-json-parse@2.7.0: {} + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.2: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serialize-json@1.0.3: + dependencies: + debug: 3.2.7 + is-type-of: 1.4.0 + utility: 1.18.0 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.6.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + signal-exit@3.0.7: {} + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + sonic-boom@3.8.1: + dependencies: + atomic-sleep: 1.0.0 + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + split2@4.2.0: {} + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + stream-wormhole@1.1.0: {} + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + superagent@8.1.2: + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.3.5 + fast-safe-stringify: 2.1.1 + form-data: 4.0.0 + formidable: 2.1.2 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.12.1 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + + supertest@6.3.4: + dependencies: + methods: 1.1.2 + superagent: 8.1.2 + transitivePeerDependencies: + - supports-color + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-observable@4.0.0: {} + + tapable@2.2.1: {} + + tcp-base@3.2.0: + dependencies: + is-type-of: 1.4.0 + sdk-base: 3.6.0 + + terser-webpack-plugin@5.3.10(webpack@5.82.1): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.1 + webpack: 5.82.1 + + terser@5.31.1: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + text-decoding@1.0.0: {} + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + thread-stream@2.7.0: + dependencies: + real-require: 0.2.0 + + through@2.3.8: {} + + tiny-lru@11.2.6: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + tmpl@1.0.5: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + tree-kill@1.2.2: {} + + ts-jest@29.0.3(@babel/core@7.24.7)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(jest@29.3.1(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)))(typescript@4.9.5): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.3.1(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.2 + typescript: 4.9.5 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.24.7 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.7) + + ts-loader@9.5.1(typescript@4.9.5)(webpack@5.82.1): + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.17.0 + micromatch: 4.0.7 + semver: 7.6.2 + source-map: 0.7.4 + typescript: 4.9.5 + webpack: 5.82.1 + + ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.11.18 + acorn: 8.12.0 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tsconfig-paths-webpack-plugin@4.0.1: + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.17.0 + tsconfig-paths: 4.2.0 + + tsconfig-paths@4.1.1: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.5.3: {} + + tslib@2.6.3: {} + + tsutils@3.21.0(typescript@4.9.5): + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + typescript@4.9.5: {} + + uid@2.0.2: + dependencies: + '@lukeed/csprng': 1.1.0 + + unescape@1.0.1: + dependencies: + extend-shallow: 2.0.1 + + universalify@2.0.1: {} + + update-browserslist-db@1.0.16(browserslist@4.23.1): + dependencies: + browserslist: 4.23.1 + escalade: 3.1.2 + picocolors: 1.0.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urlencode@1.1.0: + dependencies: + iconv-lite: 0.4.24 + + urllib@2.42.0: + dependencies: + any-promise: 1.3.0 + content-type: 1.0.5 + default-user-agent: 1.0.0 + digest-header: 1.1.0 + ee-first: 1.1.1 + formstream: 1.5.1 + humanize-ms: 1.2.1 + iconv-lite: 0.4.24 + pump: 3.0.0 + qs: 6.12.1 + statuses: 1.5.0 + utility: 1.18.0 + + util-deprecate@1.0.2: {} + + utility@1.18.0: + dependencies: + copy-to: 2.0.1 + escape-html: 1.0.3 + mkdirp: 0.5.6 + mz: 2.7.0 + unescape: 1.0.1 + + uuid@3.4.0: {} + + v8-compile-cache-lib@3.0.1: {} + + v8-to-istanbul@9.2.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + validator@13.12.0: {} + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + watchpack@2.4.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + webidl-conversions@3.0.1: {} + + webpack-node-externals@3.0.0: {} + + webpack-sources@3.2.3: {} + + webpack@5.82.1: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.0 + acorn-import-assertions: 1.9.0(acorn@8.12.0) + browserslist: 4.23.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.0 + es-module-lexer: 1.5.3 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.82.1) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + win-release@1.1.1: + dependencies: + semver: 5.7.2 + + windows-release@4.0.0: + dependencies: + execa: 4.1.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@1.10.2: {} + + yaml@2.4.5: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/03=nest-learn/src/app.controller.spec.ts b/03=nest-learn/src/app.controller.spec.ts new file mode 100644 index 0000000..2552ec5 --- /dev/null +++ b/03=nest-learn/src/app.controller.spec.ts @@ -0,0 +1,22 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; + +describe('AppController', () => { + let appController: AppController; + + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + controllers: [AppController], + providers: [AppService], + }).compile(); + + appController = app.get(AppController); + }); + + describe('root', () => { + it('should return "Hello World!"', () => { + expect(appController.getHello()).toBe('Hello World!'); + }); + }); +}); diff --git a/03=nest-learn/src/app.controller.ts b/03=nest-learn/src/app.controller.ts new file mode 100644 index 0000000..e5a4904 --- /dev/null +++ b/03=nest-learn/src/app.controller.ts @@ -0,0 +1,48 @@ +import { + Body, + Controller, + Get, + Param, + Post, + Query, + Req, + Session, +} from '@nestjs/common'; +import { AppService } from './app.service'; + +@Controller() +export class AppController { + constructor(private readonly appService: AppService) {} + + @Get() + getHello( + @Req() request: Request, + @Body() body: Body, + @Session() session: any, + @Param() param: any, + @Query() query: any, + ): string { + console.log('BODY', body); + console.log('SESSION', session); + console.log('PARAM', param); + console.log('QUERY', query); + return 'hello World'; + } + @Post() + async readBody(@Body() body: Body, @Req() request: any): Promise { + const files = await request.saveRequestFiles(); + console.log('FILE', files); + console.log( + 'FILE:filepath', + files[0].filepath, + files[0].fieldname, + files[0].filename, + files[0].encoding, + files[0].mimetype, + // files[0].fields, + files[0].file.bytesRead, + ); + // console.log(body); + return 'hello World'; + } +} diff --git a/03=nest-learn/src/app.module.ts b/03=nest-learn/src/app.module.ts new file mode 100644 index 0000000..be846e5 --- /dev/null +++ b/03=nest-learn/src/app.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; +import { XiaomanModule } from './xiaoman/xiaoman.module'; + +@Module({ + imports: [XiaomanModule], + controllers: [AppController], + providers: [AppService], +}) +export class AppModule {} diff --git a/03=nest-learn/src/app.service.ts b/03=nest-learn/src/app.service.ts new file mode 100644 index 0000000..310a3df --- /dev/null +++ b/03=nest-learn/src/app.service.ts @@ -0,0 +1,10 @@ +import { Injectable } from '@nestjs/common'; +import { Request } from 'express'; + +@Injectable() +export class AppService { + getHello(request: Request): string { + console.log(request); + return 'Hello World!'; + } +} diff --git a/03=nest-learn/src/main.ts b/03=nest-learn/src/main.ts new file mode 100644 index 0000000..5f7d802 --- /dev/null +++ b/03=nest-learn/src/main.ts @@ -0,0 +1,48 @@ +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; +import { + FastifyAdapter, + NestFastifyApplication, +} from '@nestjs/platform-fastify'; +import fastifyM from '@fastify/multipart'; + +import { NacosNamingClient } from 'nacos'; +import { ValidationPipe } from '@nestjs/common'; + +// +// async function bootstrap() { +// const app = await NestFactory.create(AppModule); +// await app.listen(3000); +// } +// bootstrap(); + +async function bootstrap() { + const app = await NestFactory.create( + AppModule, + new FastifyAdapter({ + logger: true, + }), + ); + app.useGlobalPipes(new ValidationPipe()); + await app.register(fastifyM); + await app.listen(3000, '0.0.0.0'); +} + +async function microServer() { + const logger = console; + const client = new NacosNamingClient({ + logger, + serverList: '10.10.10.200:8848', // replace to real nacos serverList + namespace: 'public', + }); + await client.ready(); + const serviceName = 'node-nestjs'; //服务名 + await client.registerInstance(serviceName, { + ip: '10.10.10.48', + port: 3000, + } as any); +} + +microServer(); + +bootstrap(); diff --git a/03=nest-learn/src/xiaoman/dto/create-xiaoman.dto.ts b/03=nest-learn/src/xiaoman/dto/create-xiaoman.dto.ts new file mode 100644 index 0000000..330a5ea --- /dev/null +++ b/03=nest-learn/src/xiaoman/dto/create-xiaoman.dto.ts @@ -0,0 +1,25 @@ +import { IsEmail, IsNotEmpty, IsPhoneNumber, IsString } from 'class-validator'; + +// 此文件为验证演示 +// https://github.com/typestack/class-validator#usage +// 这里有更多的验证方法 +export class CreateXiaomanDto { + @IsNotEmpty({ + message: 'name 不能为空', + }) + @IsString() + name: string; + + @IsPhoneNumber('CN', { + message: 'phone 不是一个电话号码', + }) + phone: string; + + @IsEmail( + {}, + { + message: 'email 不是一个合法邮箱', + }, + ) + email: string; +} diff --git a/03=nest-learn/src/xiaoman/dto/update-xiaoman.dto.ts b/03=nest-learn/src/xiaoman/dto/update-xiaoman.dto.ts new file mode 100644 index 0000000..57df5a7 --- /dev/null +++ b/03=nest-learn/src/xiaoman/dto/update-xiaoman.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreateXiaomanDto } from './create-xiaoman.dto'; + +export class UpdateXiaomanDto extends PartialType(CreateXiaomanDto) {} diff --git a/03=nest-learn/src/xiaoman/entities/xiaoman.entity.ts b/03=nest-learn/src/xiaoman/entities/xiaoman.entity.ts new file mode 100644 index 0000000..23a1328 --- /dev/null +++ b/03=nest-learn/src/xiaoman/entities/xiaoman.entity.ts @@ -0,0 +1 @@ +export class Xiaoman {} diff --git a/03=nest-learn/src/xiaoman/xiaoman.controller.spec.ts b/03=nest-learn/src/xiaoman/xiaoman.controller.spec.ts new file mode 100644 index 0000000..d7fecc9 --- /dev/null +++ b/03=nest-learn/src/xiaoman/xiaoman.controller.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { XiaomanController } from './xiaoman.controller'; +import { XiaomanService } from './xiaoman.service'; + +describe('XiaomanController', () => { + let controller: XiaomanController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [XiaomanController], + providers: [XiaomanService], + }).compile(); + + controller = module.get(XiaomanController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/03=nest-learn/src/xiaoman/xiaoman.controller.ts b/03=nest-learn/src/xiaoman/xiaoman.controller.ts new file mode 100644 index 0000000..e54db35 --- /dev/null +++ b/03=nest-learn/src/xiaoman/xiaoman.controller.ts @@ -0,0 +1,50 @@ +import { + Controller, + Get, + Post, + Body, + Patch, + Param, + Delete, + ValidationPipe, + ParseIntPipe, + UseGuards, +} from '@nestjs/common'; +import { XiaomanService } from './xiaoman.service'; +import { CreateXiaomanDto } from './dto/create-xiaoman.dto'; +import { UpdateXiaomanDto } from './dto/update-xiaoman.dto'; +import { XiaomanGuard } from './xiaoman.guard'; + +@Controller('xiaoman') +export class XiaomanController { + constructor(private readonly xiaomanService: XiaomanService) {} + + @Post() + create(@Body(new ValidationPipe()) createXiaomanDto: CreateXiaomanDto) { + return this.xiaomanService.create(createXiaomanDto); + } + + @Get() + @UseGuards(XiaomanGuard) + findAll() { + return this.xiaomanService.findAll(); + } + + @Get(':id') + findOne(@Param('id', ParseIntPipe) id: number) { + return this.xiaomanService.findOne(+id); + } + + @Patch(':id') + update( + @Param('id') id: string, + @Body() updateXiaomanDto: UpdateXiaomanDto, + ) { + return this.xiaomanService.update(+id, updateXiaomanDto); + } + + @Delete(':id') + remove(@Param('id') id: string) { + return this.xiaomanService.remove(+id); + } +} diff --git a/03=nest-learn/src/xiaoman/xiaoman.guard.spec.ts b/03=nest-learn/src/xiaoman/xiaoman.guard.spec.ts new file mode 100644 index 0000000..da13989 --- /dev/null +++ b/03=nest-learn/src/xiaoman/xiaoman.guard.spec.ts @@ -0,0 +1,7 @@ +import { XiaomanGuard } from './xiaoman.guard'; + +describe('XiaomanGuard', () => { + it('should be defined', () => { + expect(new XiaomanGuard()).toBeDefined(); + }); +}); diff --git a/03=nest-learn/src/xiaoman/xiaoman.guard.ts b/03=nest-learn/src/xiaoman/xiaoman.guard.ts new file mode 100644 index 0000000..b2b0e01 --- /dev/null +++ b/03=nest-learn/src/xiaoman/xiaoman.guard.ts @@ -0,0 +1,27 @@ +import { + CanActivate, + ExecutionContext, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { Observable } from 'rxjs'; + +@Injectable() +export class XiaomanGuard implements CanActivate { + canActivate( + context: ExecutionContext, + ): boolean | Promise | Observable { + console.log(context); + const request = context.switchToHttp().getRequest(); + // console.log(request); + console.log(request.url); + console.log(request.headers); + // 自定义返回消息 + throw new UnauthorizedException({ + statusCode: 403, + message: '你没有访问权限', + error: 'Forbidden', + }); + return false; + } +} diff --git a/03=nest-learn/src/xiaoman/xiaoman.module.ts b/03=nest-learn/src/xiaoman/xiaoman.module.ts new file mode 100644 index 0000000..dffaeae --- /dev/null +++ b/03=nest-learn/src/xiaoman/xiaoman.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { XiaomanService } from './xiaoman.service'; +import { XiaomanController } from './xiaoman.controller'; + +@Module({ + controllers: [XiaomanController], + providers: [XiaomanService], +}) +export class XiaomanModule {} diff --git a/03=nest-learn/src/xiaoman/xiaoman.service.spec.ts b/03=nest-learn/src/xiaoman/xiaoman.service.spec.ts new file mode 100644 index 0000000..57c9e79 --- /dev/null +++ b/03=nest-learn/src/xiaoman/xiaoman.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { XiaomanService } from './xiaoman.service'; + +describe('XiaomanService', () => { + let service: XiaomanService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [XiaomanService], + }).compile(); + + service = module.get(XiaomanService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/03=nest-learn/src/xiaoman/xiaoman.service.ts b/03=nest-learn/src/xiaoman/xiaoman.service.ts new file mode 100644 index 0000000..17178ba --- /dev/null +++ b/03=nest-learn/src/xiaoman/xiaoman.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import { CreateXiaomanDto } from './dto/create-xiaoman.dto'; +import { UpdateXiaomanDto } from './dto/update-xiaoman.dto'; + +@Injectable() +export class XiaomanService { + create(createXiaomanDto: CreateXiaomanDto) { + return 'This action adds a new xiaoman'; + } + + findAll() { + return `This action returns all xiaoman`; + } + + findOne(id: number) { + return `This action returns a #${id} xiaoman`; + } + + update(id: number, updateXiaomanDto: UpdateXiaomanDto) { + return `This action updates a #${id} xiaoman`; + } + + remove(id: number) { + return `This action removes a #${id} xiaoman`; + } +} diff --git a/03=nest-learn/test/app.e2e-spec.ts b/03=nest-learn/test/app.e2e-spec.ts new file mode 100644 index 0000000..50cda62 --- /dev/null +++ b/03=nest-learn/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { AppModule } from './../src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/03=nest-learn/test/jest-e2e.json b/03=nest-learn/test/jest-e2e.json new file mode 100644 index 0000000..e9d912f --- /dev/null +++ b/03=nest-learn/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/03=nest-learn/tsconfig.build.json b/03=nest-learn/tsconfig.build.json new file mode 100644 index 0000000..64f86c6 --- /dev/null +++ b/03=nest-learn/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/03=nest-learn/tsconfig.json b/03=nest-learn/tsconfig.json new file mode 100644 index 0000000..adb614c --- /dev/null +++ b/03=nest-learn/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es2017", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false + } +} diff --git a/04===tune/.eslintrc.js b/04===tune/.eslintrc.js new file mode 100644 index 0000000..259de13 --- /dev/null +++ b/04===tune/.eslintrc.js @@ -0,0 +1,25 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}; diff --git a/04===tune/.gitignore b/04===tune/.gitignore new file mode 100644 index 0000000..e74865e --- /dev/null +++ b/04===tune/.gitignore @@ -0,0 +1,37 @@ +# compiled output +/dist +/node_modules +/Log/* + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +pnpm-lock.yaml + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json \ No newline at end of file diff --git a/04===tune/.prettierrc b/04===tune/.prettierrc new file mode 100644 index 0000000..bb05c7f --- /dev/null +++ b/04===tune/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "tabWidth": 4 +} \ No newline at end of file diff --git a/04===tune/README.md b/04===tune/README.md new file mode 100644 index 0000000..4f372da --- /dev/null +++ b/04===tune/README.md @@ -0,0 +1,17 @@ +# HotoKiss 2023-03-13 + +nestjs第一次完整学习 + +后端: + +1. cross-env设置环境变量 +2. swagger +3. 拦截器 +4. log4js +5. 加解密 +6. jwt,用户认证 +7. 邮箱,验证码 +8. 用户信息自定义装饰器 +9. dto +10. mysql2 +11. 文件上传 diff --git a/04===tune/config/development.ts b/04===tune/config/development.ts new file mode 100644 index 0000000..9560282 --- /dev/null +++ b/04===tune/config/development.ts @@ -0,0 +1,59 @@ +export default { + // 主服务 + master: { + systemName: '心曲Tune', + host: '0.0.0.0', + port: '3000', + }, + swagger: { + enable: true, + }, + dev: { + // 开发模式拦截器,用以提供接口请求时间和响应大小 + devInterceptor: true, + }, + log: { + level: 'all', + }, + databases: { + starLight: { + host: 'localhost', + port: 3306, + username: 'root', + password: 'Hxl1314521', + database: 'Starlight', + }, + }, + redis: { + starLight: { + host: 'localhost', + port: 6379, + username: 'default', + password: 'default', + dbNumber: 3, + }, + }, + email: { + host: 'smtp.qq.com', + user: 'togy.gc@qq.com', + pass: 'miidbsjeuqcxddbf', + }, + // 加密 + encryption: { + salt: 'время,вперёд!', // 盐 + secretKey: 'быть всегда готовым!', // 密钥 + }, + token: { + timeout: 1000 * 60 * 60 * 24 * 7, + secretKey: 'Missing You!(John waite)', + }, + // 登录 + signIn: { + // @ 密码验证次数超限后的冷却时长 + signInErrorTimeout: 60 * 10, + // @ 允许密码输错几次 + signInErrorNumber: 5, + // @ 允许同时在线数 + onLineNumber: 6, + }, +}; diff --git a/04===tune/config/index.ts b/04===tune/config/index.ts new file mode 100644 index 0000000..09a2c8b --- /dev/null +++ b/04===tune/config/index.ts @@ -0,0 +1,12 @@ +import developmentConfig from './development'; +import testConfig from './test'; +import productionConfig from './production'; + +const configs = { + development: developmentConfig, + test: testConfig, + production: productionConfig, +}; +const env = process.env.NODE_ENV || 'development'; + +export default () => configs[env]; diff --git a/04===tune/config/production.ts b/04===tune/config/production.ts new file mode 100644 index 0000000..63b74e3 --- /dev/null +++ b/04===tune/config/production.ts @@ -0,0 +1,57 @@ +export default { + // 主服务 + master: { + systemName: '心曲Tune', + host: '127.0.0.1', + port: '3000', + }, + swagger: { + enable: false, + }, + dev: { + // 开发模式拦截器,用以提供接口请求时间和响应大小 + devInterceptor: false, + }, + log: { + level: 'info', + }, + databases: { + starLight: { + host: 'localhost', + port: 3306, + username: 'root', + password: 'Hxl1314521', + database: 'Starlight', + }, + }, + redis: { + starLight: { + host: 'localhost', + port: 6379, + username: 'default', + password: 'default', + dbNumber: 3, + }, + }, + email: { + host: 'smtp.qq.com', + user: 'togy.gc@qq.com', + pass: 'miidbsjeuqcxddbf', + }, + // 加密 + encryption: { + salt: 'время,вперёд!', // 盐 + secretKey: 'быть всегда готовым!', // 密钥 + }, + token: { + timeout: 1000 * 60 * 60 * 24 * 7, + secretKey: 'Missing You!(John waite)', + }, + // 登录 + signIn: { + // @ 密码验证次数超限后的冷却时长 + signInErrorTimeout: 60 * 10, + // @ 允许密码输错几次 + signInErrorNumber: 5, + }, +}; diff --git a/04===tune/config/test.ts b/04===tune/config/test.ts new file mode 100644 index 0000000..2233785 --- /dev/null +++ b/04===tune/config/test.ts @@ -0,0 +1,10 @@ +export default { + // 主服务 + master: { + host: '0.0.0.0', + port: '3000', + }, + swagger: { + enable: true, + }, +}; diff --git a/04===tune/nest-cli.json b/04===tune/nest-cli.json new file mode 100644 index 0000000..f9aa683 --- /dev/null +++ b/04===tune/nest-cli.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true + } +} diff --git a/04===tune/package.json b/04===tune/package.json new file mode 100644 index 0000000..7154677 --- /dev/null +++ b/04===tune/package.json @@ -0,0 +1,83 @@ +{ + "name": "tune", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "scripts": { + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "cross-env NODE_ENV=production nest start", + "start:dev": "cross-env NODE_ENV=development nest start --watch", + "start:debug": "cross-env NODE_ENV=development nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@fastify/multipart": "^7.4.2", + "@fastify/static": "^6.9.0", + "@nestjs/common": "^9.0.0", + "@nestjs/config": "^2.3.1", + "@nestjs/core": "^9.0.0", + "@nestjs/mapped-types": "*", + "@nestjs/platform-fastify": "^9.3.9", + "@nestjs/swagger": "^6.2.1", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", + "fastify-swagger": "^5.2.0", + "jsonwebtoken": "^9.0.0", + "log4js": "^6.9.1", + "mysql2": "^3.2.0", + "nodemailer": "^6.9.1", + "redis": "^4.6.5", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.2.0" + }, + "devDependencies": { + "@nestjs/cli": "^9.0.0", + "@nestjs/schematics": "^9.0.0", + "@nestjs/testing": "^9.0.0", + "@types/express": "^4.17.13", + "@types/jest": "29.2.4", + "@types/node": "18.11.18", + "@types/supertest": "^2.0.11", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "cross-env": "^7.0.3", + "eslint": "^8.0.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "jest": "29.3.1", + "prettier": "^2.3.2", + "source-map-support": "^0.5.20", + "supertest": "^6.1.3", + "ts-jest": "29.0.3", + "ts-loader": "^9.2.3", + "ts-node": "^10.0.0", + "tsconfig-paths": "4.1.1", + "typescript": "^4.7.4" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/04===tune/src/Gdecorator/userinfoDecorator/userinfoDecorator.decorator.ts b/04===tune/src/Gdecorator/userinfoDecorator/userinfoDecorator.decorator.ts new file mode 100644 index 0000000..0ae3cc0 --- /dev/null +++ b/04===tune/src/Gdecorator/userinfoDecorator/userinfoDecorator.decorator.ts @@ -0,0 +1,31 @@ +import { + createParamDecorator, + ExecutionContext, + SetMetadata, +} from '@nestjs/common'; + +export const UserInfoDecorator = (...args: string[]) => + SetMetadata('userinfoDecorator', args); + +// nest g d [name] +// 自定义装饰器 + +// ? ? +// ? 函数名称: userinfoDto +// ? 函数描述: 限制userinfo数据格式 +// ? ? +export class userinfoDto { + uuid: string; + username: string; +} + +// ? ? +// ? 函数名称: getUserinfo +// ? 函数描述: 获取token用户信息 +// ? ? +export const getUserinfo = createParamDecorator( + (data: string, ctx: ExecutionContext) => { + const req = ctx.switchToHttp().getRequest(); + return req.userinfo as userinfoDto; + }, +); diff --git a/04===tune/src/Gexceptions/gexceptionsfilter.filter.ts b/04===tune/src/Gexceptions/gexceptionsfilter.filter.ts new file mode 100644 index 0000000..1a2cedd --- /dev/null +++ b/04===tune/src/Gexceptions/gexceptionsfilter.filter.ts @@ -0,0 +1,16 @@ +import { + ArgumentsHost, + Catch, + ExceptionFilter, + HttpException, +} from '@nestjs/common'; + +@Catch() +export class GexceptionsfilterFilter implements ExceptionFilter { + catch(exception: HttpException, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const request = ctx.getRequest(); + const status = exception.getStatus(); + } +} diff --git a/04===tune/src/Ginterceptor/gdevinterceptor.interceptor.ts b/04===tune/src/Ginterceptor/gdevinterceptor.interceptor.ts new file mode 100644 index 0000000..470066b --- /dev/null +++ b/04===tune/src/Ginterceptor/gdevinterceptor.interceptor.ts @@ -0,0 +1,35 @@ +import { + CallHandler, + ExecutionContext, + Injectable, + NestInterceptor, +} from '@nestjs/common'; +import { Observable } from 'rxjs'; +import { GloggerService } from '../Gservice/GLOGGER/glogger.service'; +import { tap } from 'rxjs/operators'; + +@Injectable() +export class GdevinterceptorInterceptor implements NestInterceptor { + logger: GloggerService; + constructor() { + this.logger = new GloggerService(); + this.logger.setContext(`[DevlInterceptor]`); + } + intercept(context: ExecutionContext, next: CallHandler): Observable { + const request = context.switchToHttp().getRequest(); + this.logger.warn(request.method, request.url, '<=='); + + const now = Date.now(); + return next.handle().pipe( + tap((data) => { + this.logger.warn( + request.method, + request.url, + '==>', + `${Date.now() - now}ms`, + `${Buffer.from(data).length}b`, + ); + }), + ); + } +} diff --git a/04===tune/src/Ginterceptor/gresponseinterceptor.interceptor.ts b/04===tune/src/Ginterceptor/gresponseinterceptor.interceptor.ts new file mode 100644 index 0000000..6824877 --- /dev/null +++ b/04===tune/src/Ginterceptor/gresponseinterceptor.interceptor.ts @@ -0,0 +1,46 @@ +import { + CallHandler, + ExecutionContext, + Injectable, + NestInterceptor, +} from '@nestjs/common'; +import { Observable } from 'rxjs'; +import { GloggerService } from '../Gservice/GLOGGER/glogger.service'; +import { map } from 'rxjs/operators'; + +@Injectable() +export class GresponseinterceptorInterceptor implements NestInterceptor { + logger: GloggerService; + constructor() { + this.logger = new GloggerService(); + this.logger.setContext(`[Responseinterceptor]`); + } + intercept(context: ExecutionContext, next: CallHandler): Observable { + const response = context.switchToHttp().getResponse(); + return next.handle().pipe( + map((data) => { + // this.logger.debug(response.statusCode); + return JSON.stringify({ + data: + typeof data == 'string' + ? data + : data.data + ? data.data + : data, + statusCode: response.statusCode, + success: data + ? data.success === false + ? false + : true + : true, + message: + typeof data == 'string' + ? 'ok' + : data.message + ? data.message + : 'ok', + }); + }), + ); + } +} diff --git a/04===tune/src/Gservice/GDATABASE/gdatabase.module.ts b/04===tune/src/Gservice/GDATABASE/gdatabase.module.ts new file mode 100644 index 0000000..cfe03f4 --- /dev/null +++ b/04===tune/src/Gservice/GDATABASE/gdatabase.module.ts @@ -0,0 +1,8 @@ +import { Global, Module } from '@nestjs/common'; +import { GdatabaseService } from './gdatabase.service'; +@Global() +@Module({ + providers: [GdatabaseService], + exports: [GdatabaseService], +}) +export class GdatabaseModule {} diff --git a/04===tune/src/Gservice/GDATABASE/gdatabase.service.ts b/04===tune/src/Gservice/GDATABASE/gdatabase.service.ts new file mode 100644 index 0000000..84ad687 --- /dev/null +++ b/04===tune/src/Gservice/GDATABASE/gdatabase.service.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@nestjs/common'; +import * as mysql from 'mysql2/promise'; +import config from '@CFG/index'; + +@Injectable() +export class GdatabaseService { + public DB; + constructor() { + this.start(); + } + private async start() { + const DBConfig = config().databases.starLight; + const DB = mysql.createPool({ + host: DBConfig.host, + port: DBConfig.port, + user: DBConfig.username, + password: DBConfig.password, + database: DBConfig.database, + connectionLimit: 20, // 用于指定连接池中最大的链接数,默认属性值为10. + multipleStatements: true, //是否允许执行多条sql语句,默认值为false + waitForConnections: true, // 超过最大连接时排队 + queueLimit: 0, // 排队最大数量(0 代表不做限制) + maxIdle: 20, // 最大空闲连接数 + idleTimeout: 60000, // 空闲连接超时,以毫秒为单位,默认值60000 + }); + this.DB = DB; + return DB; + } +} diff --git a/04===tune/src/Gservice/GEMAIL/gemail.module.ts b/04===tune/src/Gservice/GEMAIL/gemail.module.ts new file mode 100644 index 0000000..d3689a8 --- /dev/null +++ b/04===tune/src/Gservice/GEMAIL/gemail.module.ts @@ -0,0 +1,8 @@ +import { Global, Module } from '@nestjs/common'; +import { GemailService } from './gemail.service'; +@Global() +@Module({ + providers: [GemailService], + exports: [GemailService], +}) +export class GemailModule {} diff --git a/04===tune/src/Gservice/GEMAIL/gemail.service.ts b/04===tune/src/Gservice/GEMAIL/gemail.service.ts new file mode 100644 index 0000000..5171a8e --- /dev/null +++ b/04===tune/src/Gservice/GEMAIL/gemail.service.ts @@ -0,0 +1,317 @@ +import { Injectable } from '@nestjs/common'; +import * as nodemailer from 'nodemailer'; +import config from '@CFG/index'; + +@Injectable() +export class GemailService { + // @ 邮件服务 + private transporter; + // @ 邮箱配置 + private EMAILCONFIG; + // @ 系统名称,作用于邮件主题。 + private sysName: string; + + constructor() { + this.start(); + } + + // ? ? + // ? 函数名称: start + // ? 函数描述: 生成邮件服务 + // ? ? + private start() { + const EMAILCONFIG = config().email; + const transporter = nodemailer.createTransport({ + //node_modules/nodemailer/lib/well-known/services.json 查看相关的配置,如果使用qq邮箱,就查看qq邮箱的相关配置 + host: EMAILCONFIG.host, + // secureConnection:true, + service: 'qq', //类型qq邮箱 + // port: 465, + secure: true, // true for 465, false for other ports + auth: { + user: EMAILCONFIG.user, // 发送方的邮箱 + pass: EMAILCONFIG.pass, // smtp 的授权码 + }, + //pass 不是邮箱账户的密码而是stmp的授权码(必须是相应邮箱的stmp授权码) + //邮箱---设置--账户--POP3/SMTP服务---开启---获取stmp授权码 + }); + this.transporter = transporter; + this.EMAILCONFIG = EMAILCONFIG; + this.sysName = config().master.systemName; + } + + // ? ? + // ? 函数名称: senMail(邮件内容, 收件人邮箱) + // ? 函数描述: 发送邮件主函数 + // ? ? + private senMail(html, mail) { + return new Promise((res, rej) => { + const mailOptions = { + from: '"TOGY | 心曲Tune" ', // 发送方 + to: mail, //接收者邮箱,多个邮箱用逗号间隔 + subject: `${this.sysName}`, // 标题 + text: 'Hello world?', // 文本内容 + html, + }; + this.transporter.sendMail(mailOptions, (error, info) => { + if (error) { + rej([error, info]); + } else { + res(info); //因为是异步 所有需要回调函数通知成功结果 + } + }); + }); + } + // ? ? + // ? 函数名称: sendTestEmail + // ? 函数描述: 给指定邮箱发送测试验证码 + // ? ? + public sendTestEmail(email) { + return new Promise(async (res, rej) => { + const test = ` + +
+
+
我们欢迎您使用${this.sysName}
+
您在某些地方请求了邮箱的验证码,如果不是自己操作请修改账户的密码。
+
+
ABCDEF
+
+
此邮件作用于注册
截止邮件发送时间5分钟内使用有效。
+
+
+ `; + try { + const resd = await this.senMail(test, email); + res(resd); + } catch (e) { + rej(e); + } + }); + } + + // ? ? + // ? 函数名称: sendRegisterCodeMail(邮箱, 验证码) + // ? 函数描述: 给制定邮箱发送注册验证码 + // ? ? + public sendRegisterCodeMail(email, code) { + return new Promise(async (res, rej) => { + const test = ` + +
+
+
我们欢迎您使用${this.sysName}
+
您在某些地方请求了邮箱的验证码,如果不是自己操作请修改账户的密码。
+
+
${code}
+
+
此邮件作用于账户注册
截止邮件发送时间5分钟内使用有效。
+
+
+ `; + try { + console.time('EMAIL'); + const resd = await this.senMail(test, email); + console.timeEnd('EMAIL'); + res(resd); + } catch (e) { + rej({ + data: e, + message: '发送邮件失败!', + }); + } + }); + } + + // ? ? + // ? 函数名称: sendSignInCodeMail(邮箱, 验证码) + // ? 函数描述: 给制定邮箱发送注册验证码 + // ? ? + public sendSignInCodeMail(email, code) { + return new Promise(async (res, rej) => { + const test = ` + +
+
+
我们欢迎您使用${this.sysName}
+
您在某些地方请求了邮箱的验证码,如果不是自己操作请修改账户的密码。
+
+
${code}
+
+
此邮件作用于账户登录
截止邮件发送时间5分钟内使用有效。
+
+
+ `; + try { + console.time('EMAIL'); + const resd = await this.senMail(test, email); + console.timeEnd('EMAIL'); + res(resd); + } catch (e) { + rej({ + data: e, + message: '发送邮件失败!', + }); + } + }); + } +} diff --git a/04===tune/src/Gservice/GLOGGER/glogger.module.ts b/04===tune/src/Gservice/GLOGGER/glogger.module.ts new file mode 100644 index 0000000..d2ce4ff --- /dev/null +++ b/04===tune/src/Gservice/GLOGGER/glogger.module.ts @@ -0,0 +1,8 @@ +import { Global, Module } from '@nestjs/common'; +import { GloggerService } from './glogger.service'; +@Global() +@Module({ + providers: [GloggerService], + exports: [GloggerService], +}) +export class GloggerModule {} diff --git a/04===tune/src/Gservice/GLOGGER/glogger.service.ts b/04===tune/src/Gservice/GLOGGER/glogger.service.ts new file mode 100644 index 0000000..208b171 --- /dev/null +++ b/04===tune/src/Gservice/GLOGGER/glogger.service.ts @@ -0,0 +1,108 @@ +import { ConsoleLogger, Injectable, Scope } from '@nestjs/common'; +import { configure, getLogger, Logger as log4jsLogger } from 'log4js'; +import config from '../../../config'; + +@Injectable({ scope: Scope.TRANSIENT }) +export class GloggerService extends ConsoleLogger { + // 默认日志 + defaultLog: log4jsLogger; + // 文件日志 + fileLog: log4jsLogger; + context = ''; + + constructor(context = '') { + super(); + const logConfig = config().log; + if (context) { + this.context = context; + } + // this.configService + configure({ + appenders: { + default: { + type: 'console', + layout: { + type: 'pattern', + pattern: `%[%d{yyMMdd-hh:mm:ss:SSS} [%p]\t%m%]`, + }, + }, + file: { + filename: `Log/nestjs.services.log`, + type: 'dateFile', + // 配置 layout,此处使用自定义模式 pattern + layout: { + type: 'pattern', + pattern: '%d{yyMMdd-hh:mm:ss:SSS} [%p]\t%m', + }, + // 日志文件按日期(天)切割 + pattern: 'yy-MM-dd', + // 回滚旧的日志文件时,保证以 .log 结尾 (只有在 alwaysIncludePattern 为 false 生效) + keepFileExt: true, + // 输出的日志文件名是都始终包含 pattern 日期结尾 + alwaysIncludePattern: true, + // 指定日志保留的天数 + // daysToKeep: 10, + }, + }, + categories: { + default: { + appenders: ['default'], + level: logConfig.level || 'all', + enableCallStack: true, + }, + fileAll: { + appenders: ['file'], + level: logConfig.level || 'all', + enableCallStack: true, + }, + }, + }); + + this.defaultLog = getLogger(); + this.fileLog = getLogger('fileAll'); + } + + log(message: any, ...optionalParams: any[]) { + const context = this.context; + this.defaultLog.info(context, message, ...optionalParams); + this.fileLog.info(context, message, ...optionalParams); + } + + info(message: any, ...optionalParams: any[]) { + const context = this.context; + this.defaultLog.info(context, message, ...optionalParams); + this.fileLog.info(context, message, ...optionalParams); + } + + error(message: any, ...optionalParams: any[]) { + const context = this.context; + this.defaultLog.error(context, message, ...optionalParams); + this.fileLog.error(context, message, ...optionalParams); + } + + warn(message: any, ...optionalParams: any[]) { + // super.warn(message, trace); + const context = this.context; + this.defaultLog.warn(context, message, ...optionalParams); + this.fileLog.warn(context, message, ...optionalParams); + } + + debug(message: any, ...optionalParams: any[]) { + // super.debug(message, trace); + const context = this.context; + this.defaultLog.debug(context, message, ...optionalParams); + this.fileLog.debug(context, message, ...optionalParams); + } + + verbose(message: any, ...optionalParams: any[]) { + // super.verbose(message, trace); + const context = this.context; + this.defaultLog.info(context, message, ...optionalParams); + this.fileLog.info(context, message, ...optionalParams); + } + + setContext(context: string) { + this.context = context; + this.debug('加载日志'); + } +} diff --git a/04===tune/src/Gservice/GREDIS/gredis.module.ts b/04===tune/src/Gservice/GREDIS/gredis.module.ts new file mode 100644 index 0000000..3b7e8de --- /dev/null +++ b/04===tune/src/Gservice/GREDIS/gredis.module.ts @@ -0,0 +1,8 @@ +import { Global, Module } from '@nestjs/common'; +import { GredisService } from './gredis.service'; +@Global() +@Module({ + providers: [GredisService], + exports: [GredisService], +}) +export class GredisModule {} diff --git a/04===tune/src/Gservice/GREDIS/gredis.service.ts b/04===tune/src/Gservice/GREDIS/gredis.service.ts new file mode 100644 index 0000000..09d4fc2 --- /dev/null +++ b/04===tune/src/Gservice/GREDIS/gredis.service.ts @@ -0,0 +1,360 @@ +import { Injectable } from '@nestjs/common'; +import { createClient } from 'redis'; +import config from '../../../config'; +import { GtoolsService, HASHT } from '@/Gservice/GTOOLS/gtools.service'; + +export declare interface ISetRegisterEmailCode { + data: any; + message: string; + registerCode?: string; +} +export declare interface ISetSignInEmailCode { + data: any; + message: string; + signInCode?: string; +} + +@Injectable() +export class GredisService { + public DB; + private config; + // @ 专注于注册的数据库 + private readonly UserRegisterPoll = 1; + // @ 专注于登录的数据库 + private readonly UserSignInPoll = 2; + // @ 登录的相关配置文件 + private readonly SignInCFG = config().signIn; + // @ Token相关的配置文件 + private readonly TokenCFG = config().token; + + constructor(private readonly gtools: GtoolsService) { + this.config = config().redis.starLight; + this.start(); + } + //#region 注册 + // ? ? + // ? 函数名称: start + // ? 函数描述: 连接redis + // ? ? + private async start() { + const client = createClient({ + url: `redis://${this.config.username}:${this.config.password}@${this.config.host}:${this.config.port}/${this.config.dbNumber}`, + }); + await client.connect(); + this.DB = client; + } + + // ? ? + // ? 函数名称: setRegisterEmailCode(邮箱) + // ? 函数描述: 设置注册邮箱验证 + // ? ? + public setRegisterEmailCode(email): Promise { + return new Promise(async (res, rej) => { + this.DB.select(this.UserRegisterPoll); + try { + const key = 'Register-' + email; + const result = await this.DB.get(key); + if (result === null) { + const registerCode = this.gtools.getRandomString(6); + try { + const data = await this.DB.setEx( + key, + 300, + registerCode, + ); + res({ + data, + registerCode, + message: '生成验证码成功。', + }); + } catch (e) { + rej({ + data: e, + message: '生成验证码失败。', + }); + } + } else { + rej({ + data: null, + message: '已发送过邮件,请稍后再重试。', + }); + } + } catch (e) { + rej({ + data: e, + message: '查找注册码失败。', + }); + } + }); + } + + // ? ? + // ? 函数名称: getRegisterEmailCode(邮箱) + // ? 函数描述: 读取注册验证码 + // ? ? + public getRegisterEmailCode(email): Promise { + return new Promise(async (res, rej) => { + this.DB.select(this.UserRegisterPoll); + const key = 'Register-' + email; + try { + const result = await this.DB.get(key); + if (result === null) { + rej({ + data: null, + message: '未找到相匹配的验证码!', + }); + } else { + res({ + data: null, + message: '获取成功', + registerCode: result as string, + }); + } + } catch (e) { + rej({ + data: e, + message: '从Redis获取注册码出现错误!', + }); + } + }); + } + + // ? ? + // ? 函数名称: removeRegisterEmailCode + // ? 函数描述: + // ? ? + public removeRegisterEmailCode(email): Promise { + return new Promise(async (res, rej) => { + this.DB.select(this.UserRegisterPoll); + const key = 'Register-' + email; + try { + const result = await this.DB.del(key); + res({ + message: '清除注册验证码成功!', + data: {}, + }); + } catch (e) { + res({ + message: '清除注册验证码失败!', + data: e, + }); + } + }); + } + //#endregion + + //#region 密码登录 + // ? ? + // ? 函数名称: getSignInErrorNumber + // ? 函数描述: 获取异常登录信息 + // ? ? + public async getSignInErrorNumber(uuid) { + const key = 'SIN' + uuid; + this.DB.select(this.UserSignInPoll); + try { + const result = await this.DB.get(key); + if ( + result === null || + Number(result) < this.SignInCFG.signInErrorNumber + ) { + return { + state: true, + message: '获取成功', + error: null, + }; + } else { + const ttl = await this.DB.ttl(key); + return { + state: false, + message: '登陆异常已达上限,请稍后重试!', + ttl, + error: null, + }; + } + } catch (e) { + return { + state: false, + message: '查找登录异常数据出错!', + error: e, + }; + } + } + + // ? ? + // ? 函数名称: setSignInErrorNumber + // ? 函数描述: 设置用户登陆异常数字 + // ? ? + public async setSignInErrorNumber(uuid) { + const key = 'SIN' + uuid; + this.DB.select(this.UserSignInPoll); + try { + const exist = await this.DB.exists(key); + if (exist == 0) { + console.log(key); + await this.DB.set(key, 1); + await this.DB.expire(key, this.SignInCFG.signInErrorTimeout); + return { + error: null, + number: 1, + state: true, + }; + } else { + const number = await this.DB.get(key); + await this.DB.set(key, Number(number) + 1); + await this.DB.expire(key, this.SignInCFG.signInErrorTimeout); + return { + error: null, + number: Number(number) + 1, + state: true, + }; + } + } catch (e) { + return { + error: e, + message: '设置登陆异常数量出现错误!', + }; + } + } + + // ? ? + // ? 函数名称: setToken + // ? 函数描述: 设置Token到Redis + // ? ? + public async setToken(uuid, token) { + this.DB.select(this.UserSignInPoll); + const tokenKey = + 'TK' + this.gtools.makeHASH(token, HASHT.MD5).slice(0, 32); + const uuidKey = 'UK' + uuid; + await this.DB.setEx(tokenKey, this.TokenCFG.timeout / 1000, uuid); + + // 获取此用户的登陆数量 + let signInNumber: number; + try { + signInNumber = await this.DB.zCard(uuidKey); + } catch (e) { + return { + state: false, + message: '获取登陆数量出错!', + error: e, + }; + } + // 写入Token有序集合 + try { + const score = new Date().getTime(); + await this.DB.zAdd(uuidKey, [{ score, value: tokenKey }]); + } catch (e) { + return { + state: false, + message: '写入Token有序集合出错!', + error: e, + }; + } + // 清除最早的TokenKey和uuidKey + try { + if (signInNumber >= this.SignInCFG.onLineNumber) { + // 超出范围内 + // 删除最先的 + const uuidKeyZList = await this.DB.zRange( + uuidKey, + 0, + signInNumber, + ); + // 删除第一个 + const popTokenKey = await this.DB.zRemRangeByRank( + uuidKey, + 0, + 0, + ); + // 删除token + const delUuidKey = await this.DB.del(uuidKeyZList[0]); + // 加入新的 + } + } catch (e) { + return { + state: false, + message: '清除最早的TokenKey和uuidKey出错!', + error: e, + }; + } + return { + data: { + tokenKey, + uuidKey, + }, + state: true, + message: '设置成功!', + }; + } + + // ? ? + // ? 函数名称: setSignInEmailCode(邮箱) + // ? 函数描述: 设置邮箱登录验证 + // ? ? + public setSignInEmailCode(email): Promise { + return new Promise(async (res, rej) => { + this.DB.select(this.UserSignInPoll); + try { + const key = 'SignIn-' + email; + const result = await this.DB.get(key); + if (result === null) { + const signInCode = this.gtools.getRandomString(6); + try { + const data = await this.DB.setEx(key, 300, signInCode); + res({ + data, + signInCode, + message: '生成验证码成功。', + }); + } catch (e) { + rej({ + data: e, + message: '生成验证码失败。', + }); + } + } else { + rej({ + data: null, + message: '已发送过邮件,请稍后再重试。', + }); + } + } catch (e) { + rej({ + data: e, + message: '查找登录码失败。', + }); + } + }); + } + + // ? ? + // ? 函数名称: getSignInEmailEntryCode(邮箱) + // ? 函数描述: 读取登录验证码 + // ? ? + public getSignInEmailEntryCode(email): Promise { + return new Promise(async (res, rej) => { + this.DB.select(this.UserSignInPoll); + const key = 'SignIn-' + email; + try { + const result = await this.DB.get(key); + if (result === null) { + rej({ + data: null, + message: '未找到相匹配的验证码!', + }); + } else { + res({ + data: null, + message: '获取成功', + signInCode: result as string, + }); + } + } catch (e) { + rej({ + data: e, + message: '从Redis获取登录码出现错误!', + }); + } + }); + } + //#endregion +} diff --git a/04===tune/src/Gservice/GREDIS/testJson.js b/04===tune/src/Gservice/GREDIS/testJson.js new file mode 100644 index 0000000..e69de29 diff --git a/04===tune/src/Gservice/GTOOLS/gtools.module.ts b/04===tune/src/Gservice/GTOOLS/gtools.module.ts new file mode 100644 index 0000000..52736de --- /dev/null +++ b/04===tune/src/Gservice/GTOOLS/gtools.module.ts @@ -0,0 +1,8 @@ +import { Global, Module } from '@nestjs/common'; +import { GtoolsService } from './gtools.service'; +@Global() +@Module({ + providers: [GtoolsService], + exports: [GtoolsService], +}) +export class GtoolsModule {} diff --git a/04===tune/src/Gservice/GTOOLS/gtools.service.ts b/04===tune/src/Gservice/GTOOLS/gtools.service.ts new file mode 100644 index 0000000..9a12df5 --- /dev/null +++ b/04===tune/src/Gservice/GTOOLS/gtools.service.ts @@ -0,0 +1,137 @@ +import { Injectable } from '@nestjs/common'; +import * as crypto from 'crypto'; +import config from '@CFG/index'; +import * as jwt from 'jsonwebtoken'; + +// @ 不可逆加密 +export enum HASHT { + MD5 = 'md5', // 32位 + SHA256 = 'sha256', // 64位 + SHA512 = 'sha512', // 128位 +} +// @ 可逆加密 +export enum AEST { + AES128 = 'aes-128-cbc', + AES256 = 'aes-256-gcm', +} + +@Injectable() +export class GtoolsService { + // @ 加解密配置文件 + private readonly encryptionCFG = config().encryption; + private readonly tokenCFG = config().token; + + // @ AES-128-cec加解密 iv和key + private AES128CEC_key; + private AES128CEC_iv; + + constructor() { + this.AES128CEC_key = Buffer.from( + this.makeHASH(this.encryptionCFG.secretKey, HASHT.MD5).slice(-16), + 'utf8', + ); + + this.AES128CEC_iv = Buffer.from( + this.makeHASH(this.encryptionCFG.salt, HASHT.MD5).slice(-16), + 'utf8', + ); + } + + // ? ? + // ? 函数名称: getRandomString(长度,大小写默认big) + // ? 函数描述: 获取制定长度的随机字符串 + // ? ? + public getRandomString(len: number, size = 'big'): string { + if (size == 'big') { + return Math.random() + .toString(36) + .slice(-len) + .toString() + .toUpperCase(); + } else { + return Math.random() + .toString(36) + .slice(-len) + .toString() + .toLowerCase(); + } + } + + // ? ? + // ? 函数名称: makeUUID + // ? 函数描述: 生成UUID + // ? ? + public makeUUID() { + return crypto.randomUUID().split('-').join('').toUpperCase(); + } + + // ? ? + // ? 函数名称: makeHASH(加密内容, 加密编码默认为SHA512) + // ? 函数描述: =加密字符串 + // ? ? + public makeHASH(plaintext, algorithm = HASHT.SHA512) { + const sha512 = crypto.createHash(algorithm); + const sha512Sum = sha512.update(plaintext + this.encryptionCFG.salt); + const ciphertext = sha512Sum.digest('hex'); + return ciphertext; + } + + //#region 可逆加密 + // ? ? + // ? 函数名称: encrypt + // ? 函数描述: 加密字符串 + // ? ? + encrypt(plaintext, algorithm = AEST.AES128) { + const cipher = crypto.createCipheriv( + algorithm, + this.AES128CEC_key, + this.AES128CEC_iv, + ); // 初始化加密算法 + let ciphertext = cipher.update(plaintext, 'utf8', 'hex'); + ciphertext += cipher.final('hex'); + return ciphertext; + } + + // ? ? + // ? 函数名称: decrypt + // ? 函数描述: 解密字符串 + // ? ? + decrypt(ciphertext, algorithm = AEST.AES128) { + let plaintext = ''; + const cipher = crypto.createDecipheriv( + algorithm, + this.AES128CEC_key, + this.AES128CEC_iv, + ); + plaintext += cipher.update(ciphertext, 'hex', 'utf8'); + plaintext += cipher.final('utf8'); + return plaintext; + } + //#endredion + + //#region jwt + createToken(data) { + const plaintextToken = jwt.sign(data, this.tokenCFG.secretKey, { + expiresIn: this.tokenCFG.timeout / 1000, + }); + const ciphertextToken = this.encrypt(plaintextToken); + return ciphertextToken; + } + resolveToken(ciphertextToken) { + try { + // 解析密文 + const plaintextToken = this.decrypt(ciphertextToken); + const data = jwt.verify(plaintextToken, this.tokenCFG.secretKey); + return { + token: true, + data, + }; + } catch (e) { + return { + token: false, + data: e, + }; + } + } + //#endredion +} diff --git a/04===tune/src/app.module.ts b/04===tune/src/app.module.ts new file mode 100644 index 0000000..fe8b7e1 --- /dev/null +++ b/04===tune/src/app.module.ts @@ -0,0 +1,27 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { GredisModule } from '@/Gservice/GREDIS/gredis.module'; +import { GloggerModule } from '@/Gservice/GLOGGER/glogger.module'; +import { GdatabaseModule } from '@/Gservice/GDATABASE/gdatabase.module'; +import { GemailModule } from '@/Gservice/GEMAIL/gemail.module'; +import { GtoolsModule } from '@/Gservice/GTOOLS/gtools.module'; +import config from '@CFG/index'; +import { StarlightModule } from '@/starlight/starlight.module'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + isGlobal: true, // 作用于全局 + load: [config], // 加载自定义配置项 + }), + GloggerModule, + StarlightModule, + GdatabaseModule, + GredisModule, + GemailModule, + GtoolsModule, + ], + controllers: [], + providers: [], +}) +export class AppModule {} diff --git a/04===tune/src/main.ts b/04===tune/src/main.ts new file mode 100644 index 0000000..2a72616 --- /dev/null +++ b/04===tune/src/main.ts @@ -0,0 +1,88 @@ +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; +import { + FastifyAdapter, + NestFastifyApplication, +} from '@nestjs/platform-fastify'; +// 参数验证 +import { ValidationPipe } from '@nestjs/common'; +// Fastify文件上传插件 +import fastifyMultipart from '@fastify/multipart'; +// 日志服务 +import { GloggerService } from '@/Gservice/GLOGGER/glogger.service'; +// API文档 +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +// 配置文件 +import { ConfigService } from '@nestjs/config'; +// 异常捕获 +import { GexceptionsfilterFilter } from '@/Gexceptions/gexceptionsfilter.filter'; +// 拦截器 +// --全局开发拦截 +import { GdevinterceptorInterceptor } from '@/Ginterceptor/gdevinterceptor.interceptor'; +// --全局响应拦截 +import { GresponseinterceptorInterceptor } from '@/Ginterceptor/gresponseinterceptor.interceptor'; + +async function bootstrap() { + const app = await NestFactory.create( + // 加载主程序模块 + AppModule, + // 使用Fastify作为底层框架 + new FastifyAdapter({ + logger: false, + }), + ); + // 配置服务 + const appConfig = app.get(ConfigService); + // 日志 Log为文件路径 + const logger = new GloggerService('[BOOTSTRAP]'); + app.useLogger(logger); + // 全局路由前缀 + app.setGlobalPrefix('api'); + + // 全局开启参数验证--需要安装class-validator 又依赖 class-transformer + app.useGlobalPipes(new ValidationPipe()); + // fastify文件上传中间件 + await app.register(fastifyMultipart); + // 开发者工具 + const swaggerState = appConfig.get('swagger').enable; + Swagger(app, swaggerState, logger); + const devInterceptorState = appConfig.get('dev').devInterceptor; + DevInterceptor(app, devInterceptorState, logger); + + //全局响应拦截器 + app.useGlobalInterceptors(new GresponseinterceptorInterceptor()); + // 全局异常捕获 + // app.useGlobalFilters(new GexceptionsfilterFilter()); + + // 从配置文件的信息中启动服务 + const listenConfig = appConfig.get('master'); + await app.listen(listenConfig.port, listenConfig.host); + + logger.log( + '🚀 服务应用已经成功启动!', + `http://${listenConfig.host}:${listenConfig.port}`, + ); +} +// Swagger接口测试和说明文档 +function Swagger(app, state, logger) { + if (!state) return; + const config = new DocumentBuilder() + .setTitle('系统接口文档') + .setDescription('这是一份接口文档') + .setVersion('1.0.0') + .addBearerAuth() + .build(); + const document = SwaggerModule.createDocument(app, config); + SwaggerModule.setup('docs', app, document); + logger.warn('Swagger外接程序已加载!'); + logger.warn('应用程序文档地址: http://localhost:3000/docs'); +} +// DevInterceptorService 输出请求处理时间和响应数据大小的拦截器 +function DevInterceptor(app, state, logger) { + // 全局拦截器 + if (!state) return; + app.useGlobalInterceptors(new GdevinterceptorInterceptor()); + logger.warn('DevInterceptorService请求响应拦截器已开启!'); +} + +bootstrap(); diff --git a/04===tune/src/starlight/dto/create-starlight.dto.ts b/04===tune/src/starlight/dto/create-starlight.dto.ts new file mode 100644 index 0000000..998c37d --- /dev/null +++ b/04===tune/src/starlight/dto/create-starlight.dto.ts @@ -0,0 +1,19 @@ +import { IsNotEmpty, IsNumber, IsString } from 'class-validator'; + +export class CreateStarlightDto { + @IsNotEmpty({ + message: 'name 不能为空', + }) + @IsString({ + message: '必须为字符串', + }) + name: string; + + @IsNumber( + {}, + { + message: '必须为数字', + }, + ) + age: number; +} diff --git a/04===tune/src/starlight/dto/defaultTest.dto.ts b/04===tune/src/starlight/dto/defaultTest.dto.ts new file mode 100644 index 0000000..6abb687 --- /dev/null +++ b/04===tune/src/starlight/dto/defaultTest.dto.ts @@ -0,0 +1,25 @@ +import { IsEmail, IsNotEmpty, IsPhoneNumber, IsString } from 'class-validator'; + +// 此文件为参数验证演示 +// https://github.com/typestack/class-validator#usage +// 这里有更多的验证方法 +export class CreateXiaomanDto { + @IsNotEmpty({ + message: 'name 不能为空', + }) + @IsString() + name: string; + + @IsPhoneNumber('CN', { + message: 'phone 不是一个电话号码', + }) + phone: string; + + @IsEmail( + {}, + { + message: 'email 不是一个合法邮箱', + }, + ) + email: string; +} diff --git a/04===tune/src/starlight/dto/position.dto.ts b/04===tune/src/starlight/dto/position.dto.ts new file mode 100644 index 0000000..13c6cae --- /dev/null +++ b/04===tune/src/starlight/dto/position.dto.ts @@ -0,0 +1,98 @@ +import { + ArrayMinSize, + IsArray, + IsNotEmpty, + IsNumber, + IsOptional, + IsString, + Length, +} from 'class-validator'; +import { Transform, Type } from 'class-transformer'; +import { ValidationPipe } from '@nestjs/common'; + +export class PositionCreateDTO { + // @ 父id + @IsNumber({}, { message: '父id必须为数字!' }) + fatherid: number; + + // @ 定位类型 + @Length(1, 128, { message: '请将角色定位类型长度控制在8到128位之间!' }) + @IsString({ message: '角色定位类型应为字符串格式!' }) + type: string; + + // @ 角色名称 + @Length(1, 128, { message: '请将角色定位名称长度控制在8到128位之间!' }) + @IsString({ message: '角色定位名称应为字符串格式!' }) + name: string; + + // @ 角色标识 + @Length(1, 128, { message: '请将角色定位标识长度控制在8到128位之间!' }) + @IsString({ message: '角色定位标识应为字符串格式!' }) + pointer: string; + + // @ 描述 + @Length(1, 128, { message: '请将角色定位描述长度控制在8到128位之间!' }) + @IsString({ message: '角色定位描述应为字符串格式!' }) + describe: string; + + // @ 图标 + @Length(8, 255, { message: '请将角色定位图标地址长度控制在8到128位之间!' }) + @IsString({ message: '角色定位图标地址应为字符串格式!' }) + ico: string; +} + +// 删除指定角色 +export class PositionDeleteDTO { + // @ 角色id + + // @Param(new ValidationPipe({ transform: true })) + // @Transform((val) => { + // if (Number(val)) { + // return Number(val); + // } else { + // throw new Error('角色id必须为数字!'); + // } + // }) + // id: number; + @IsNotEmpty({ message: '角色id不可以为空' }) + @ArrayMinSize(1, { message: '角色id至少有一个' }) + // 文档建议如果是字符串的数组,使用字符串约束更好,因为js其实不存在数字数组,字符串数组等 + @Type(() => Number) + // 上面虽然解决了不是字符串的数组的问题,但是如果传进来的是一个字符串呢?这就太tm难了,所以再在编译时检查一下算了吧,运行时不管了 + @IsArray({ message: '角色id必须是一个数组' }) + readonly id: number[]; +} + +// 更新角色信息DTO +export class PositionUpdateDTO extends PositionCreateDTO { + // @ 父id + @IsOptional() + @IsNumber({}, { message: '父id必须为数字!' }) + fatherid: number; + // @ 父id + @IsNumber({}, { message: 'id必须为数字!' }) + id: number; +} + +// 角色列表 +export class PositionListDTO { + // @ 角色列表 + @IsNotEmpty({ message: '角色id不可以为空' }) + @ArrayMinSize(1, { message: '角色id至少有一个' }) + // 文档建议如果是字符串的数组,使用字符串约束更好,因为js其实不存在数字数组,字符串数组等 + @Type(() => Number) + // 上面虽然解决了不是字符串的数组的问题,但是如果传进来的是一个字符串呢?这就太tm难了,所以再在编译时检查一下算了吧,运行时不管了 + @IsArray({ message: '角色id必须是一个数组' }) + readonly positionId: number[]; +} + +// 关联角色定位 +export class PositionRelationDTO extends PositionListDTO { + // @ 用户列表 + @IsNotEmpty({ message: 'uuid不可以为空' }) + @ArrayMinSize(1, { message: 'uuid至少有一个' }) + @IsString({ each: true, message: 'uuid必须为字符串' }) + @Length(32, 32, { each: true, message: 'uuid长度必须为32位' }) + @IsArray({ message: 'uuid必须是一个数组' }) + readonly uuidList: string[]; +} diff --git a/04===tune/src/starlight/dto/register.dto.ts b/04===tune/src/starlight/dto/register.dto.ts new file mode 100644 index 0000000..9a0911e --- /dev/null +++ b/04===tune/src/starlight/dto/register.dto.ts @@ -0,0 +1,119 @@ +/* * + * * @name: register.dto.ts + * * @description: 注册接口的参数验证 + * * @author: x7129 + * * @date: 2023-03-23 15:01 + * * */ +import { + IsDate, + IsEmail, + IsEnum, + IsNotEmpty, + IsNumber, + IsOptional, + IsPhoneNumber, + IsString, + Length, + Max, + Min, +} from 'class-validator'; +import { Type } from 'class-transformer'; + +// ? ? +// ? 函数名称: 性别枚举 +// ? 函数用法: +// ? ? + +export enum sex { + '男' = 1, + '女' = 2, + '其他' = 3, +} + +// 此文件为参数验证演示 +// https://github.com/typestack/class-validator#usage +// 这里有更多的验证方法 +export class RegisterEmailCheckoutEmailDto { + // @ 邮箱 + @Length(8, 128, { message: '请将邮箱长度控制在8到128位之间!' }) + @IsEmail({}, { message: '邮箱格式错误!' }) + @IsString({ message: '邮箱应为字符串格式!' }) + email: string; +} +export class RegisterEmailCheckoutUsernameDto { + // @ 用户名 + @Length(8, 128, { message: '请将用户名长度控制在8到128位之间!' }) + username: string; +} + +export class RegisterEmailSignUpDto extends RegisterEmailCheckoutEmailDto { + // @ 验证码 + @Length(6, 6, { message: '验证码是6位字符!' }) + code: string; + + // @ 密码 + @Length(8, 128, { message: '请将密码长度控制在8到128位之间!' }) + password: string; + + // @ 用户名 + @Length(8, 128, { message: '请将用户名长度控制在8到128位之间!' }) + username: string; + + // @ 真实姓名 + @IsOptional() + @Length(2, 128, { message: '请将真实姓名长度控制在2到128位之间!' }) + realname: string; + + // @ 昵称 + @IsOptional() + @Length(1, 128, { message: '请将昵称长度控制在1到128位之间!' }) + nickname: string; + + // @ 生日 + @IsOptional() + @IsDate({ message: '生日是一个日期,如1999-12-24!' }) + @Type(() => Date) + birthday: number; + + // @ 性别 + @IsOptional() + @IsEnum(sex, { message: '性别必须为:' + Object.keys(sex) }) + sex: number; + + // @ 住址 + @IsOptional() + @Length(1, 128, { message: '请将住址长度控制在1到128位之间!' }) + address: string; + + // @ 国家/地区 + @IsOptional() + @Length(1, 128, { message: '请将国家/地区长度控制在1到128位之间!' }) + country: string; + + // @ 个人简介 + @IsOptional() + @Length(1, 128, { message: '请将个人简介长度控制在1到128位之间!' }) + profile: string; + + // @ github地址 + @IsOptional() + @Length(1, 128, { message: '请将github地址长度控制在1到128位之间!' }) + githubUrl: string; + + // @ 个人主页地址 + @IsOptional() + @Length(1, 128, { message: '请将个人主页地址长度控制在1到128位之间!' }) + personalUrl: string; + // @ 阿里账号 + @IsOptional() + @Length(1, 128, { message: '请将阿里账号长度控制在1到128位之间!' }) + alibabaId: string; + // @ 抖音账号 + @IsOptional() + @Length(1, 128, { message: '请将抖音账号长度控制在1到128位之间!' }) + tiktokId: string; + // @ 微博账号 + @IsOptional() + @Length(1, 128, { message: '请将微博账号长度控制在1到128位之间!' }) + weiboId: string; +} diff --git a/04===tune/src/starlight/dto/signIn.dto.ts b/04===tune/src/starlight/dto/signIn.dto.ts new file mode 100644 index 0000000..157ccd8 --- /dev/null +++ b/04===tune/src/starlight/dto/signIn.dto.ts @@ -0,0 +1,32 @@ +/* * + * * @name: signIn.dto.ts + * * @description: 登陆部分的数据传输验证 + * * @author: xi + * * @date: 2023/3/26 22:41 + * * */ + +import { IsEmail, IsString, Length } from 'class-validator'; + +// @ 密码登录 +export class SignInPasswdEntryDto { + // @ 用户名 + @Length(8, 128, { message: '请将用户名长度控制在8到128位之间!' }) + username: string; + + // @ 密码 + @Length(8, 128, { message: '请将密码长度控制在8到128位之间!' }) + password: string; +} + +// 邮箱登录 +export class SignInEmailEntryDto { + // @ 邮箱 + @Length(8, 128, { message: '请将邮箱长度控制在8到128位之间!' }) + @IsEmail({}, { message: '邮箱格式错误!' }) + @IsString({ message: '邮箱应为字符串格式!' }) + email: string; + + // @ 验证码 + @Length(6, 6, { message: '验证码是6位字符!' }) + code: string; +} diff --git a/04===tune/src/starlight/dto/update-starlight.dto.ts b/04===tune/src/starlight/dto/update-starlight.dto.ts new file mode 100644 index 0000000..3dab921 --- /dev/null +++ b/04===tune/src/starlight/dto/update-starlight.dto.ts @@ -0,0 +1,3 @@ +import { CreateStarlightDto } from './create-starlight.dto'; + +export class UpdateStarlightDto {} diff --git a/04===tune/src/starlight/entities/starlight.entity.ts b/04===tune/src/starlight/entities/starlight.entity.ts new file mode 100644 index 0000000..9a8e752 --- /dev/null +++ b/04===tune/src/starlight/entities/starlight.entity.ts @@ -0,0 +1 @@ +export class Starlight {} diff --git a/04===tune/src/starlight/starlight.controller.spec.ts b/04===tune/src/starlight/starlight.controller.spec.ts new file mode 100644 index 0000000..022cffc --- /dev/null +++ b/04===tune/src/starlight/starlight.controller.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { StarlightController } from './starlight.controller'; +import { StarlightService } from './starlight.service'; + +describe('StarlightController', () => { + let controller: StarlightController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [StarlightController], + providers: [StarlightService], + }).compile(); + + controller = module.get(StarlightController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/04===tune/src/starlight/starlight.controller.ts b/04===tune/src/starlight/starlight.controller.ts new file mode 100644 index 0000000..fdcca1a --- /dev/null +++ b/04===tune/src/starlight/starlight.controller.ts @@ -0,0 +1,295 @@ +/* * + * * @name: starlight.controller.ts + * * @description: starLight Controller层 + * * @author: x7129 + * * @date: 2023-03-23 16:09 + * * */ +import { + Controller, + Get, + Post, + Body, + Patch, + Param, + Delete, + UseGuards, + Req, + Inject, + ExecutionContext, + createParamDecorator, + ValidationPipe, + Put, +} from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { ApiTags } from '@nestjs/swagger'; + +import { StarlightGuard } from './starlight.guard'; +import { StarlightService } from './starlight.service'; +import { CreateStarlightDto } from './dto/create-starlight.dto'; +import { UpdateStarlightDto } from './dto/update-starlight.dto'; + +import { GloggerService } from '@/Gservice/GLOGGER/glogger.service'; +import { GdatabaseService } from '@/Gservice/GDATABASE/gdatabase.service'; +import { GredisService } from '@/Gservice/GREDIS/gredis.service'; +import { + RegisterEmailCheckoutEmailDto, + RegisterEmailCheckoutUsernameDto, + RegisterEmailSignUpDto, +} from '@/starlight/dto/register.dto'; +import { getUserinfo } from '@/Gdecorator/userinfoDecorator/userinfoDecorator.decorator'; +import { + SignInEmailEntryDto, + SignInPasswdEntryDto, +} from '@/starlight/dto/signIn.dto'; +import { VerifyGuard } from '@/starlight/verify.guard'; +import { + PositionCreateDTO, + PositionDeleteDTO, + PositionListDTO, + PositionRelationDTO, + PositionUpdateDTO, +} from '@/starlight/dto/position.dto'; + +// C C +// C 类名称: StarlightController +// C 类描述: starLight Controller层入口 +// C C +@ApiTags('starLight') +@Controller('starLight') +// 拦截器 +@UseGuards(StarlightGuard) +export class StarlightController { + constructor( + // @ 配置文件服务 + private readonly config: ConfigService, + // @ service层 + private readonly starlightService: StarlightService, + // @ 日志服务 + private readonly logger: GloggerService, + // @ 数据库服务 + private readonly database: GdatabaseService, + // @ Redis服务 + private readonly redis: GredisService, + ) {} + + //#region 邮箱注册 + // ? ? + // ? 函数名称: registerEmailCheckoutEmail + // ? 函数描述: 查重邮箱注册 + // ? ? + @Get('register/email/checkoutEmail/:email') + registerEmailCheckoutEmail( + @Param() param: RegisterEmailCheckoutEmailDto, + ): Promise { + return this.starlightService.registerEmailCheckoutEmail(param); + } + // ? ? + // ? 函数名称: registerEmailSendCode + // ? 函数描述: 发送邮箱注册验证码 + // ? ? + @Get('register/email/sendCode/:email') + registerEmailSendCode( + @Param() param: RegisterEmailCheckoutEmailDto, + ): Promise { + return this.starlightService.registerEmailSendCode(param); + } + + // ? ? + // ? 函数名称: registerEmailCheckoutUsername + // ? 函数描述: 查重用户名 + // ? ? + @Get('register/email/checkoutUsername/:username') + registerEmailCheckoutUsername( + @Param() param: RegisterEmailCheckoutUsernameDto, + ): Promise { + return this.starlightService.registerEmailCheckoutUsername(param); + } + + // ? ? + // ? 函数名称: registerEmailSignUp + // ? 函数描述: 邮箱注册 + // ? ? + @Post('register/email/signUp') + registerEmailSignUp(@Body() body: RegisterEmailSignUpDto): Promise { + return this.starlightService.registerEmailSignUpDto(body); + } + //#endregion + + //#region 登陆 + // ? ? + // ? 函数名称: signInPasswdEntry + // ? 函数描述: 使用密码和用户名登陆 + // ? ? + @Post('/signIn/passwd/entry') + signInPasswdEntry(@Body() body: SignInPasswdEntryDto): Promise { + return this.starlightService.signInPasswdEntry(body); + } + + // ? ? + // ? 函数名称: signInEmailSendCode + // ? 函数描述: 获取邮箱登录验证码 + // ? ? + @Get('signIn/email/sendCode/:email') + signInEmailSendCode( + @Param() params: RegisterEmailCheckoutEmailDto, + ): Promise { + return this.starlightService.signInEmailSendCode(params); + } + + // ? ? + // ? 函数名称: signInEmailEntry + // ? 函数描述: 邮箱验证登录 + // ? ? + @Post('signIn/email/entry') + signInEmailEntry(@Body() body: SignInEmailEntryDto): Promise { + return this.starlightService.signInEmailEntry(body); + } + + // ? ? + // ? 函数名称: + // ? 函数描述: 测试Token + // ? ? + @UseGuards(VerifyGuard) + @Get('/signIn/testToken') + testToken(@getUserinfo() user) { + this.logger.info(user); + return {}; + } + + //#endregion + + //#region 角色定位 + // ? ? + // ? 函数名称: positionCreate + // ? 函数描述: 创建角色 + // ? ? + @UseGuards(VerifyGuard) + @Post('position/create') + positionCreate( + @Body() body: PositionCreateDTO, + @getUserinfo() userInfo, + ): Promise { + return this.starlightService.positionCreate(body, userInfo); + } + + // ? ? + // ? 函数名称: positionAll + // ? 函数描述: 获取所有角色定位信息 + // ? ? + @UseGuards(VerifyGuard) + @Get('position/all') + positionAll(): Promise { + return this.starlightService.positionAll(); + } + + // ? ? + // ? 函数名称: positionDelete + // ? 函数描述: 删除指定角色信息 + // ? ? + @UseGuards(VerifyGuard) + @Delete('position/delete') + positionDelete( + @Body() + body: PositionDeleteDTO, + ): Promise { + return this.starlightService.positionDelete(body); + } + + // ? ? + // ? 函数名称: positionUpdate + // ? 函数描述: 更新指定定位角色信息 + // ? ? + @UseGuards(VerifyGuard) + @Patch('position/update') + positionUpdate(@Body() body: PositionUpdateDTO): Promise { + return this.starlightService.positionUpdate(body); + } + + // ? ? + // ? 函数名称: positionDefault + // ? 函数描述: 设置默认角色 + // ? ? + @UseGuards(VerifyGuard) + @Patch('position/default') + positionDefault(@Body() body: PositionListDTO): Promise { + return this.starlightService.positionDefault(body); + } + + // ? ? + // ? 函数名称: getDefaultPosittion + // ? 函数描述: 获取默认角色 + // ? ? + @Get('/position/default') + getDefaultPosittion(): Promise { + return this.starlightService.getDefaultPosition(); + } + + // ? ? + // ? 函数名称: positionRelationUUID + // ? 函数描述: 关联用户角色定位 + // ? ? + @UseGuards(VerifyGuard) + @Post('position/relation') + positionRelationUUID(@Body() body: PositionRelationDTO): Promise { + return this.starlightService.positionRelationUUID(body); + } + + //#endregion + + //#region 测试 + @Post() + create(@Body() createStarlightDto: CreateStarlightDto) { + this.logger.debug(createStarlightDto); + return { + name: createStarlightDto.name, + age: createStarlightDto.age, + }; + return this.starlightService.create(createStarlightDto); + } + @Get() + async findAll() { + this.logger.debug(this.config.get('master')); + this.logger.debug('xsxs'); + const [rows, fields] = await this.database.DB.execute( + `SELECT * from user_info_base;`, + ); + this.logger.debug(rows); + this.logger.debug(await this.redis.DB.json.get('JSON')); + return this.starlightService.findAll(); + } + + @Get(':id') + findOne(@Param('id') id: string) { + return this.starlightService.findOne(+id); + } + + @Patch(':id') + update( + @Param('id') id: string, + @Body() updateStarlightDto: UpdateStarlightDto, + ) { + return this.starlightService.update(+id, updateStarlightDto); + } + + @Delete(':id') + remove(@Param('id') id: string) { + return this.starlightService.remove(+id); + } + @Post('/file') + async upFile(@Req() request: any): Promise { + const files = await request.saveRequestFiles(); + console.log('FILE', files); + console.log( + 'FILE:filepath', + files[0].filepath, + files[0].fieldname, + files[0].filename, + files[0].encoding, + files[0].mimetype, + // files[0].fields, + files[0].file.bytesRead, + ); + return 'Hello World'; + } + //#endregion +} diff --git a/04===tune/src/starlight/starlight.guard.spec.ts b/04===tune/src/starlight/starlight.guard.spec.ts new file mode 100644 index 0000000..0b2780c --- /dev/null +++ b/04===tune/src/starlight/starlight.guard.spec.ts @@ -0,0 +1,7 @@ +import { StarlightGuard } from './starlight.guard'; + +describe('StarlightGuard', () => { + it('should be defined', () => { + expect(new StarlightGuard()).toBeDefined(); + }); +}); diff --git a/04===tune/src/starlight/starlight.guard.ts b/04===tune/src/starlight/starlight.guard.ts new file mode 100644 index 0000000..1f7efd2 --- /dev/null +++ b/04===tune/src/starlight/starlight.guard.ts @@ -0,0 +1,29 @@ +import { + CanActivate, + ExecutionContext, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { Observable } from 'rxjs'; +// import { LoggerService } from '../Logger/logger.service'; +// 此文件为守卫 +@Injectable() +export class StarlightGuard implements CanActivate { + constructor(/*private readonly logger: LoggerService*/) {} + canActivate( + context: ExecutionContext, + ): boolean | Promise | Observable { + // console.log(context); + const request = context.switchToHttp().getRequest(); + // console.log(request); + // console.log(request.url);request.headers + // this.logger.info('GUARG', request.url, "TEST"); + // 自定义返回消息 + // throw new UnauthorizedException({ + // statusCode: 403, + // message: '你没有访问权限', + // error: 'Forbidden', + // }); + return true; + } +} diff --git a/04===tune/src/starlight/starlight.module.ts b/04===tune/src/starlight/starlight.module.ts new file mode 100644 index 0000000..7fa4374 --- /dev/null +++ b/04===tune/src/starlight/starlight.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { StarlightService } from './starlight.service'; +import { StarlightController } from './starlight.controller'; + +@Module({ + controllers: [StarlightController], + providers: [StarlightService], +}) +export class StarlightModule {} diff --git a/04===tune/src/starlight/starlight.service.ts b/04===tune/src/starlight/starlight.service.ts new file mode 100644 index 0000000..a6377b4 --- /dev/null +++ b/04===tune/src/starlight/starlight.service.ts @@ -0,0 +1,1096 @@ +/* * + * * @name: starlight.service.ts + * * @description: starLight Service层 + * * @author: x7129 + * * @date: 2023-03-23 17:44 + * * */ +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { CreateStarlightDto } from './dto/create-starlight.dto'; +import { UpdateStarlightDto } from './dto/update-starlight.dto'; +import { + RegisterEmailCheckoutEmailDto, + RegisterEmailCheckoutUsernameDto, + RegisterEmailSignUpDto, + sex, +} from './dto/register.dto'; +import { + PositionCreateDTO, + PositionDeleteDTO, + PositionListDTO, + PositionRelationDTO, + PositionUpdateDTO, +} from './dto/position.dto'; +import { ConfigService } from '@nestjs/config'; +import { GloggerService } from '@/Gservice/GLOGGER/glogger.service'; +import { GdatabaseService } from '@/Gservice/GDATABASE/gdatabase.service'; +import { GredisService } from '@/Gservice/GREDIS/gredis.service'; +import { GemailService } from '@/Gservice/GEMAIL/gemail.service'; +import { GtoolsService } from '@/Gservice/GTOOLS/gtools.service'; +import { + SignInEmailEntryDto, + SignInPasswdEntryDto, +} from '@/starlight/dto/signIn.dto'; +import { userinfoDto } from '@/Gdecorator/userinfoDecorator/userinfoDecorator.decorator'; + +// C C +// C 类名称: StarlightService +// C 类描述: 为StartController提供服务 +// C C +@Injectable() +export class StarlightService { + constructor( + // @ 配置文件服务 + private readonly config: ConfigService, + // @ 日志服务 + private readonly logger: GloggerService, + // @ 数据库服务 + private readonly database: GdatabaseService, + // @ Redis服务 + private readonly redis: GredisService, + // @ 邮件服务 + private readonly email: GemailService, + // @ 工具服务 + private readonly tools: GtoolsService, + ) {} + + //#region 邮箱注册 + // ? ? + // ? 函数名称: registerEmailCheckoutEmail + // ? 函数描述: 查重邮箱注册邮箱 + // ? ? + // ? ? + public async registerEmailCheckoutEmail( + params: RegisterEmailCheckoutEmailDto, + ) { + // ! 从数据库用户身份表查询有没有已经使用的邮箱 + const [rows] = await this.database.DB.execute( + `SELECT * FROM user_info_verify WHERE email = ? AND state = 0`, + [params.email.trim().toLowerCase()], + ); + // ! 判断是否存在此邮箱 + const resd = { + data: {}, + message: '此邮箱已被使用,请尝试使用其他邮箱注册!', + success: false, + }; + if (rows.length == 0) { + resd.message = '此邮箱未被使用,可以作为注册邮箱!'; + resd.success = true; + } + return resd; + } + + // ? ? + // ? 函数名称: registerEmailCheckoutUsername + // ? 函数描述: 查重邮箱注册用户名 + // ? ? + // ? ? + public async registerEmailCheckoutUsername( + params: RegisterEmailCheckoutUsernameDto, + ) { + // ! 从数据库用户身份表查询有没有已经使用的用户名 + const [rows] = await this.database.DB.execute( + `SELECT * FROM user_info_verify WHERE username = ? AND state = 0`, + [params.username.trim().toLowerCase()], + ); + // ! 判断是否存在此用户名 + const resd = { + data: {}, + message: '此用户名已被使用,请尝试使用其他用户名注册!', + success: false, + }; + if (rows.length == 0) { + resd.message = '此用户名未被使用,可以作为注册用户名!'; + resd.success = true; + } + return resd; + } + + // ? 函数名称: registerEmailSendCode + // ? 函数描述: 发送邮箱注册验证码 + // ? ? + public async registerEmailSendCode(params: RegisterEmailCheckoutEmailDto) { + let { email } = params; + email = email.trim().toLowerCase(); + // ! 1. 验证是否存在已经注册的 + const checkoutEmail = await this.registerEmailCheckoutEmail({ + email, + }); + const resd = { + data: {}, + message: '此邮箱已被使用,请尝试使用其他邮箱注册!', + success: false, + }; + if (!checkoutEmail.success) { + return resd; + } + // ! 2. 验证是否存在验证码 + let registerCode: any; + try { + const redisResd = await this.redis.setRegisterEmailCode(email); + registerCode = redisResd.registerCode as string; + } catch (e) { + this.logger.error(e); + resd.message = e.message; + return resd; + } + // ! 3. 发送验证码 + try { + const result = await this.email.sendRegisterCodeMail( + email, + registerCode, + ); + resd.success = true; + resd.message = '发送验证码成功,请注意查收!'; + return resd; + } catch (e) { + this.logger.error(e); + resd.message = e.message; + return resd; + } + } + + // ? ? + // ? 函数名称: registerEmailSignUpDto + // ? 函数描述: 邮箱注册 + // ? ? + public async registerEmailSignUpDto(body: RegisterEmailSignUpDto) { + const { email, code, username } = body; + // ! 1. 查重邮箱 + const checkoutEmail = await this.registerEmailCheckoutEmail({ + email, + }); + const resd = { + data: {}, + message: '此邮箱已被使用,请尝试使用其他邮箱注册!', + success: false, + }; + if (!checkoutEmail.success) { + return resd; + } + // ! 2. 查询注册验证码是否存在,比对验证码 + try { + const { registerCode } = await this.redis.getRegisterEmailCode( + email, + ); + if (code.trim().toUpperCase() !== registerCode) { + resd.message = '验证码不匹配!'; + return resd; + } + } catch (e) { + if (e.data != null) { + this.logger.error(e); + } + resd.message = e.message; + return resd; + } + // ! 3. 查重用户名 + const checkoutUsername = await this.registerEmailCheckoutUsername({ + username, + }); + if (!checkoutUsername.success) { + resd.message = '此用户名已被使用,请尝试使用其他用户名注册!'; + return resd; + } + // ! 4. 清除空格,加密密码并插入信息 + const password = body.password.trim(); + const passwordHASH = this.tools.makeHASH(password); + const uuid = this.tools.makeUUID(); + const createTime = new Date(); + const s = { + email: email.trim().toLowerCase(), + username: username.trim(), + realname: body.realname?.trim().toLowerCase(), + nickname: body.nickname?.trim(), + birthday: new Date(body.birthday), + sex: sex[body.sex], + address: body.address?.trim(), + country: body.country?.trim(), + profile: body.profile?.trim(), + github_url: body.githubUrl?.trim(), + personal_url: body.personalUrl?.trim(), + alibaba_id: body.alibabaId?.trim(), + tiktok_id: body.tiktokId?.trim(), + weibo_id: body.weiboId?.trim(), + }; + Object.keys(s).map((item) => { + return s[item] != undefined ? '' : (s[item] = null); + }); + // ! -- 基础表 user_info_base + const userInfoBaseSQL = `INSERT INTO user_info_base (uuid, createtime) VALUES (?, ?);`; + try { + const [rows] = await this.database.DB.execute(userInfoBaseSQL, [ + uuid, + createTime, + ]); + } catch (e) { + const message = '插入基础表失败!'; + this.logger.error({ + data: e, + message, + }); + resd.message = message; + return resd; + } + // ! -- 验证表 user_info_verify + const userInfoVerifySQL = `INSERT INTO user_info_verify (uuid, email, username, createtime) VALUES (?, ?, ?, ?);`; + try { + const [rows] = await this.database.DB.execute(userInfoVerifySQL, [ + uuid, + s.email, + s.username, + createTime, + ]); + } catch (e) { + const message = '插入验证表失败!'; + this.logger.error({ + data: e, + message, + }); + resd.message = message; + return resd; + } + // ! -- 密码表 user_info_passwd + const userInfoPasswdSQL = `INSERT INTO user_info_passwd (uuid, passwd, createtime) VALUES (?, ?, ?);`; + try { + const [rows] = await this.database.DB.execute(userInfoPasswdSQL, [ + uuid, + passwordHASH, + createTime, + ]); + } catch (e) { + const message = '插入密码表失败!'; + this.logger.error({ + data: e, + message, + }); + // 删除用户验证表的这条记录 + const DELSQL = `DELETE user_info_verify WHERE email = ?`; + try { + const [rows] = await this.database.DB.execute(DELSQL, [ + s.email, + ]); + this.logger.info(rows); + } catch (e) { + this.logger.error({ + data: e, + message: + '删除用户验证表失败,此候补操作依然失效,系统错误!', + }); + } + resd.message = message; + return resd; + } + // ! -- 拓展表 user_info_extra + const userInfoExtraSQL = `INSERT INTO user_info_extra (uuid, realname, nickname, birthday, sex, address, country, profile, alibaba_id, tiktok_id, weibo_id, github_url, personal_url, createtime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);`; + try { + const [rows] = await this.database.DB.execute(userInfoExtraSQL, [ + uuid, + s.realname, + s.nickname, + s.birthday, + s.sex, + s.address, + s.country, + s.profile, + s.alibaba_id, + s.tiktok_id, + s.weibo_id, + s.github_url, + s.personal_url, + createTime, + ]); + } catch (e) { + const message = '插入用户拓展信息时出现错误!'; + this.logger.error({ + data: e, + message, + }); + resd.message = message; + return resd; + } + + this.logger.info(s); + + // ! 5. 清除验证码 + try { + const result = await this.redis.removeRegisterEmailCode(email); + } catch (e) { + this.logger.warn(e); + } + resd.message = '注册成功!'; + resd.success = true; + return resd; + } + //#endregion + + //#region 登陆 + // ? ? + // ? 函数名称: signInPasswdEntry + // ? 函数描述: 使用密码和用户名登陆 + // ? ? + public async signInPasswdEntry(body: SignInPasswdEntryDto) { + const { username, password } = body; + const resd = { + data: {}, + message: '未找到该用户信息!', + success: false, + }; + // ! 1. 从库中获取uuid + const getUserUUIDSQL = `SELECT uuid from user_info_verify where username = ? AND state = 0 ORDER BY id desc limit 1;`; + let uuid: string = null; + try { + const [rows] = await this.database.DB.execute(getUserUUIDSQL, [ + username.trim().toLowerCase(), + ]); + if (rows.length == 0) { + return resd; + } + uuid = rows[0].uuid; + } catch (e) { + const message = '查找用户UUID出错!'; + resd.message = message; + this.logger.error({ + message, + data: e, + }); + } + // ! 2. 判断是否存在用户 + // ! 2.1 查找登陆异常数量Redis + const errorNumber = await this.redis.getSignInErrorNumber(uuid); + if (!errorNumber.state) { + const message = errorNumber.message; + if (!errorNumber.ttl) { + this.logger.warn({ + message, + e: errorNumber.error, + }); + } + + if (errorNumber.ttl) { + resd.data = { + ttl: errorNumber.ttl, + }; + } + resd.message = message; + return resd; + } + // ! 3. 加密密码 + const passwordHASH = this.tools.makeHASH(password.trim()); + // ! 4. 查找,比对密码 + let sqlPassword; + const getPasswordSQL = `SELECT passwd FROM user_info_passwd WHERE uuid = ? ORDER BY id desc limit 1;`; + try { + const [rows] = await this.database.DB.execute(getPasswordSQL, [ + uuid, + ]); + if (rows.length == 0) { + resd.message = '未找到密码!'; + return resd; + } else { + this.logger.info(passwordHASH, rows[0]); + if (passwordHASH != rows[0].passwd) { + // ! 5. 登陆异常累加器 + const setErrorNumber = + await this.redis.setSignInErrorNumber(uuid); + if (!setErrorNumber.state) { + const message = setErrorNumber.message; + this.logger.error({ + data: setErrorNumber.error, + message, + }); + resd.message = message; + return resd; + } else { + resd.message = '账户和密码不匹配,请重试。'; + resd.data = { + number: setErrorNumber.number, + }; + return resd; + } + } + } + } catch (e) { + const message = '查找用户密码时出错'; + this.logger.error({ + data: e, + message, + }); + resd.message = message; + return resd; + } + // ! 6. 创建Token + const token = this.tools.createToken({ + username, + uuid, + signInTime: new Date().getTime(), + }); + // ! 7. Redis存储策略 + const setToken = await this.redis.setToken(uuid, token); + if (!setToken.state) { + const message = setToken.message; + this.logger.error({ + data: setToken.error, + message, + }); + resd.message = message; + return resd; + } + + return { + message: '登陆成功', + data: { + token, + tokenKey: setToken.data.tokenKey, + }, + }; + } + + // ? ? + // ? 函数名称: signInEmailSendCode + // ? 函数描述: 获取邮箱登录验证码 + // ? ? + public async signInEmailSendCode(params: RegisterEmailCheckoutEmailDto) { + const email = params.email.trim().toLowerCase(); + // ! 1. 验证是否存在已经注册的 + const checkoutEmail = await this.registerEmailCheckoutEmail({ + email, + }); + const resd = { + data: {}, + message: '不存在此邮箱账户!', + success: false, + }; + if (checkoutEmail.success) { + return resd; + } + // ! 2. 验证是否存在验证码 + let registerCode: any; + try { + const redisResd = await this.redis.setSignInEmailCode(email); + registerCode = redisResd.signInCode as string; + } catch (e) { + this.logger.error(e); + resd.message = e.message; + return resd; + } + // ! 3. 发送验证码 + try { + const result = await this.email.sendSignInCodeMail( + email, + registerCode, + ); + resd.success = true; + resd.message = '发送验证码成功,请注意查收!'; + return resd; + } catch (e) { + this.logger.error(e); + resd.message = e.message; + return resd; + } + return {}; + } + + // ? ? + // ? 函数名称: signInEmailEntry + // ? 函数描述: 邮箱验证登录 + // ? ? + public async signInEmailEntry(body: SignInEmailEntryDto) { + let { email, code } = body; + email = email.trim().toLowerCase(); + code = code.trim().toUpperCase(); + const resd = { + data: {}, + message: '未找到该用户信息!', + success: false, + }; + // ! 1.从库中获取UUID + const getUserUUIDSQL = `SELECT uuid from user_info_verify where email = ? AND state = 0 ORDER BY id desc limit 1;`; + let uuid: string = null; + try { + const [rows] = await this.database.DB.execute(getUserUUIDSQL, [ + email.trim().toLowerCase(), + ]); + if (rows.length == 0) { + return resd; + } + uuid = rows[0].uuid; + } catch (e) { + const message = '查找用户UUID出错!'; + resd.message = message; + this.logger.error({ + message, + data: e, + }); + } + // ! 2. 查找登陆异常数量Redis + const errorNumber = await this.redis.getSignInErrorNumber(uuid); + if (!errorNumber.state) { + const message = errorNumber.message; + if (!errorNumber.ttl) { + this.logger.warn({ + message, + e: errorNumber.error, + }); + } + + if (errorNumber.ttl) { + resd.data = { + ttl: errorNumber.ttl, + }; + } + resd.message = message; + return resd; + } + // ! 3. 获取、比对验证码 + try { + const { signInCode } = await this.redis.getSignInEmailEntryCode( + email, + ); + if (signInCode != code) { + const setErrorNumber = await this.redis.setSignInErrorNumber( + uuid, + ); + if (!setErrorNumber.state) { + const message = setErrorNumber.message; + this.logger.error({ + data: setErrorNumber.error, + message, + }); + resd.message = message; + return resd; + } else { + resd.message = '验证码不匹配!'; + resd.data = { + number: setErrorNumber.number, + }; + return resd; + } + } + } catch (e) { + if (e.data != null) { + this.logger.error(e); + } + resd.message = e.message; + return resd; + } + // ! 6. 创建Token + const token = this.tools.createToken({ + email, + uuid, + signInTime: new Date().getTime(), + }); + // ! 7. Redis存储策略 + const setToken = await this.redis.setToken(uuid, token); + if (!setToken.state) { + const message = setToken.message; + this.logger.error({ + data: setToken.error, + message, + }); + resd.message = message; + return resd; + } + return { + message: '登陆成功', + data: { + token, + tokenKey: setToken.data.tokenKey, + }, + }; + } + //#endregion + + //#region 角色定位 + // ? ? + // ? 函数名称: positionCreate + // ? 函数描述: 创建角色 + // ? ? + public async positionCreate( + body: PositionCreateDTO, + userinfo: userinfoDto, + ): Promise { + // 去除空格,小写标识位 + const fatherid = body.fatherid, + type = body.type.trim(), + name = body.name.trim(), + pointer = body.pointer.trim().toLowerCase(), + describe = body.describe.trim(), + ico = body.ico.trim(); + this.logger.info(userinfo); + this.logger.info(fatherid, type, name, pointer, describe, ico); + // ! 判断父定位是否存在 + if (fatherid != 0) { + try { + const SQL = `SELECT * FROM user_position WHERE id = ? AND is_delete != 1`; + const [rows] = await this.database.DB.execute(SQL, [fatherid]); + this.logger.info(rows); + if (rows.length != 1) { + const message = '未找到父级定位!'; + return { + data: {}, + message, + success: false, + }; + } + } catch (e) { + this.logger.error(e); + const message = '查找定位信息出现错误!'; + return { + data: {}, + message, + success: false, + }; + } + } + // ! 查重标识 + try { + const SQL = `SELECT pointer FROM user_position WHERE pointer = ?`; + const [rows, fault] = await this.database.DB.execute(SQL, [ + pointer, + ]); + if (rows.length > 0) { + const message = '定位标识重复!'; + return { + data: {}, + message, + success: false, + }; + } + } catch (e) { + this.logger.error(e); + const message = '查找定位信息标识重名出现错误!'; + return { + data: {}, + message, + success: false, + }; + } + // ! 判断同级定位是否重名 + try { + const SQL = `SELECT name FROM user_position WHERE fatherid = ? AND is_delete != 1`; + const [rows, fault] = await this.database.DB.execute(SQL, [ + fatherid, + ]); + for (const i of rows) { + if (i.name == name) { + const message = '同级定位重名!'; + return { + data: {}, + message, + success: false, + }; + } + } + } catch (e) { + this.logger.error(e); + const message = '查找定位信息名称重名出现错误!'; + return { + data: {}, + message, + success: false, + }; + } + // ! 写入定位 + try { + const createTime = new Date(); + const SQL = `INSERT INTO user_position (pointer, name, type, position_describe, fatherid, ico, creator, createtime) VALUES (?, ?, ?, ?, ?, ?, ?, ?);`; + const [rows] = await this.database.DB.execute(SQL, [ + pointer, + name, + type, + describe, + fatherid, + ico, + userinfo.uuid, + createTime, + ]); + this.logger.info(rows); + } catch (e) { + this.logger.error(e); + const message = '写入定位信息出现错误!'; + return { + data: {}, + message, + success: false, + }; + } + return { + data: {}, + message: '创建定位成功!', + }; + } + + // ? ? + // ? 函数名称: positionAll + // ? 函数描述: 获取所有角色定位信息 + // ? ? + public async positionAll() { + try { + const SQL = `SELECT * FROM user_position WHERE is_delete != 1`; + const [rows] = await this.database.DB.execute(SQL, []); + const creatorList = {}; + for (const i of rows) { + if (!creatorList[i.creator]) { + // 获取创建角色用户信息 + const getUserDataSQL = `SELECT nickname FROM user_info_extra WHERE uuid = ?`; + const [rows2] = await this.database.DB.execute( + getUserDataSQL, + [i.creator], + ); + creatorList[i.creator] = rows2.slice(-1)[0]; + } + i.creatorData = creatorList[i.creator]; + } + return { + data: rows, + }; + } catch (e) { + const message = '获取角色定位信息失败!'; + this.logger.error({ + message, + data: e, + }); + return { + message, + success: false, + data: {}, + }; + } + } + + // ? ? + // ? 函数名称: positionDelete + // ? 函数描述: 删除指定角色信息 + // ? ? + public async positionDelete(body: PositionDeleteDTO) { + const { id } = body; + const deleteSQL = `UPDATE user_position SET is_delete = 1 WHERE id = ?;`; + const successList = [], + errorList = [], + errorObj = []; + for (const item of id) { + try { + const [row] = await this.database.DB.execute(deleteSQL, [item]); + successList.push(item); + } catch (e) { + errorObj.push(e); + errorList.push(item); + } + } + if (errorList.length > 0) { + this.logger.error({ + message: '删除角色定位失败!', + data: errorObj, + }); + return { + data: {}, + message: '删除角色定位失败!', + success: false, + }; + } + return { + data: {}, + message: '删除角色定位成功!', + success: true, + }; + } + + // ? ? + // ? 函数名称: positionUpdate + // ? 函数描述: 更新指定定位角色信息 + // ? ? + public async positionUpdate(body: PositionUpdateDTO) { + // 去除空格,小写标识位 + const id = body.id, + type = body.type.trim(), + name = body.name.trim(), + pointer = body.pointer.trim().toLowerCase(), + describe = body.describe.trim(), + ico = body.ico.trim(); + // ! 查父id + let fatherid: number; + try { + const SQL = `SELECT fatherid FROM user_position WHERE id = ? AND is_delete != 1`; + const [rows, fault] = await this.database.DB.execute(SQL, [id]); + if (rows.length == 0) { + const message = '未找到该角色定位!'; + return { + message, + data: {}, + success: false, + }; + } else { + fatherid = rows[0].fatherid; + } + } catch (e) { + this.logger.error({ + message: '查找角色父ID失败!', + data: e, + }); + + const message = '查找角色父ID失败!'; + return { + message, + data: {}, + success: false, + }; + } + // ! 查重名和标识 + try { + const checkPointerSQL = `SELECT pointer FROM user_position WHERE pointer = ? AND id != ? AND is_delete != 1`; + const [rows, fault] = await this.database.DB.execute( + checkPointerSQL, + [pointer, id], + ); + if (rows.length != 0) { + const message = '角色定位标识重复!'; + return { + data: {}, + message, + success: false, + }; + } + } catch (e) { + const message = '查冲角色定位标识失败!'; + this.logger.error({ + data: e, + message, + }); + return { + data: {}, + message, + success: false, + }; + } + try { + const checkNameSQL = `SELECT name FROM user_position WHERE name=? AND fatherid = ? AND id != ? AND is_delete != 1`; + const [rows, fault] = await this.database.DB.execute(checkNameSQL, [ + name, + fatherid, + id, + ]); + if (rows.length != 0) { + const message = '角色名称重复!'; + return { + data: {}, + message, + success: false, + }; + } + } catch (e) { + const message = '查冲角色名称失败!'; + this.logger.error({ + data: e, + message, + }); + return { + data: {}, + message, + success: false, + }; + } + // ! 写入 + try { + const SQL = + 'UPDATE user_position SET name = ?, pointer = ?, type = ?, position_describe = ?, ico = ? WHERE id = ?'; + const [rows, fault] = await this.database.DB.execute(SQL, [ + name, + pointer, + type, + describe, + ico, + id, + ]); + } catch (e) { + const message = '更新角色定位信息失败!'; + this.logger.info({ + message, + data: e, + }); + return { + data: {}, + success: false, + message, + }; + } + return { + message: '修改角色定位信息成功!', + success: true, + data: {}, + }; + } + + // ? ? + // ? 函数名称: positionDefault + // ? 函数描述: 设置默认角色 + // ? ? + public async positionDefault(body: PositionListDTO) { + // ! 清空默认设置 + try { + const clearSQL = `UPDATE user_position SET default_position = 0;`; + const [rows, fault] = await this.database.DB.execute(clearSQL, []); + } catch (e) { + const message = '清空默认角色失败!'; + this.logger.info({ + data: e, + message, + }); + return { + data: {}, + message, + success: false, + }; + } + // ! 设置新的默认角色 + const setDefaultSQL = `UPDATE user_position SET default_position = 1 WHERE id = ?;`; + const successList = [], + errorList = [], + errObj = [[]]; + for (const item of body.positionId) { + try { + const [rows, fault] = await this.database.DB.execute( + setDefaultSQL, + [item], + ); + successList.push(item); + } catch (e) { + errorList.push(item); + errObj.push(e); + const message = '设置默认角色失败!'; + this.logger.info({ + data: errObj, + message, + }); + return { + data: {}, + message, + success: false, + }; + } + } + return { + data: {}, + success: true, + message: '设置默认角色成功!', + }; + } + + // ? ? + // ? 函数名称: getDefaultPosittion + // ? 函数描述: 获取默认角色 + // ? ? + public async getDefaultPosition() { + try { + const SQL = `SELECT * FROM user_position WHERE default_position = 1 AND is_delete != 1`; + const [rows, fault] = await this.database.DB.execute(SQL, []); + + return { + data: rows, + message: '获取默认角色信息成功!', + success: true, + }; + } catch (e) { + const message = '获取默认角色信息失败'; + this.logger.error({ + data: e, + message, + }); + return { + message, + success: false, + data: {}, + }; + } + } + + // ? ? + // ? 函数名称: positionRelationUUID + // ? 函数描述: 关联用户角色定位 + // ? ? + public async positionRelationUUID(body: PositionRelationDTO) { + // ! 剔除不存在的用户 + + // ! 删除原有的用户角色定位关联 + const clearSQL = `UPDATE user_position_relation SET is_delete = 1 WHERE uuid = ?`; + for (const item of body.uuidList) { + try { + const [rows, fault] = await this.database.DB.execute(clearSQL, [ + item, + ]); + } catch (e) { + const message = 'ERROR,重大错误,清除用户角色关联失败。'; + this.logger.info({ + message, + data: e, + }); + return { + data: e, + success: false, + message, + }; + } + } + // ! 遍历加入新的角色定位关联 + const createTime = new Date(); + const insertSQL = `INSERT INTO user_position_relation (uuid, position_id, createtime) VALUES ?;`; + for (const item of body.uuidList) { + try { + const insertData = body.positionId.map((i) => [ + item, + i, + createTime, + ]); + this.logger.info(insertData); + const [rows, faault] = await this.database.DB.query(insertSQL, [ + insertData, + ]); + } catch (e) { + const message = 'ERROR,重大错误,关联用户角色定位信息失败!'; + this.logger.info({ + data: e, + message, + }); + return { + data: e, + message, + success: false, + }; + } + } + return { + data: {}, + success: true, + message: '关联用户角色定位成功!', + }; + } + + //#endregion + + //#region 测试啊 + + create(createStarlightDto: CreateStarlightDto) { + return 'This action adds a new starlight'; + } + + findAll() { + return JSON.stringify({ + name: '何夕', + age: 32, + data: 'xsxs', + }); + } + + findOne(id: number) { + return `This action returns a #${id} starlight`; + } + + update(id: number, updateStarlightDto: UpdateStarlightDto) { + return `This action updates a #${id} starlight`; + } + + remove(id: number) { + return `This action removes a #${id} starlight`; + } + //#endregion +} diff --git a/04===tune/src/starlight/verify.guard.ts b/04===tune/src/starlight/verify.guard.ts new file mode 100644 index 0000000..293c091 --- /dev/null +++ b/04===tune/src/starlight/verify.guard.ts @@ -0,0 +1,53 @@ +import { + CanActivate, + ExecutionContext, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { Observable } from 'rxjs'; +import { GloggerService } from '@/Gservice/GLOGGER/glogger.service'; +import { GtoolsService } from '@/Gservice/GTOOLS/gtools.service'; +import { userinfoDto } from '@/Gdecorator/userinfoDecorator/userinfoDecorator.decorator'; +// 此文件为守卫 +@Injectable() +export class VerifyGuard implements CanActivate { + constructor( + private readonly logger: GloggerService, + private readonly tools: GtoolsService, + ) {} + canActivate( + context: ExecutionContext, + ): boolean | Promise | Observable { + const request = context.switchToHttp().getRequest(); + const url = request.url; + // this.logger.info(url); + const token = request.headers.authorization; + // this.logger.info(token); + const data = this.tools.resolveToken(token); + // this.logger.info(data); + if (data.token) { + const userinfo: userinfoDto = { + uuid: data.data.uuid, + username: data.data.username, + }; + context.switchToHttp().getRequest().userinfo = userinfo; + // this.logger.info(request.user); + } else { + throw new UnauthorizedException({ + statusCode: 401, + message: '登陆过期!', + error: 'Forbidden', + }); + } + // console.log(request); + // console.log(request.url);request.headers + // this.logger.info('GUARG', request.url, "TEST"); + // 自定义返回消息 + // throw new UnauthorizedException({ + // statusCode: 403, + // message: '你没有访问权限', + // error: 'Forbidden', + // }); + return true; + } +} diff --git a/04===tune/test/app.e2e-spec.ts b/04===tune/test/app.e2e-spec.ts new file mode 100644 index 0000000..ce86fb8 --- /dev/null +++ b/04===tune/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { AppModule } from './../src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/04===tune/test/jest-e2e.json b/04===tune/test/jest-e2e.json new file mode 100644 index 0000000..e9d912f --- /dev/null +++ b/04===tune/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/04===tune/tsconfig.build.json b/04===tune/tsconfig.build.json new file mode 100644 index 0000000..64f86c6 --- /dev/null +++ b/04===tune/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/04===tune/tsconfig.json b/04===tune/tsconfig.json new file mode 100644 index 0000000..d5a45aa --- /dev/null +++ b/04===tune/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es2017", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false, + "paths": { + "@/*": [ + "src/*" + ], + "@CFG/*": [ + "config/*" + ] + } + }, +} diff --git a/05=backSQL/.gitignore b/05=backSQL/.gitignore new file mode 100644 index 0000000..5d51c6b --- /dev/null +++ b/05=backSQL/.gitignore @@ -0,0 +1,38 @@ +# compiled output +/dist +/node_modules +/Log/* + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +pnpm-lock.yaml + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + diff --git a/05=backSQL/README.md b/05=backSQL/README.md new file mode 100644 index 0000000..b711f74 --- /dev/null +++ b/05=backSQL/README.md @@ -0,0 +1,3 @@ +# HotoKiss + +利用mysqldump实现数据库备份,多数据库,可以作为服务器,缺少客户端 \ No newline at end of file diff --git a/05=backSQL/config.js b/05=backSQL/config.js new file mode 100644 index 0000000..22ec6b2 --- /dev/null +++ b/05=backSQL/config.js @@ -0,0 +1,11 @@ +const SERVER_PORT = 5000; +// 数据库名称 +const DATABASELIST = ['procatch-cloud', 'procatch-config', 'procatch-flowable']; + +const SERVERHOST = '192.168.1.200' + +module.exports = { + SERVER_PORT, + DATABASELIST, + SERVERHOST +} \ No newline at end of file diff --git a/05=backSQL/package.json b/05=backSQL/package.json new file mode 100644 index 0000000..b7f5266 --- /dev/null +++ b/05=backSQL/package.json @@ -0,0 +1,20 @@ +{ + "name": "yananjiasheng", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "iconv-lite": "^0.6.3", + "koa": "^2.14.2", + "koa-body": "^6.0.1", + "koa-router": "^12.0.0", + "moment": "^2.29.4", + "mysqldump": "^3.2.0" + } +} diff --git a/05=backSQL/server.js b/05=backSQL/server.js new file mode 100644 index 0000000..c73e8f2 --- /dev/null +++ b/05=backSQL/server.js @@ -0,0 +1,161 @@ +const {koaBody} = require('koa-body'); +const Koa = require('koa'); +const fs = require('fs'); +const path = require('path'); +const { spawn } = require('child_process') +const router = require('koa-router')() + , os = require('os') + , iconv = require("iconv-lite") +const moment = require('moment') + +const { DATABASELIST, SERVER_PORT, SERVERHOST} = require('./config') +const mysqldump = require("mysqldump"); + +// 备份间隔时间 +const mintues = 60 * 24;// minute + + + +// web服务 +function server(){ + const app = new Koa(); + app.use(koaBody({ + multipart: true, // 支持文件上传 + formidable: { + maxFieldsSize: 500 * 1024 * 1024, // 最大文件为2兆 + multipart: true // 是否支持 multipart-formdate 的表单 + } + })); + router.post('/putfile', async ctx => { + const fileList = await getFileList() + console.log('请求备份', fileList) + if(fileList.length == 0){ + ctx.body = [{state:false,filename:'无备份文件'}] + }else{ + const bunneryList = await readFile(fileList) + ctx.body = bunneryList + deleteFile(fileList) + } + }); + app.use(router.routes(), router.allowedMethods()) + app.listen(SERVER_PORT, () => { + console.log('=> 备份服务已启动! http://127.0.0.1:' + SERVER_PORT) + }); +} + +// 本分服务 +function back(){ + /** + * 数据库备份程序 + * */ + function backSQL(user, passwd, database){ + const filename = `./back/${ database }_${ moment().format("YYYY_MM_DD_HH_mm_ss") }.sql` + console.log(database); + mysqldump({ + connection: { + host: SERVERHOST, + user: user, + password: passwd, + database: database, + }, + dumpToFile: filename, + }); + } + +// 开始备份数据库 + function startBackSQL(){ + console.log('====>>', moment().format("YYYY-MM-DD HH:mm:ss")) + for(let item in DATABASELIST){ + const i = DATABASELIST[item]; + // 数据库信息 + let user = "root", passwd = "root", database = i + runBackFunc(user, passwd, database) + } + } + function runBackFunc(user, passwd, database){ + backSQL(user, passwd, database) + const outTime = getT() - new Date().getTime() + console.log(outTime / 1000 / 60 / 60) + setTimeout(() => { + setInterval(() => { + backSQL(user, passwd, database) + }, 1000 * 60 * mintues) + },outTime) + } + /** + * 根据系统类型,读取编码格式 + * */ + function out(data){ + if(os.platform() == 'win32'){ + return iconv.decode(data, 'GBK') + }else{ + return data + } + } + +// 读取文件目录 + function getFileList(){ + return new Promise((rec, res) => { + fs.readdir(__dirname + '/back', (err, fileList) => { + if(err){ + res(err) + }else{ + rec(fileList) + } + }) + }) + } + +// 读取文件 + function readFile(fileList){ + return new Promise(rec => { + const list = [] + for(let i in fileList){ + fs.readFile(__dirname + '/back/' + fileList[i],'utf8',function(err,datastr){ + if(err){ + list.push({ + state:false, + filename:fileList[i] + }) + }else{ + list.push({ + state:true, + filename:fileList[i], + file:datastr + }) + } + if(i == fileList.length -1){ + rec(list) + } + }) + } + }) + } + +// 删除文件 + function deleteFile(filelist){ + for(let filename of filelist){ + fs.unlink(__dirname + '/back/' + filename, (e, data) => { + if(e){ + console.log('删除文件失败:', filename) + }else{ + console.log('删除文件成功:', filename) + } + }) + } + } + + // 获取明天凌晨时间 + function getT(){ + const now = moment().endOf('day') + const TT = new Date(now).getTime() + return TT + } + + +// 启动本地备份 + startBackSQL() +} + +// server() +back() \ No newline at end of file diff --git a/05=backSQL/test.js b/05=backSQL/test.js new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/.gitignore b/06===BPEMR/.gitignore new file mode 100644 index 0000000..f63c99a --- /dev/null +++ b/06===BPEMR/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist.* +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/06===BPEMR/.obsidian/app.json b/06===BPEMR/.obsidian/app.json new file mode 100644 index 0000000..5a06240 --- /dev/null +++ b/06===BPEMR/.obsidian/app.json @@ -0,0 +1,6 @@ +{ + "showLineNumber": true, + "strictLineBreaks": true, + "livePreview": false, + "readableLineLength": false +} \ No newline at end of file diff --git a/06===BPEMR/.obsidian/appearance.json b/06===BPEMR/.obsidian/appearance.json new file mode 100644 index 0000000..c8c365d --- /dev/null +++ b/06===BPEMR/.obsidian/appearance.json @@ -0,0 +1,3 @@ +{ + "accentColor": "" +} \ No newline at end of file diff --git a/06===BPEMR/.obsidian/core-plugins-migration.json b/06===BPEMR/.obsidian/core-plugins-migration.json new file mode 100644 index 0000000..3106ebd --- /dev/null +++ b/06===BPEMR/.obsidian/core-plugins-migration.json @@ -0,0 +1,29 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "starred": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false +} \ No newline at end of file diff --git a/06===BPEMR/.obsidian/core-plugins.json b/06===BPEMR/.obsidian/core-plugins.json new file mode 100644 index 0000000..086a8e4 --- /dev/null +++ b/06===BPEMR/.obsidian/core-plugins.json @@ -0,0 +1,20 @@ +[ + "file-explorer", + "global-search", + "switcher", + "graph", + "backlink", + "canvas", + "outgoing-link", + "tag-pane", + "page-preview", + "daily-notes", + "templates", + "note-composer", + "command-palette", + "editor-status", + "starred", + "outline", + "word-count", + "file-recovery" +] \ No newline at end of file diff --git a/06===BPEMR/.obsidian/hotkeys.json b/06===BPEMR/.obsidian/hotkeys.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/06===BPEMR/.obsidian/hotkeys.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/06===BPEMR/.obsidian/workspace.json b/06===BPEMR/.obsidian/workspace.json new file mode 100644 index 0000000..d73a680 --- /dev/null +++ b/06===BPEMR/.obsidian/workspace.json @@ -0,0 +1,261 @@ +{ + "main": { + "id": "2218a07615f59148", + "type": "split", + "children": [ + { + "id": "9149a57b66e2b18f", + "type": "tabs", + "children": [ + { + "id": "9955fbf4bf564a5f", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "xi-note-computer/Xi-S-XinQu/XQ01-需求导入.md", + "mode": "source", + "source": false + } + } + }, + { + "id": "77c1c070d5cc0391", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "xi-note-computer/Xi-S-XinQu/XQ02-前置功能模块.md", + "mode": "source", + "source": true + } + } + }, + { + "id": "0d80a88c671858ec", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker.md", + "mode": "preview", + "source": true + } + } + }, + { + "id": "adef42b9e025b76f", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "xi-note-computer/Xi-S-XinQu/XQ04-场景分析.md", + "mode": "source", + "source": true + } + } + }, + { + "id": "2a9801334c755e55", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "xi-note-computer/Xi-S-XinQu/XQ05-数据库建设.md", + "mode": "source", + "source": true + } + } + }, + { + "id": "5f4f4377096139bb", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "xi-note-computer/Xi-S-XinQu/XQ06-接口建设和自动化测试.md", + "mode": "source", + "source": true + } + } + }, + { + "id": "865a0430bf7de6b4", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "xi-note-computer/Xi-S-XinQu/XQ07-建设工程控制-流程和工期.md", + "mode": "source", + "source": true + } + } + }, + { + "id": "a68eb5f97f7d52fb", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "xi-note-computer/Xi-S-XinQu/XQ04-场景分析.md", + "mode": "source", + "source": true + } + } + } + ], + "currentTab": 2 + } + ], + "direction": "vertical" + }, + "left": { + "id": "031afcfa2e5c3d38", + "type": "split", + "children": [ + { + "id": "9df5292d246cabad", + "type": "tabs", + "children": [ + { + "id": "eeb8ccc1c5b3586e", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical" + } + } + }, + { + "id": "0f4aeb5a182cb867", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + }, + { + "id": "d2aa27dce7bce4b4", + "type": "leaf", + "state": { + "type": "starred", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 300 + }, + "right": { + "id": "b15348c4f378485a", + "type": "split", + "children": [ + { + "id": "05912433d3ad08ad", + "type": "tabs", + "children": [ + { + "id": "aa72d73ebf8c1754", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker.md", + "collapseAll": true, + "extraContext": true, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "2bb87078a7b9039b", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "file": "xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker.md", + "linksCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "0eac151b5b1041f2", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "alphabetical", + "useHierarchy": true + } + } + }, + { + "id": "b4869147578dd521", + "type": "leaf", + "state": { + "type": "outline", + "state": { + "file": "xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker.md" + } + } + } + ], + "currentTab": 3 + } + ], + "direction": "horizontal", + "width": 300 + }, + "left-ribbon": { + "hiddenItems": { + "canvas:新建白板": false, + "switcher:打开快速切换": false, + "graph:查看关系图谱": false, + "daily-notes:打开/创建今天的日记": false, + "templates:插入模板": false, + "command-palette:打开命令面板": false + } + }, + "active": "0d80a88c671858ec", + "lastOpenFiles": [ + "xi-note-computer/Xi-S-XinQu/XQ10-程序结构/微服务架构拓扑.canvas", + "xi-note-computer/Xi-S-XinQu/XQ03-需求模块分析.md", + "xi-note-computer/Xi-S-XinQu/XQ02-前置功能模块.md", + "xi-note-computer/Xi-S-XinQu/XQ01-需求导入.md", + "xi-note-computer/Xi-S-XinQu/数据库/sql.sql", + "xi-note-computer/Xi-S-XinQu/数据库", + "xi-note-computer/Xi-S-XinQu/XQ10-程序结构/用户系统数据架构.canvas", + "xi-note-computer/Xi-S-XinQu/XQ08-预期和阶段成果.md", + "xi-note-computer/Xi-S-XinQu/XQ07-建设工程控制-流程和工期.md", + "xi-note-computer/Xi-S-XinQu/XQ06-接口建设和自动化测试.md", + "xi-note-computer/Xi-S-XinQu/XQ05-数据库建设.md", + "xi-note-computer/Xi-S-XinQu/XQ04-场景分析.md", + "xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/TypeScript.md", + "xi-note-computer/Xi-S-XinQu/XQ10-程序结构", + "xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/Framework/Fastify/Started入门.md", + "xi-note-computer/Xi-S-XinQu/Readme.md", + "xi-note-computer/Xi-S-XinQu", + "xi-note-computer/Xi-C-操作系统/Windows/wsl2总结.md", + "xi-note-computer/Xi-C-操作系统/Windows", + "xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/005.ts", + "xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/005.js", + "xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/Framework/JS后端框架.DIRNAME", + "xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/Framework/Fastify", + "xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/Framework" + ] +} \ No newline at end of file diff --git a/06===BPEMR/readme.md b/06===BPEMR/readme.md new file mode 100644 index 0000000..3ce94de --- /dev/null +++ b/06===BPEMR/readme.md @@ -0,0 +1,11 @@ +# BPEMR + +> 此文件为我的档案和笔记目录,记录学习过程 + +touch README.md +git init +git checkout -b main +git add README.md +git commit -m "first commit" +git remote add origin http://togy.top/expressgy/BPEMR.git +git push -u origin main \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/.obsidian/app.json b/06===BPEMR/xi-note-computer/.obsidian/app.json new file mode 100644 index 0000000..1d0de4a --- /dev/null +++ b/06===BPEMR/xi-note-computer/.obsidian/app.json @@ -0,0 +1,13 @@ +{ + "livePreview": false, + "defaultViewMode": "preview", + "strictLineBreaks": true, + "showLineNumber": true, + "trashOption": "local", + "newFileLocation": "folder", + "newFileFolderPath": "Live", + "attachmentFolderPath": "Static", + "showUnsupportedFiles": true, + "rightToLeft": false, + "readableLineLength": true +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/.obsidian/appearance.json b/06===BPEMR/xi-note-computer/.obsidian/appearance.json new file mode 100644 index 0000000..0e92b13 --- /dev/null +++ b/06===BPEMR/xi-note-computer/.obsidian/appearance.json @@ -0,0 +1,8 @@ +{ + "accentColor": "", + "theme": "moonstone", + "translucency": true, + "baseFontSize": 14, + "showViewHeader": true, + "nativeMenus": false +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/.obsidian/core-plugins-migration.json b/06===BPEMR/xi-note-computer/.obsidian/core-plugins-migration.json new file mode 100644 index 0000000..0d984b0 --- /dev/null +++ b/06===BPEMR/xi-note-computer/.obsidian/core-plugins-migration.json @@ -0,0 +1,30 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "starred": true, + "markdown-importer": true, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": true, + "file-recovery": true, + "publish": false, + "sync": false, + "bookmarks": true +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/.obsidian/core-plugins.json b/06===BPEMR/xi-note-computer/.obsidian/core-plugins.json new file mode 100644 index 0000000..a371a7d --- /dev/null +++ b/06===BPEMR/xi-note-computer/.obsidian/core-plugins.json @@ -0,0 +1,22 @@ +[ + "file-explorer", + "global-search", + "switcher", + "graph", + "backlink", + "canvas", + "outgoing-link", + "tag-pane", + "page-preview", + "daily-notes", + "templates", + "note-composer", + "command-palette", + "editor-status", + "bookmarks", + "markdown-importer", + "outline", + "word-count", + "workspaces", + "file-recovery" +] \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/.obsidian/hotkeys.json b/06===BPEMR/xi-note-computer/.obsidian/hotkeys.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/06===BPEMR/xi-note-computer/.obsidian/hotkeys.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/.obsidian/workspace.json b/06===BPEMR/xi-note-computer/.obsidian/workspace.json new file mode 100644 index 0000000..a653ce3 --- /dev/null +++ b/06===BPEMR/xi-note-computer/.obsidian/workspace.json @@ -0,0 +1,207 @@ +{ + "main": { + "id": "2f176d200d18214b", + "type": "split", + "children": [ + { + "id": "104d6435bbe86dbc", + "type": "tabs", + "children": [ + { + "id": "264e1df08e6f4985", + "type": "leaf", + "state": { + "type": "empty", + "state": {} + } + }, + { + "id": "db94edc33cedf522", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "风.md", + "mode": "source", + "source": true + } + } + } + ], + "currentTab": 1 + } + ], + "direction": "vertical" + }, + "left": { + "id": "4a37ba04e69118b6", + "type": "split", + "children": [ + { + "id": "114dfc492c2d3584", + "type": "tabs", + "children": [ + { + "id": "dc5d3e39d8240cca", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical" + } + } + }, + { + "id": "27fe86675b840c4a", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": true, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + }, + { + "id": "959fd55e91122234", + "type": "leaf", + "state": { + "type": "starred", + "state": {} + } + }, + { + "id": "eeb78d2710b89578", + "type": "leaf", + "state": { + "type": "bookmarks", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 288.5 + }, + "right": { + "id": "8c260bb0d243a858", + "type": "split", + "children": [ + { + "id": "1acbaf85a33d2577", + "type": "tabs", + "children": [ + { + "id": "d799646b979d9da0", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "风.md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "69640ca19ee2077e", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "file": "风.md", + "linksCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "a52ae6ce4d5f55fb", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": false + } + } + }, + { + "id": "fa99c4b5654469e2", + "type": "leaf", + "state": { + "type": "outline", + "state": { + "file": "风.md" + } + } + } + ], + "currentTab": 3 + } + ], + "direction": "horizontal", + "width": 283.5 + }, + "left-ribbon": { + "hiddenItems": { + "canvas:新建白板": false, + "markdown-importer:打开 Markdown 格式转换器": false, + "workspaces:管理工作区布局": false, + "switcher:打开快速切换": false, + "graph:查看关系图谱": false, + "daily-notes:打开/创建今天的日记": false, + "templates:插入模板": false, + "command-palette:打开命令面板": false + } + }, + "active": "db94edc33cedf522", + "lastOpenFiles": [ + "风.md", + "Xi-S-XinQu/Readme.md", + "Xi-C-操作系统/Linux/Docker/Docker.md", + "Xi-S-XinQu/XQ10-程序结构/用户系统数据架构.canvas", + "Xi-S-XinQu/XQ10-程序结构/微服务架构拓扑.canvas", + "Xi-A-Program/Xi-A9-Databases/MongoDB/MongoDB官网版.md", + "Xi-S-XinQu/XQ01-需求导入.md", + "Xi-A-Program/Xi-A9-Databases/MongoDB", + "Xi-A-Program/Xi-A9-Databases", + "Xi-S-XinQu/未命名", + "Xi-S-XinQu", + "未命名.canvas", + "Xi-A-Program/Xi-A1-JavaScript/Framework/Fastify/Started入门.md", + "Xi-Plan9/2023年.md", + "Xi-A-Program/Xi-A1-JavaScript/JS/JavaScript高级程序设计(第四版)深入学习.md", + "Xi-A-Program/Xi-A1-JavaScript/Framework/JS后端框架.DIRNAME", + "Xi-A-Program/Xi-A1-JavaScript/Framework/新建 文本文档.txt", + "Xi-A-Program/Xi-A1-JavaScript/Framework/JS后端框架.DIRNAME.md", + "Xi-A-Program/Xi-A1-JavaScript/Framework/Nest", + "Xi-A-Program/Xi-A1-JavaScript/Framework/Fastify", + "Xi-A-Program/Xi-A1-JavaScript/Framework", + "Xi-A-Program/Xi-A1-JavaScript/JS/尚学堂.md", + "Xi-A-Program/Xi-A1-JavaScript/JS/截屏2021-08-22 上午3.17.45.png", + "Xi-A-Program/Xi-A1-JavaScript/ES/JS 面向对象再学习.md", + "Xi-A-Program/Xi-A1-JavaScript/ES/JS高级.md", + "Xi-A-Program/Xi-A1-JavaScript/TypeScript/TypeScript.md", + "Xi-C-操作系统/Windows/wsl2总结.md", + "Xi-C-操作系统/Windows", + "Xi-A-编程/Xi-A1-JavaScript语言/JS/尚学堂.md", + "Xi-A-编程/Xi-A2-前端知识/HTML/尚学堂.md", + "Xi-A-编程/Xi-A3-GoLang/Golang.md", + "Xi-C-操作系统/Linux/ArchLinux.svg", + "Xi-C-操作系统/Linux/UFW.md", + "Xi-C-操作系统/Linux/Shell.md", + "Xi-C-操作系统/Linux/Docker/Docker.svg", + "Xi-C-操作系统/Linux/Docker/docker.png" + ] +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/.trash/Golang.md b/06===BPEMR/xi-note-computer/.trash/Golang.md new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/.trash/JS后端框架.DIRNAME.md b/06===BPEMR/xi-note-computer/.trash/JS后端框架.DIRNAME.md new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/.trash/未命名.canvas b/06===BPEMR/xi-note-computer/.trash/未命名.canvas new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/06===BPEMR/xi-note-computer/.trash/未命名.canvas @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Static/Docker Engine.png b/06===BPEMR/xi-note-computer/Static/Docker Engine.png new file mode 100644 index 0000000..59c83d4 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Static/Docker Engine.png differ diff --git a/06===BPEMR/xi-note-computer/Static/Docker.svg b/06===BPEMR/xi-note-computer/Static/Docker.svg new file mode 100644 index 0000000..d2a1f5f --- /dev/null +++ b/06===BPEMR/xi-note-computer/Static/Docker.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Static/Docker和VMware区别.png b/06===BPEMR/xi-note-computer/Static/Docker和VMware区别.png new file mode 100644 index 0000000..308c3bb Binary files /dev/null and b/06===BPEMR/xi-note-computer/Static/Docker和VMware区别.png differ diff --git a/06===BPEMR/xi-note-computer/Static/Docker平台组成.png b/06===BPEMR/xi-note-computer/Static/Docker平台组成.png new file mode 100644 index 0000000..5f860c2 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Static/Docker平台组成.png differ diff --git a/06===BPEMR/xi-note-computer/Static/Docker核心.png b/06===BPEMR/xi-note-computer/Static/Docker核心.png new file mode 100644 index 0000000..baaa5df Binary files /dev/null and b/06===BPEMR/xi-note-computer/Static/Docker核心.png differ diff --git a/06===BPEMR/xi-note-computer/Static/Docker生命周期.png b/06===BPEMR/xi-note-computer/Static/Docker生命周期.png new file mode 100644 index 0000000..3250212 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Static/Docker生命周期.png differ diff --git a/06===BPEMR/xi-note-computer/Static/镜像分层原理.png b/06===BPEMR/xi-note-computer/Static/镜像分层原理.png new file mode 100644 index 0000000..9290ed2 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Static/镜像分层原理.png differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/ES/ES.dirname b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/ES/ES.dirname new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/ES/JS 面向对象再学习.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/ES/JS 面向对象再学习.md new file mode 100644 index 0000000..380af16 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/ES/JS 面向对象再学习.md @@ -0,0 +1,284 @@ +# JS 面向对象再学习 + + + +```js +class Satr{ + constructor(name){ + this.name = name; + } +} +``` + +```js +class Father{ + constructor(xing){ + this.xing = xing; + } + say(){ + return 'i am father' + } +} + +class Son extends Father{ + construvtor(xing, ming){ + super(xing);// super必须在子类this之前调用 + this.ming = ming + console.log(this.xing, this.ming) + } + say(){ + console.log(super.say() + '的儿子') + } +} +``` + +类再ES6没有变量提升,不能再类定义之前使用类 + +利用构造函数创建对象 + +```js +function Star(name, age){ + this.name = name; + this.age = age; + this.song = function() { + console.log(' ican sing song.') + } +} +Star.sex = "男";// 静态成员,只能通过构造函数访问,Satr + +const 张学友 = new Start('张学友', 18) +``` + +*this创建的对象为实例对象,实例对象只能用实例化的对象调用,也就是需要被 new* + +构造函数创建实例都西昂浪费空间,对象内复杂的对象在实例化的时候会开辟新的内存 + +```js +function A(){ + this.run = function(){ + return 'Hello World!' + } +} +const b = new A(); +const c = new A(); +b.run === c.run;// false +``` + +**每一个构造函数都有一个原型对象 prototype ** + +每一个实例共享对象 + + + +实例对象的`__proto__`指向原型对象的`prototype` + +先查找对象身上的,案子查看`__proto__`上的 + +`__proto__`和`prototype`中的`constructor`指向构造函数本身(这也是他的作用) + +构造函数的`prototype`被覆盖了的话用`constructor`指回原来的构造函数 + + + + + +call调用函数,并改变this + +```js +function fn(){ + console.log('Hello,world!'); +} +fn.call();// Hello,world! +// fn的this为window +fn.call(obj); +// fn的this为obj + +function a(x, y){ + console.log(this, x, y) +} +a.call(obj, x, y);// 第一个参数是this指向 +``` + +```js +function Father(name){ + this.name = name; +} +function Son(name){ + Father.call(this, name);// call执行了Father,并把自己的this传递进去,此时,Father进行this.name = name操作实际上是给Son添加name +} + +Son.prototype = Father.prototype; +Son.prototype.constructor = Son; +// 以上操作是错误的,也会改变父对象的方法 + +// 正确 +Son.prototype = new Father(); +Son.prototype.constructor = Son; +// 或者 +Son.prototype.__proto__ = Father.prototype +``` + + + +**Object.defineProperty** + +`Object.defineProperty(obj, prop, descriptor)` + +### [参数](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#参数) + +- `obj` + + 要定义属性的对象。 + +- `prop` + + 要定义或修改的属性的名称或 [`Symbol`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol) 。 + +- `descriptor` + + 要定义或修改的属性描述符。 + + + +- `configurable` + +当且仅当该属性的 `configurable` 键值为 `true` 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。 +**默认为** **`false`**。 + +- `enumerable` + + 当且仅当该属性的 `enumerable` 键值为 `true` 时,该属性才会出现在对象的枚举属性中。 **默认为 `false`**。 + +数据描述符还具有以下可选键值: + +- `value` + + 该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。 **默认为 [`undefined`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/undefined)**。 + +- `writable` + + 当且仅当该属性的 `writable` 键值为 `true` 时,属性的值,也就是上面的 `value`,才能被[`赋值运算符` (en-US)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators#assignment_operators)改变。 **默认为 `false`。** + +存取描述符还具有以下可选键值: + +- `get` + + 属性的 getter 函数,如果没有 getter,则为 `undefined`。当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入 `this` 对象(由于继承关系,这里的`this`并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值。 **默认为 [`undefined`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/undefined)**。 + +- `set` + + 属性的 setter 函数,如果没有 setter,则为 `undefined`。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 `this` 对象。 **默认为 [`undefined`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/undefined)**。 + +#### 描述符默认值汇总 + +- 拥有布尔值的键 `configurable`、`enumerable` 和 `writable` 的默认值都是 `false`。 +- 属性值和函数的键 `value`、`get` 和 `set` 字段的默认值为 `undefined`。 + + + + + + + + + + + +* 函数的特殊定义方式 + +```js +const fn = new Function('a','b','console.log(a + b);');// 必须使用字符串 +``` + + + +```js +function(){}// 调用者 +() => {}// 当前环境,定义者 +``` + + + +applay + +```js + +function fn (a, b){ + return a + b; +} + +console.log(fn.applay(window, [1, 2]));// 参数是数组,返回值是函数返回值 +``` + +bind + +``` +不调用函数 +返回值是新的函数,是原函数的拷贝 +``` + + + +严格模式 + +```js +'use strict'; + + +提高编译器效率,消除不安全,取消不严谨,增加了不可用的关键词 +// 1. 不能不定义变量就是用 a = 32 +// 2. 布恩那个删除以生命好的变量 delete a +// 3. this指向为undefined +// 4. 定时器还是window、 +// 5. 函数不允许参数重复function a(b, b) +// 6. 不允许再非函数块中写函数 +``` + + + +高阶函数:返回值是函数 + +函数柯里化:部分求值,外层函数值第一次调用后固定,内层函数可变 + + + +浅拷贝是复制第一层 + +```js +const a = { + name:'何夕', + age:12 +} +// 1 +let b = {} +for (let i in a){ + b[i] = a[i]; +} +// 2 +Object.assign(b, a);// b为需要改变的东西,a为模板 +// 3 +b = {...a} +``` + +深拷贝 + +```js +递归判断类型 +``` + + + + + +* 冒泡 +* 正则 +* Object、Array和迭代器等方法,map,set等 +* event loop +* promise +* 宏任务微任务 +* 报错 +* 异步错误捕获 + + + +* **算法** \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/ES/JS高级.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/ES/JS高级.md new file mode 100644 index 0000000..345485f --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/ES/JS高级.md @@ -0,0 +1,190 @@ +# JavaScript高级知识 + +> 2022/6/20 + + + +## 语法和数据类型 + +变量的名字又叫做**标识符** + +严格模式下直接赋值会出错`x = 12` + +如果没有赋初始值,则其值为 undefined + +var可以变量提升,let不行 + +使用 undefined 来判断一个变量是否已赋值 `input === undefined` + +`undefined` 值在布尔类型环境中会被当作 `false` 。 + +```js +var myArray = []; +if (!myArray[0]) myFunction(); +``` + +数值类型环境中 `undefined` 值会被转换为 `NaN`。 + +```js +var a; +a + 2; // 计算为 NaN +``` + +当你对一个 `null` 变量求值时,空值 `null` 在数值类型环境中会被当作 0 来对待,而布尔类型环境中会被当作 `false`。例如: + +```js +var n = null; +console.log(n * 32); // 在控制台中会显示 0 +``` + +对于函数来说,只有函数声明会被提升到顶部,而函数表达式不会被提升。 + +```js +/* 函数声明 */ + +foo(); // "bar" + +function foo() { + console.log("bar"); +} + + +/* 函数表达式 */ + +baz(); // 类型错误:baz 不是一个函数 + +var baz = function() { + console.log("bar2"); +}; +``` + +在同一作用域中,不能使用与变量名或函数名相同的名字来命名常量。例如: + +```js +// 这会造成错误 +function f() {}; +const f = 5; + +// 这也会造成错误 +function f() { + const g = 5; + var g; + + //语句 +} +``` + +七种基本数据类型:Boolean、null、undefined、数字、高精度整数BigInt、字符串、Symbol + +立即执行函数:立即执行函数只有一个作用:创建一个独立的作用域。这个作用域里面的变量,外面访问不到(即避免了「变量污染」)。 + +```js +let a = 'xsxs'; +(() => {let a;console.log(a)})() +``` + +字符串转换 + +```js +x = "The answer is " + 42 // "The answer is 42" +y = 42 + " is the answer" // "42 is the answer" + +"37" - 7 // 30 +"37" + 7 // "377" + +``` + +字符串 + +```js +var str = "this string \ +is broken \ +across multiple\ +lines." +console.log(str); // this string is broken across multiplelines. + +``` + + + + + +## 流程控制和错误处理 + +下面这些值将被计算出 false (also known as Falsy values): + +- `false` +- `undefined` +- `null` +- `0` +- `NaN` +- 空字符串(`""`) + + + + + +## 函数 + +调用自身 + +1. `arguments.callee()` **(译者注:ES5 禁止在严格模式下使用此属性)** + +剩余参数 +剩余参数语法允许将不确定数量的参数表示为数组。在下面的例子中,使用剩余参数收集从第二个到最后参数。然后,我们将这个数组的每一个数与第一个参数相乘。这个例子是使用了一个箭头函数,这将在下一节介绍。 + +```js +function multiply(multiplier, ...theArgs) { + return theArgs.map(x => multiplier * x); +} + +var arr = multiply(2, 1, 2, 3); +console.log(arr); // [2, 4, 6] +``` + + + +箭头函数和普通函数 + +箭头函数 没有proptype属性,没有arguments,不能用new创建 + +```js +"use strict" +const a1 = () => ({ + name:"THIS", + method:{ + get(){ + console.log(this.names) + } + } +}) + +const obj = { + name:a1().name, + names:"I CAN DO IT", + ...a1().method +} + +console.log(obj.name) +obj.get() +``` + +this指向,普通函数指向调用者,箭头函数指向定义者 + + + +void 或者 void 不会返回内容 + + + + + + + +Map + +键可以为任意类型 + + + +Set集合,元素不重复 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/Framework/Fastify/Started入门.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/Framework/Fastify/Started入门.md new file mode 100644 index 0000000..bcb6ec0 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/Framework/Fastify/Started入门.md @@ -0,0 +1,285 @@ +> 更新比较慢的版本,先熟悉这个教程和这个框架 +> [fastify/docs-chinese: Fastify 中文文档 (github.com)](https://github.com/fastify/docs-chinese) + +# 开始 + +准备 + +```bash +npm init -y +# 运行处加入 "build": "tsc -p tsconfig.json", +npx tsc --init +pnpm i -S fastify +pnpm i -D typescript @types/node +``` + +```ts +// started.ts +import Fastify from 'fastify' + +const fastify = Fastify({ + logger: false +}) + +fastify.get('/', async (request, reply) => { + return "Hello World" +}) + +async function start(){ + try{ + await fastify.listen({ + port:3000, + host:'0.0.0.0' + }) + }catch (e){ + fastify.log.error(e) + } +} + +start() +``` + +运行 + +```bash +npm run build +node started.js +``` + +# 路由 + +## 完整格式 + +```js +fastify.route({ + method: 'GET',// 请求类型 + url: '/',// 请求地址 + schema: {// 请求参数验证 + querystring: { + name: { type: 'string' }, + excitement: { type: 'integer' } + }, + response: {// 响应参数验证 + 200: { + type: 'object', + properties: { + hello: { type: 'string' } + } + } + } + }, + handler: function (request, reply) {// 响应程序 + reply.send({ hello: 'world' }) + } +}) +``` + +## 简写格式 + +- 也可以将处理函数卸载opts里面,但是如果简写中和opts里面都写了处理函数会报错 + +```js +const opts = { + schema: { + response: { + 200: { + type: 'object', + properties: { + hello: { type: 'string' } + } + } + } + } +} +fastify.get('/', opts, (request, reply) => { + reply.send({ hello: 'world' }) +}) +``` + +## URL构建 + +- Fastify 同时支持静态与动态的 URL +- 要注册一个**参数命名**的路径,请在参数名前加上_冒号_。_星号_表示**通配符**。 _注意,静态路由总是在参数路由和通配符之前进行匹配_ + +```js +// 参数路由 +fastify.get('/example/:userId', (request, reply) => {}) +fastify.get('/example/:userId/:secretToken', (request, reply) => {}) + +// 通配符 +fastify.get('/example/*', (request, reply) => {}) +// 多参数 +fastify.get('/example/near/:lat-:lng/radius/:r', (request, reply) => {}) +// 真实的冒号: +fastify.post('/name::verb') // 将被解释为 /name:verb +``` + +## Async, Await + +- 可以直接使用return返回值 +- 假如在路由中,`reply.send()` 脱离了 promise 链,在一个基于回调的 API 中被调用,你可以使用 `await reply`, 也可以是`return reply` +- -  `return value` 与 `reply.send(value)`同时使用只会发送第一次,同时还会触发警告日志,因为你试图发送两次响应。 + +```js +fastify.get('/', options, async function (request, reply) { + setImmediate(() => { + reply.send({ hello: 'world' }) + }) + await reply + // return reply +}) +``` + +## 路由前缀 + +```js +// server.js +const fastify = require('fastify')() + +fastify.register(require('./routes/v1/users'), { prefix: '/v1' }) +fastify.register(require('./routes/v2/users'), { prefix: '/v2' }) + +fastify.listen(3000) +``` + +```js +// routes/v1/users.js +module.exports = function (fastify, opts, done) { + fastify.get('/user', handler_v1) + done() +} +``` + +```js +// routes/v2/users.js +module.exports = function (fastify, opts, done) { + fastify.get('/user', handler_v2) + done() +} +``` + +## 自定义日志级别 + +- 可以在统一路由加入打印固定字段的,但是非必要 + +```js +// server.js +const fastify = require('fastify')({ logger: true }) + +fastify.register(require('./routes/user'), { logLevel: 'warn' }) +fastify.register(require('./routes/events'), { logLevel: 'debug' }) + +fastify.listen(3000) +``` + +- 也可以直接在路由的opts中定义 + +```js +fastify.get('/', { logLevel: 'warn' }, (request, reply) => { + reply.send({ hello: 'world' }) +}) +``` + +# 装饰器 + +```js +fastify.decorate('utility', function () { + // 新功能的代码 +}) +fastify.decorate('conf', { + db: 'some.db', + port: 3000 +}) +// 通过装饰属性的名称便可访问值: +fastify.utility() +console.log(fastify.conf.db) +``` + +路由函数的 `this` 指向 Fastify server + +```js +fastify.decorate('db', new DbConnection()) + +fastify.get('/', async function (request, reply) { + reply({hello: await this.db.query('world')}) +}) +``` + +## 检查装饰器的存在 + +用于检查服务器实例上是否存在某个装饰器: + +```js +// 用于检查服务器实例上是否存在某个装饰器: +fastify.hasDecorator('utility') +// 用于检查 Request 实例上是否存在某个装饰器 +fastify.hasRequestDecorator('utility') +// 用于检查 Reply 实例上是否存在某个装饰器 +fastify.hasReplyDecorator('utility') +``` + +# 验证和序列化 + +## 验证器复用 + +- `myField: { $ref: '#foo'}` 将在当前 schema 内搜索 `$id: '#foo'` 字段。 +- `myField: { $ref: '#/definitions/foo'}` 将在当前 schema 内搜索 `definitions.foo` 字段。 +- `myField: { $ref: 'http://url.com/sh.json#'}` 会搜索含 `$id: 'http://url.com/sh.json'` 的共用 schema。 +- `myField: { $ref: 'http://url.com/sh.json#/definitions/foo'}` 会搜索含 `$id: 'http://url.com/sh.json'` 的共用 schema,并使用其 `definitions.foo` 字段。 +- `myField: { $ref: 'http://url.com/sh.json#foo'}` 会搜索含 `$id: 'http://url.com/sh.json'` 的共用 schema,并使用其内部带 `$id: '#foo'` 的对象。 + +```js +fastify.addSchema({ + $id: 'http://example.com/', + type: 'object', + properties: { + hello: { type: 'string' } + } +}) + +fastify.post('/', { + handler () {}, + schema: { + body: { + type: 'array', + items: { $ref: 'http://example.com#/properties/hello' } + } + } +}) +// 作为根引用 +fastify.addSchema({ + $id: 'commonSchema', + type: 'object', + properties: { + hello: { type: 'string' } + } +}) + +fastify.post('/', { + handler () {}, + schema: { + body: { $ref: 'commonSchema#' }, + headers: { $ref: 'commonSchema#' } + } +}) +``` + +## 获取共用Schema + +- 当自定义验证器或序列化器的时候,Fastify 不再能控制它们,此时 `.addSchema` 方法失去了作用 + +```js +fastify.addSchema({ + $id: 'schemaId', + type: 'object', + properties: { + hello: { type: 'string' } + } +}) + +const mySchemas = fastify.getSchemas() +const mySchema = fastify.getSchema('schemaId') +``` + +## 验证 + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/Framework/JS后端框架.DIRNAME b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/Framework/JS后端框架.DIRNAME new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/Framework/NestJS/NestJS.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/Framework/NestJS/NestJS.md new file mode 100644 index 0000000..2cad25c --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/Framework/NestJS/NestJS.md @@ -0,0 +1,150 @@ +# 生命周期 + +客户端 中间件 守卫 拦截器 管道 控制器 服务 拦截器 过滤器 响应 客户端 + +- 中间件 + - 全局中间件 + - 模块中间件 +- 守卫 + - 全局守卫 + - 控制器守卫 + - 路由守卫 +- 拦截器 + - 全局拦截器pre/post + - 控制器拦截器pre/post + - 路由拦截器pre/post +- 管道 + - 全局管道 + - 控制器管道 + - 路由管道 + - 路由参数管道 +- 过滤器 + - 路由过滤器 + - 控制器过滤器 + - 全局过滤器 + +# 核心概念 + +- 控制器(ontrollers) + - 处理请求 +- 服务(Services) + - 数据访问和核心逻辑 +- 模块(Modules) + - 组合所有的逻辑代码 +- 管道(Pipes) + - 检验请求数据 +- 过滤器(filters) + - 处理请求时的错误 +- 守卫(Guards) + - 鉴权和认证 +- 拦截器(Interceptors) + - 给请求和响应加入额外的逻辑 +- 存储库(Repositores) + - 数据库中的数据处理 + +# @nestjs/config配置文件 + +```bash +pnpm i -S @nestjs/config +``` + +1. 根目录建立.env文件 + +`以键值对方式存储` + +```env +HOST = host +PORT = port +``` + +2. app.module.ts导入 + +```ts +#!app.module.ts +import {ConfigModule} from "@nestjs/config"; +import Module from "@nestjs/common" + +@Module({ + imports: [ConfigModule.forRoot({ + isGlobal: true,// 是否全局使用 + envFilePath: ".env.velopment",// 设置特定的配置文件 + loag:[() => { + return dotenv.config({path: '.env'})// 加载其他配置文件,但是上面的配置会覆盖下面已存在的配置,都配置同一个变量名,上面的生效 + }] + })] +}) + +``` + +3. user.controller.ts使用 + +```ts +import { ConfigService } from "@nestjs/config" + +@Controller('user') +export class UserController{ + constructor(private configService: ConfigService){ + + } + @Get() + getUser(): string{ + console.log(this.configService.get(DB)) + return "Hello" + } +} +``` + +4. 使用枚举使用参数 + +建立enmu文件 + +```ts +export enum ConfigEnum{ + DB = "DB", + HOST = "HOST", +} +``` + +我可以使用js文件来定义配置文件 使用load方法 + +# 数据库 + +## ORM + +- ORM(Object Relational Mapping)对象关系映射,将对象概念和数据库联系起来 + +## 数据库设计参考 + +open.yespi.cn/list.html + +## 使用TypeORM + +### 安装 + +```bash +pnpm i -S @nestjs/typeorm typeorm mysql2 +``` + +### 导入 + +```ts +#!app.module.ts +import Module from "@nestjs/common"; +import { TypeOrmMoudle } from "@nestjs/typeorm" + +@Module({ + imports: [TypeOrmModule.forRoot({ + type:"mysql", + host:"localhost", + port:3306, + username:"root", + password:"root", + database:"dbname", + entities:[], + synchronize: true,//同步本地的cchema与数据库 ,初始化使用, + logging: ['error'],// 日志等级 + + })] +}) +``` + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/JavaScript高级程序设计(第四版)深入学习.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/JavaScript高级程序设计(第四版)深入学习.md new file mode 100644 index 0000000..4a1cee0 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/JavaScript高级程序设计(第四版)深入学习.md @@ -0,0 +1,1493 @@ +# JavaScript高级程序设计(第四版)深入学习 + +> 2021/6/14 + + + +> 本书出版于2020/9 +> +> 2019的内容 + +## 第1章 什么事JavaScript + +1995 网景公司。应对低网速,实现客户端表单验证 + +我要好好学习!!! + +* ECMAScript +* DOM +* BOM + + + +## 第2章 HTML中的JavaScript + + 建议使用外部文件 + +理解加载顺序 + +延迟和下载完执行 + + + +## 第3章 语言基础 + +### 3.1 语法 + +* 区分大小写 +* 第一个字母是_和$或者字母(unicode的所有字符,包括汉字) +* 剩下的可以添加数字 +* 关键字、保留子、true、false、null不可以 + + + +* 单行注释和多行注释//。/**/ +* 严格模式,在脚本第一行加入`"use strict"`,这是全局严格模式,函数头部分可以定义整个函数 +* 最好使用分号 +* 最好使用代码块 + +### 3.2 保留字和关键字 + +### 3.3 变量 + +#### 3.1 var + +var可以在所有版本适用 + +let const值在ecma6以上 + + + +var 作用域在return后销毁 + +var可以重新赋值,也可以重新定义类型但不推荐 + +省略var定义的是全局变量**不推荐**严格模式不支持 + + + +可以反复定义一个变量,可以在使用后定义(声明提升),但不建议 + +#### 3.2 let + +let相比于var,let作用域是语句块,比如在if语句中声明的变量除了if就失效 + +let不允许多次声明(在子块中可以再次声明) + +let和var混用不会报错,只是针对不同的应用范围 + +let不会被提升 + +全局声明:window.关键字只能作用于var的全局变量,let则不行 + + + +#### 3.3 const常量 + +声明时必须赋值 + +不允许重复声明 + +不能修改值 + +和let相似 + +### 3.4 数据类型 + +6种简单类型:Undefined,Null,Boolean,Number,String,Symbol(ES6) + +复杂类型:Object对象 + +```js +let a="hello world!"; +typeof a;//"string" +typeof(a);//"string" +typeof 32;//"number" + + +//typeof是一个操作符,不是一个函数,所以不需要参数,但是也可以使用参数 +``` + +#### 3.4.2 Undefined + +let和var未赋值 + +undefined主要用于比较 + +未定义和使用未出现的值不一样,未出现的值会报错 + +```js +let a; +console.log(a);//undefined +console.log(b);//error +console.log(typeof b);//undefined,对于未声明的变量只有一个正确操作符就是typeof +``` + + + +```js +let a;//undefined +if(a)//不执行 +if(!a)//执行 +if(c)//error +``` + +#### 3.4.3 Null + +null指空对象 + +```js +let a=null; +console.log(typeof a);//Object +``` + +null用于声明空对象 + +#### 3.4.4 Boolean值 + +true!=1 + +false!=0 + +区分大小写 + +转换其他类型 + +**P33** + +#### 3.4.5 Number + +10进制直接输入 + +8进制在严格模式下不支持,一般模式下第一位是零,后面有超过基数的会当成十进制 + +16进制0x(区分大小写) + +##### 3.4.5.1浮点型 + +允许.11出现但不建议 + +默认将无效小数部分转化为整数 + +0.1+0.2=0.300000000004 + +##### 3.4.5.2范围 + +最大值:Number.MAX_VALUE + +最小值:Number.MIN_VALUE + + + +Number.NEGATIVE_INFINITY +infinity + +Number.POSTTIVE_INFINITY -infinity + + + +##### 3.4.5.3NaN + +不是数值,返回操作数值时失败 + +分母为零时 + +NaN不参与操作包括if比较 + +isNaN("32")//isNaN()检测函数 + + + +##### 3.4.5.4 数值转换 + +Number() + +parseInt()第二个参数可以指定进制parseInt("AF",16)//175 + +不指定进制需要使用标准进制表示法0xAF + +开头必须是数字,否则识别为NaN,空字符也为NaN + +parseFloat() + +详细规则**P36** + + + +#### 3.4.6 String + +##### 3.4.6.1字符字面量 + +``` +\n +\t +\b 退格 +\r +\f 换页 +\\ +``` + +转义字符在字符串中算1个字符 + + + +##### 3.4.6.2 字符串拼接 + +同Python + +##### 3.4.6.3 转换为字符串 + +a.toString()//null和undefined没有这个方法 + +一般不传参,和parseInt()一样,参数代表进制 + +##### 3.4.6.4模板字面量 + +换行会出现在字符串中正确表达 + +方便了HTML + +##### 3.4.6.5 字符串插值 + +```js +`${ a }scac`//这种样式的字符串插值必须使用1旁边的分词号 +``` + +##### 3.4.6.7 原始字符串,不转义 + +```js +String.raw'xasxas' +a="xasxax\xasxasx" +a.raw; +console.log(a.raw) +``` + +#### 3.4.6Symbol + +#### 3.4.7 Object() + +let a= new Object(); + + + +### 3.5 操作符 + +### 3.6 语句 + +#### 3.6.1 if + +```js +if (){}else{} +if(){ + +}else if(){ + +}else{ + +} +``` + +#### 3.6.2 do while + +```js +do{ + +}while() +``` + +#### 3.6.3while + +```js +while(){ + +} +``` + +#### 3.6.4 for语句 + +```js +for(){ + +} +``` + +#### 3.6.5 for in + +```js +for(a in b){ +} +``` + +#### 3.6.6 for of + +```js +for(a of b){}//严格迭代 i of window不行 +``` + +#### 3.6.7 标签语句 + +#### 3.6.8 break和continue语句 + +#### 3.6.9with + +将作用域设置给特定对象 + +```js +with(location){ + let qs=search.substring(1); + let url=href; +} +//实际上是location.search.substring(1) +``` + +#### 3.6.10 switch + +和c一样 + +``` + switch(){ + case value: + 语句 + break; + + } +``` + +### 3.7 函数 + +eval和arguments不能出现在函数名称和函数参数中 + + + +## 第4章 变量、作用域和内存 + +### 4.1原始值和引用值 + +原始值不能添加属性,有六个原始值 + +```js +let a=new String("xs");//这里变成了一哥obj +let b="xsx" +a.name="xs"//这里是错误的,但是不会报错,只是无法输出 +b.name="xs" +console.log(a.name)//xs +console.log(b.name)//undefined +console.log(typeof a)//Object +console.log(typeof a)//String +``` + +#### 4.1.2 复制值 + +原始值直接复制 + +引用值复制的是对象指针,修改原数据,复制值也会改变 + +#### 4.1.3 函数传参 + +传参都是按值传参(各自的方式) + +原始值和引用值都是通过自己的方式复制过去 + +#### 4.1.4 确定类型 + +typeof面对对象或者undefined。 输出的是Object + +### 4.2 执行上下文和作用域 + +#### 4.2.2 变量声明 + +1var + +自动添加到最近的上下文 + +2let + +块级 + +3**标识符查找** + +函数面对标识符时先在最近的上下文查找,查找不到在进行上下文查找,如果在最近的查找到了,就不会再运用全局的 + +### 4.3 垃圾回收 + +标记清理 + +引用计数(有问题已弃用) + +#### 4.3.3性能 + +调度垃圾回收过于频繁会造成性能浪费 + +#### 4.3.4内存 + +手动释放 + +变量=null + +多使用 let 和const + +隐藏类:用同一个函数初始化,在定义函数时候初始化属性,让新创建的函数隐藏函数保持一致 + +内存泄漏:没有声明的变量直接赋值,成为全局变量,不会自动回收 + + + + + +## 第5章 基本引用类型 + +引用类型不是类 + +new 构造函数;//创建一个对象 + +### 5.1 Date + +1970/1/1 + +```js +let now = new Date(); +now=new Date(Date.parse("6/15/2021"));//指定日期 +now=new Date("6/15/2021");//同上面,构造函数隐式调用 +now=new Date(Date.UTC(2021,0,1,12,5,21)) +now=new Date(2021,0,1,12,5,21)//构造函数隐式调用 + +let starttime=Date.now() +let wndtime=Date.now() +``` + +#### 5.1.1 继承的方法 + +```js +now.toLocaleString();//本地时间 +now.toString();//包含时区 +``` + +#### 5.1.2 日期格式化 + +```js + +now=new Date() +//Date Tue Jun 15 2021 15:53:25 GMT+0800 (中国标准时间) + +now.toLocaleString() +//"2021/6/15 下午3:53:25" +now.toDateString() +//"Tue Jun 15 2021" +now.toTimeString() +//"15:53:25 GMT+0800 (中国标准时间)" +now.toLocaleDateString() +//"2021/6/15" +now.toLocaleTimeString() +//"下午3:53:25" +now.toUTCString() +//"Tue, 15 Jun 2021 07:53:25 GMT" +``` + +#### 5.1.3 日起时间方法 + +**P106** + +### 5.2 RegExp + +正则表达式 + +### 5.3 原始值包装类型 + +```js +let str1="i love u!"; +let str2=str1.substring(2);//正常逻辑下这是错误的 +``` + +第二次访问str1的时候,以只读模式进行 + +```js +let str1=new String("i love u!"); +let str2=str1.substring(2); +s1=null; +``` + +#### 5.3.1 Boolean + +```js +let booleantrueobj=new Obiect(true);//这是一个存储布尔值的对象 + +//因为是对象,不管布尔值是什么,用对象做比较永远是true +``` + +尽量永远不要使用boolean对象 + +#### 5.3.2 Number + +toFixed(2)//指定小数位数 + +四舍五入 + +toExponential(2)//指定科学计数法 + +.toPrecision(5)//数字总位数 + +Number.isInteger(num);//判断是你不是整数 + +#### 5.3.3 String + +1 JavaScript字符 + +str.length + +charCodeAt()可以查看字符的编码 + +2 normalize()方法 + +某些unicode字符有多个遍吗 + +3 字符串操作方法 + +常用的str1.slice(起始,-3) + +Str1.substring(2) 第二个字符后面的 + +Str1.substr(-3) + +4 字符串位置方法 + +Str1.indexOf("o",起始位置int) + +Str1.lastIndexOf("0",起始位置int) + +5 + +6 trim()删除前后的空格 str1.trim() + +7 repeat()赋值几遍str1.repeat(5)//赋值5遍 + +8 **填充** + +padStart(),padEnd() + +字符串超限无法使用 + +```js +let a="ABCDE" + +console.log(a.padStart(10,"*")) +//*****ABCDE debugger eval code:1:9 + +console.log(a.padEnd(10,"*")) +//ABCDE***** debugger eval code:1:9 + +``` + +9 迭代 + +```js +for (const c of "abcde") { + console.log(c); +} +``` + +10 字符串大小写转换 + +```js +let stringValue = "hello world"; +console.log(stringValue.toLocaleUpperCase()); // "HELLO WORLD" +console.log(stringValue.toUpperCase()); // "HELLO WORLD" +console.log(stringValue.toLocaleLowerCase()); // "hello world" +console.log(stringValue.toLowerCase()); // "hello world" +``` + +11 + +12 localeCompare()方法 + +比较字符顺序 + +```js +let a="何"; +let b="小"; +let c="啊" +a.localeCompare(b); +//-1 +b.localeCompare(a) +//1 +a.charCodeAt() +20309 +b.charCodeAt() +23567 +c.charCodeAt() +21834 +``` + +### 5.4 单例内置对象 + +#### 5.4.1Global + +1 URL编码方法 + +将字符替换为编码 + +```js +let uri = "http://www.wrox.com/illegal value.js#start"; +// "http://www.wrox.com/illegal%20value.js#start" +console.log(encodeURI(uri)); +// "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start" +console.log(encodeURIComponent(uri)); +``` + +将编码替换为字符(只能替换自己支持的字符) + +```js +let uri = "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start"; +// http%3A%2F%2Fwww.wrox.com%2Fillegal value.js%23start +console.log(decodeURI(uri)); +// http:// www.wrox.com/illegal value.js#start +console.log(decodeURIComponent(uri)); +``` + +2 eval() + +将内容加入到上下文中 + +```js +eval("console.log('hi')"); +// 上面这行代码的功能与下一行等价: +console.log("hi"); +``` + +#### 5.4.2 Math + +2 min(数组), max(数组) + +3 舍入方法 + +```js +//Math.ceil()方法始终向上舍入为最接近的整数。5.4 单例内置对象 133 +//Math.floor()方法始终向下舍入为最接近的整数。 +//Math.round()方法执行四舍五入。 +//Math.fround()方法返回数值最接近的单精度(32 位)浮点值表示。 +``` + +4 random()随机数0-1不包括1 + +5 其他方法 + +Math.abs(x)绝对值 + +Math.pow(a,b)a的b次幂 + +Math.trunc(x)x的整数 + + + +## 第6章 集合引用类型 + +### 6.1 Object + +显式地创建 + +```js +//第一种是使用 new 操作符和 Object 构造函数 +let person = new Object(); +person.name = "Nicholas"; +person.age = 29; +//另一种方式是使用 *对象字面量* (object literal)表示法 +let person = { + name: "Nicholas", + age: 29 +}; +//在对象字面量表示法中,属性名可以是字符串或数值,比如: +let person = { + "name": "Nicholas", + "age": 29, + 5: true //自动将5转化为字符串格式 +}; +//属性一般是通过点语法来存取的,这也是面向对象语言的惯例 +//但也可以使用中括号来存取属性。在使用中括号时,要在括号内使用属性名的字符串形式 +console.log(person["name"]); // "Nicholas" +console.log(person.name); // "Nicholas" +``` + +### 6.2 Array + +跟其他语言中的数组一样,ECMAScript 数组也是**一组有序的数据**,但跟其他语言 不同的是,数**组中每个槽位可以存储任意类型的数据**。 + +#### 6.2.1创建数组 + +```js +//使用 Array 构造函数 +let arr = new Array(); +let arr = new Array(20);//长度为20,可省略new +let arr= new Array("Hello","World","!");//含有三个,可省略new + +//使用数组字面量(array literal)表示法 +let colors = ["red", "blue", "green"]; // 创建一个包含 3 个元素的数组 +let names = []; // 创建一个空数组 +let values = [1,2,]; // 创建一个包含 2 个元素的数组 +//与对象一样,在使用数组字面量表示法创建数组不会调用 Array 构造函数 +``` + +from 和 of + +```js +const a1 = [1, 2, 3, 4]; +const a2 = Array.from(a1, x => x**2); +const a3 = Array.from(a1, function(x) {return x**this.exponent}, {exponent: 2}); +console.log(a2); // [1, 4, 9, 16] +console.log(a3); // [1, 4, 9, 16] + +``` + +#### 6.2.2 数组空位 + +用逗号创建 + +ES6之前将空位解释为undefined + +#### 6.2.3 数组索引 + +同其他语言,但是可以超过长度,被解析为undefined + +```js +//使用 length 属性可以方便地向数组末尾添加元素,如下例所示: +let colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组 +colors[colors.length] = "black"; // 添加一种颜色(位置 3) +colors[colors.length] = "brown"; // 再添加一种颜色(位置 4) +``` + +数组最多可以包含 4 294 967 295 个元素 + +#### 6.2.4 检测数组 + +```js +if (Array.isArray(value)){ + // 操作数组 +} +``` + +#### 6.2.5 迭代器方法 + +keys()返回数组索引的迭代器,values()返回数组元素的迭代器,而 entries()返回 索引/值对的迭代器: + +```js +const a = ["foo", "bar", "baz", "qux"]; +// 因为这些方法都返回迭代器,所以可以将它们的内容 +// 通过 Array.from()直接转换为数组实例 +const aKeys = Array.from(a.keys()); +const aValues = Array.from(a.values()); +const aEntries = Array.from(a.entries()); +console.log(aKeys); // [0, 1, 2, 3] +console.log(aValues); // ["foo", "bar", "baz", "qux"] +console.log(aEntries); // [[0, "foo"], [1, "bar"], [2, "baz"], [3, "qux"]] + +//使用 ES6 的解构可以非常容易地在循环中拆分键/值对 +const a = ["foo", "bar", "baz", "qux"]; +for (const [idx, element] of a.entries()) { + alert(idx); + alert(element); +} +``` + +#### 6.2.6 复制和填充方法 + +```js +//fill() +let arr=[1,2,3,1,4,5,6,5] +arr.fill(填充内容,起始,结束(不包含)) +arr.copyWithin(从哪儿开始填充,原来文本的开始,原来文本的结束(不包含)) +``` + +#### 6.2.7 转化方法 + +```js +let colors = ["red", "green", "blue"]; +alert(colors.join(",")); // red,green,blue +alert(colors.join("||")); // red||green||blue +``` + +#### 6.2.8 栈方法 + +```js +let a=["i","l","o","v","e","u"] +a.push("!"); +a.push("w","j","y") +a.pop();//删除并返回,同时减少length +``` + +#### 6.2.9 队列方法 + +```js +a.shift();//删除开头并返回; +``` + +#### 6.2.10 排序方法 + +```js +let values = [1, 2, 3, 4, 5]; +values.reverse();//反响排序,此方法不够灵活 +values.sort(); //升序,但是先转化为字符串,10在5前面 + +//比较函数 +values.sort((a, b) => a < b ? 1 : a > b ? -1 : 0); +//同下 +function compare(value1, value2) { + if (value1 < value2) { + return 1; + } else if (value1 > value2) { + return -1; + } else { + return 0; + } +} +let values = [0, 1, 5, 10, 15]; +values.sort(compare); +alert(values); // 15,10,5,1,0 +``` + +#### 6.2.11 操作方法 + +concat();我感觉可以用append()代替 + +Slice(a,b);切片可以用负值 + +**splice();** + +* 删除splice(开始删除的位置,删除的数量) +* 插入splice(开始位置,删除数量,插入值(后面可以是多个)) +* 替换splice(开始位置,删除数量(也就是替换,为0不替换),插入值(同上)) + +#### 6.2.12 搜索和位置方法 + +1 严格相等 + +```js +a.indexOf()有返回对象,没有返回-1 +a.lastIndexOf()有返回对象,没有返回-1 +a.includes()返回布尔值 +``` + +#### 6.2.13 迭代 + +?? + +#### 6.2.14 归并方法 + +?? + +### 6.3 定型数组 + +### 6.4 Map + +#### 6.4.1 基本API + +```js +const m = new Map(); +alert(m.has("firstName")); // false +alert(m.get("firstName")); // undefined +alert(m.size); // 0 +m.set("firstName", "Matt") + .set("lastName", "Frisbie"); +alert(m.has("firstName")); // true +alert(m.get("firstName")); // Matt +alert(m.size); // 2 +m.delete("firstName"); // 只删除这一个键/值对 +alert(m.has("firstName")); // false +alert(m.has("lastName")); // true +alert(m.size); // 1 +m.clear(); // 清除这个映射实例中的所有键/值对 +alert(m.has("firstName")); // false +alert(m.has("lastName")); // false +alert(m.size); // 0 +``` + +#### 6.4.2 + +#### 6.4.3 选择 + +P168 + +### 6.5 WeakMap + +### 6.6 Set + +### 6.7 WeakSet + + + +## 第7章 迭代器与生成器 + +## 第8章 对象、类与面向对象编程 + +## 第9章 代理与反射 +ECMAScript6 新增 +### 9.1 代理基础 +代理是目标对象的抽象 +代理类似C++指针 +可以用作目标对象的替身、但又完全独立于目标对象。 + +#### 9.1.1 创建空代理 + + +## 第10章 函数 +函数定义的方法: +1. 函数声明 +```js +function function_name(argument) { + // body... + return argument; +}; +``` +2. 函数表达式 +```js +let fun=function(a){ + return a; +}; + +``` +3. 构造函数 +```js +let fun=Function("a","return a"); +//所有函数定义都会在最后转化为这种格式 +``` + + +### 10.1 箭头函数 +```js +let fun=(a,b)=>{return a+b;}; + +``` +### 10.2 函数名 +函数名是指向函数的指针,所以函数可以有多个名称 +函数都有一个name属性,a.name//a + +### 10.3 理解参数 + +### 10.4 没有重载 +在js种重复声明函数会覆盖,好像还会报错 + +### 10.5 默认参数值 +```js +function makeKing(name) { + name = (typeof name !== 'undefined') ? name : 'Henry'; //如果函数调用时没有参数,默认为。。。 + return `King ${name} VIII`; +} + + +function makeKing(name = 'Henry', numerals = 'VIII') { //多个默认参数 + return `King ${name} ${numerals}`; +} +console.log(makeKing()); // 'King Henry VIII' +console.log(makeKing('Louis')); // 'King Louis VIII' + + +//箭头函数也可以 + +``` +* 默认参数作用域与暂死区 + +```js +// 参数初始化顺序遵循“暂时性死区”规则,即前面定义的参数不能引用后面定义的。像这样就会抛出错误: +// 调用时不传第一个参数会报错 +function makeKing(name = numerals, numerals = 'VIII') { + return `King ${name} ${numerals}`; +} +// 参数也存在于自己的作用域中,它们不能引用函数体的作用域: +// 调用时不传第二个参数会报错 +function makeKing(name = 'Henry', numerals = defaultNumeral) { + let defaultNumeral = 'VIII'; + return `King ${name} ${numerals}`; +} +``` + +### 10.6 + +### 10.7 函数声明与函数表达式 +JavaScript引擎在加载数据时对他们区别对待,在任何代码执行钱,会先读取函数声明,并在执行上下文中生成函数定义,而函数表达式必须等到代码执行到它的一行才会在执行上下文中生成函数定义 + +```js +// 没问题 +console.log(sum(10, 10)); +function sum(num1, num2) { + return num1 + num2; +} + +// 会出错 +console.log(sum(10, 10)); +let sum = function(num1, num2) { + return num1 + num2; +}; +``` +### 10.8 函数作为参数 + + +### 10.9 函数内部 +在 ECMAScript 5 中,函数内部存在两个特殊的对象:arguments 和 this。ECMAScript 6 又新增 +了 new.target 属性。 +#### 10.9.1 argments + +```js +function factorial(num) { + if (num <= 1) { + return 1; + } else { + return num * factorial(num - 1); + } +} +//阶乘函数 + +function factorial(num) { + if (num <= 1) { + return 1; + } else { + return num * arguments.callee(num - 1); //无论函数名是什么,都可以使用arguments.callee()调用 + } +} + +``` + + +#### 10.9.2 this + + +#### 10.9.3 caller +```js +function outer() { + inner(); +} +function inner() { + console.log(inner.caller); +} +outer();//会显示outer的源代码 +inner();//null +``` + +### 10.10函数属性和方法 +每个函数都有两个属性:length +和 prototype。其中,length 属性保存函数定义的命名参数的个数 +```js +function sayName(name) { + console.log(name); +} +function sum(num1, num2) { + return num1 + num2; +} +function sayHi() { + console.log("hi"); +} +console.log(sayName.length); // 1 +console.log(sum.length); // 2 +console.log(sayHi.length); // 0 + +``` + + +### 10.11 函数表达式 + + +### 10.12 递归 + +??????????????????? + +### 10.14 闭包 + +### 10.15 立即调用的函数表达式 +```js +使用 IIFE 可以模拟块级作用域,即在一个函数表达式内部声明变量,然后立即调用这个函数。这 +样位于函数体作用域的变量就像是在块级作用域中一样。ECMAScript 5 尚未支持块级作用域,使用 IIFE +模拟块级作用域是相当普遍的。比如下面的例子: +// IIFE +(function () { + for (var i = 0; i < count; i++) { + console.log(i); + } +})(); +console.log(i); // 抛出错 + +``` + +### 10.16 私有变量 + + + +## 第11章 期约与异步函数 + +### 11.2 期约promise + +#### 11.2.1 准备 + +##### 11.2.1.1 区别实例对象和函数对象 +1. 实例对象:通过new创建 +```js +function Fn() { + // body... +} +const fn = new Fn();//Fn是构造函数 +//fn 是实例对象 + + +``` +2. 将函数作为对象 +```js +//连接上 +console.log(Fn.prototype) + +``` +()左边是函数 +.的左边是函数对象 + + +##### 11.2.1.2 回调函数 + +1. 同步回调函数 +理解:立即执行,完全止血了才结束,不会放入回调队列中 +```js +let arr=[1,3,5] + +arr.forEach(item = >{ + console.log(item) +}) +console.log("forEach()之后") + +//forEach()括号中的回调函数是同步回调函数,不会放在回调队列,而是立即执行 +``` + +2. 异步回调函数 +理解:不会立即执行,会放入回调队列中 + +```js +setTime(function() {console.log("setTimeout()函数")}) +console.log("setTimeout()之后") +//setTimeout()之后 +//setTimeout()函数 +//setTimeout()是异步回调函数,会放在回调队列中 +``` + +##### 11.2.1.3 js的错误处理err +1. 常见内置错误 +* ReferenceError 引用错误,引用了不存在的变量 + +* TypeError 数据类型不正确错误 类型中没有某个函数或属性 let a; a.xxx(); + +* RangeError 超出范围 无限递归 + +* SyntaxError 语法错误 + +2. 错误处理 +捕获错误:try。。。cathch。。。 +```js +try{ + let a; + console.log(a.xx); +}catch(error){ + console.log(error.message); + console.log(error.statck) +} + +``` +抛出错误:throw error +```js +function something(){ + if (Date.now()%2===1){ + console.log("当前时间为奇数,可以执行任务") + }else{ + throw new Error("当前时间为偶数,无法执行任务") + } +} +try{ + something(); +}catch(error){ + console.log(error.message) +} +``` + +3. 错误对象 +message 错误信息 +stack 函数调用栈记录信息 + +#### 11.2.2 promise的理解和使用 + +##### 11.2.2.1 promise是什么 + +###### 11.2.2.1.1 理解 + +1. 抽象表达:进行异步编程的新的解决方案 +2. 具体表达: +* 语法上:构造函数 +* 功能:封装一个异步操作,并获取其结果 + +###### 11.2.2.1.2 promise的状态改变 +1. pending 变为resolved +2. pending 变为rejected +以上状态不可逆,每个promise只能又一次机会 + +###### 11.2.2.1.3 基本流程 + +promise 进行异步操作,好状态then,坏状态then/ + + +###### 11.2.2.1.4 基本使用 + +```js +// 创建一个新的promise对象 +const promise = new Promise((resolve,reject) =>{// 执行器对象,是一个同步回调 + // 执行异步操作 + const time = Date.now(); + if(time%2===0){ + // 成功嗲用resolve(value) + resolve("成功的值:"+time)//括号内传值 + }else{ + // 失败调用reject(reason) + reject("失败的值:"+time) + } +}) + +promise.then( + value => {//接收得到成功的值value onResolved + console.log("成功的回调:",value) + }, + reason => {//接收失败的值reason onRejected + console.log("失败的回调:",reason) + } + ) + +``` + +##### 11.2.2.2 为什么使用promse + +1. 指定回调函数的方式更加灵活: + 纯回调函数:必须在启动异步人物前指定 + promise:启动起步任务 =》返回promise对象 +〉 给promise对象绑定回调函数 + +2. 支持链式调用,可以解决回调地狱问题 + 回调地狱:回调函数嵌套, + 链式调用:异常传透,多个错误可以卸载一个错误上 + 终极方法:async/await + +##### 11.2.2.3 如何使用promise + +```js +const promise = new Promise(function(resolve,reject){ + setTime(function() { + resolve("成功的数据") + reject("失败的数据")//只能执行一个, + },1000) +}).then( + value => { + console.log("onResolveed()",value) + } +).catch( + reason => { + console.log("onRejected()",reason) + } +) + +``` + +### 11.2.3 自定义promise + + + + +### 11.2.4 async 和 await + + +## 第12章 BOM + +### 12.1 window对象 + +```js +window.innerWidth; +window.innerHeight;//浏览器页面的大小,不包含开发者窗口 + +window.outerWidth; +window.outerHeight;//浏览器窗口大小 + +``` +document.documentElement.clientWidth 和 document.documentElement.clientHeight 返回的布局视口的大小 + + + +## 第14章 DOM + +DOM:文档对象模型 (Document Object Model),是HTML和XML文档的编程接口;DOM 表示由**多层节点**构成的文档,通过它开发者可以添加、删除和修改页面的各个部分。 + +### 14.1 节点层级 + +文档元素:html元素,是文档的最外层元素 + +DOM 中总共有 **12 种**节点类型,这些 类型都继承一种基本类型。 + +#### 14.1.1 Node类型 + +DOM Level 1 描述了名为 Node的接口,这个接口是所有 DOM 节点类型都必须实现的。 + +Node接口 在 JavaScript 中被实现为 Node类型,在除 IE 之外的所有浏览器中都可以**直接访问**这个类型。 + +在 JavaScript 中,**所有节点类型都继承 Node类型**,因此所有类型都共享相同的基本属性和方法。 + +1. nodeName与nodeValue + +在使用这两个属性前,最好先**检测节点类型** + +```js +if (someNode.nodeType == 1){ // 检测节点类型 + value = someNode.nodeName; // 会显示元素的标签名 +} +``` + +对元素 而言,**nodeName始终等于元素的标签名**,而 **nodeValue 则始终为 null**。 + +2. 节点关系 + +每个节点都有一个 **childNodes** 属性,其中包含一个 **NodeList**的实例。(NodeList是类数组,不是Array) + +访问节点的元素 + +```js +let firstChild = someNode.childNodes[0]; +let secondChild = someNode.childNodes.item(1); +let arrayOfNodes = Array.from(someNode.childNodes); //ES6 +``` + +**parentNode** :父元素 + +**previousSibling**:上一个节点 + +**nextSibling** :下一个节点 + +**firstChild**:第一个子节点 + +**lastChild** :最后一个子节点 + +![截屏2021-08-22 上午3.17.45](./截屏2021-08-22 上午3.17.45.png) + +**hasChildNodes()**:判断是否有子节点 + +3. 操纵节点 + +**appendChild()**:在列表末尾添加节点,如果传入的是一个存在的节点,该节点会被移动到对象的子节点尾部,一个节点不会同时存在于文档中 + +**insertBefore()**:插入 + +```js +// 作为最后一个子节点插入 +returnedNode = someNode.insertBefore(newNode, null); +alert(newNode == someNode.lastChild); // true +// 作为新的第一个子节点插入 +returnedNode = someNode.insertBefore(newNode, someNode.firstChild); +alert(returnedNode == newNode); // true +alert(newNode == someNode.firstChild); // true +// 插入最后一个子节点前面 +returnedNode = someNode.insertBefore(newNode, someNode.lastChild); +alert(newNode == someNode.childNodes[someNode.childNodes.length - 2]); // true +``` + +**replaceChild()**:节点替换 + +```js +let returnedNode = someNode.replaceChild(newNode, someNode.firstChild); +``` + +**removeChild()**删除节点 + +```js +// 删除第一个子节点 +let formerFirstChild = someNode.removeChild(someNode.firstChild); // 删除最后一个子节点 +let formerLastChild = someNode.removeChild(someNode.lastChild); +``` + +4. 其他方法 + +**cloneNode()**:复制节点 + +```js +let deepList = myList.cloneNode(true); //深复制,复制节点和子节点数 +alert(deepList.childNodes.length); // 3(IE9之前的版本)或7(其他浏览器) let shallowList = myList.cloneNode(false); 孤儿节点,没有子节点和父节点 +alert(shallowList.childNodes.length); // 0 +``` + +#### 14.1.2 Document类型 + +document 是HTMLDocument的实例(HTMLDocument继承 Document),表示整个 HTML 页面。 + +document是 window 3 对象的属性,因此是一个全局对象。 + +document对象可用于**获取关于页面的信息**以及**操纵其外观和底层结构**。 + +1. 文档子节点 + + **documentElement**:始终指向 HTML 页面中的元素 + +```js +let html = document.documentElement; // 取得对的引用 +alert(html === document.childNodes[0]); // true 11 alert(html === document.firstChild); // true +``` + +**body**:获取body + +```js +let body = document.body; // 取得对的引用 +``` + +**doctype**:标签 + +2. 文档信息 + +**title**:读写页面的标题,修改 title 属性并不会改变元素 + +**URL** :包含当前页面的完整 URL(地 址栏中的 URL),不可修改,修改无效 + +**domain** :包含页面的域名 + +**referrer** :包含链接到当前页面的那个页面的 URL,不可修改,修改无效 + +浏览器对 domain 属性还有一个限制,即这个属性一旦放松就不能再收紧。比如,把document.domain 设置为"wrox.com"之后,就不能再将其设置回"p2p.wrox.com",后者会导致错误,比如: + +```js +// 页面来自p2p.wrox.com +document.domain = "wrox.com"; // 放松,成功 +document.domain = "p2p.wrox.com"; // 收紧,错误! +``` + +3. 定位元素 + +**getElementById()**:找到了返回这个元素,找不到返回null + +**getElementsByTagName("img")**://返回nodeList + +要取得文档中的所有元素,可以给 getElementsByTagName()传入* + +```js +let allElements = document.getElementsByTagName("*"); +``` + +**getElementsByName()**: + +> 通过类名(getElementsByClassName) +> 通过选择器获取一个元素(querySelector) +> 通过选择器获取一组元素(querySelectorAll) + +4. 特殊集合 + +**document.anchors** 包含文档中所有带 name属性的<a>元素。 + +**document.forms**包含文档中所有<form>元素(与 document.getElementsByTagName ("form") 返回的结果相同)。 + +**document.images**包含文档中所有<img>元素(与 document.getElementsByTagName ("img") 7 返回的结果相同)。 + +**document.links** 包含文档中所有带 href属性的<a>元素。 + +5. DOM兼容性检测 + +由于实现不一致,因此 hasFeature()的返回值并不可靠。目前这个方法已经被废弃,不再建议使 用。为了向后兼容,目前主流浏览器仍然支持这个方法,但无论检测什么都一律返回 true。 + +6. 文档写入 + +```js +// 禁用 +最好做下备份 document.original.write = document.write 然后再 document.write = function() {} + +因为不好用,还因为性能 +``` + +在浏览器渲染页面之前,会去根据HTML标签解析DOM树。**如果解析器遇到了 `<script>` 标签,则会停止DOM的解析,优先执行脚本。**如果这个脚本动态插入了另一个脚本,则解析器会等待另一个脚本下载完成到执行完成,延后了页面渲染的时间。 + +#### 14.1.3 Element 类型 + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/0001express创建.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/0001express创建.js new file mode 100644 index 0000000..74942f3 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/0001express创建.js @@ -0,0 +1,9 @@ +const express = require("express") + +let app = express() + +app.use("/",(request,response)=>{ + response.send("hello world!"); +}) + +app.listen(80) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/01.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/01.js new file mode 100644 index 0000000..4b8a261 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/01.js @@ -0,0 +1,21 @@ +// 引入express +const express = require("express"); + +// 创建网站服务器 +const app = express(); + +// 路由 +app.get("/",(req,res)=>{ + res.send("Hello Node For Express"); + // send替代了end + // 1.自动检测响应内容类型 + // 2.自动设置HTTP状态吗 + // 3.自动设置响应类型和编码 +}); + +app.get("/list",(req,res)=>{ + res.send({name:"何小龙",sex:"男"}) +}) + +// 开启服务器监听 +app.listen(80) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/02.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/02.js new file mode 100644 index 0000000..e6109fc --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/02.js @@ -0,0 +1,19 @@ +// 引入express +const express = require("express"); + +// 创建网站服务器 +const app = express(); + +// 路由 +app.get("/",(req,res,next)=>{ + console.log(res) + req.name="何琋"; + next();//没有next()方法,程序匹配到后就会停止,next()会继续 +}); +app.get("/",(req,res)=>{ + res.send(req.name); +}); + + +// 开启服务器监听 +app.listen(80); \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/03.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/03.js new file mode 100644 index 0000000..af358d7 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/03.js @@ -0,0 +1,20 @@ +// 引入express +const express = require("express"); + +// 创建网站服务器 +const app = express(); + +app.use((require,response,next)=>{ + console.log(require.headers["user-agent"]) + console.log(require.headers) + next() +}) + +app.use("/",(require,response,next)=>{ + console.log("进入根目录") + // next() + response.send("这里是根目录") +}) + +// 开启服务器监听 +app.listen(80); \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/04.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/04.js new file mode 100644 index 0000000..78998b3 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/04.js @@ -0,0 +1,26 @@ +// 引入express +const express = require("express"); + +// 创建网站服务器 +const app = express(); + +app.use((req,res,next)=>{ + next() +}) + +app.get("/",(req,res)=>{ + res.send("这里是根目录") +}) + +// app.use() 这里不能使用/,否则会匹配所有,和不写一样 + +// 自定义404 +// 必须写在最后 +app.use((req,res,next)=>{ + res.send("请求页面不存在!") +}) + + +// 开启服务器监听 +app.listen(80); +console.log("服务器已开启") \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/05.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/05.js new file mode 100644 index 0000000..a3dd7de --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/05.js @@ -0,0 +1,28 @@ +// 引入express +const express = require("express"); + +const fs = require("fs") + +// 创建网站服务器 +const app = express(); + +app.get("/index",(req,res)=>{ + throw new Error("为止服务器错误") +}) + +app.get("/",(req,res,next)=>{ + fs.readFile("./05.js",(err,r)=>{ + if (err!=null){ + next(err) + }else { + console.log(r.toString()) + res.send(r.toString()) + } + }) +}) + +app.use((err,req,res,next)=>{ + res.status(500).send("服务器出现错误"+err) +}) +// 开启服务器监听 +app.listen(80); \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/06.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/06.js new file mode 100644 index 0000000..26a5a6f --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/06.js @@ -0,0 +1,24 @@ +// 引入express +const express = require("express"); + +const fs = require("fs") + +// 创建网站服务器 +const app = express(); + +const index = express.Router() +const home = express.Router() + +app.use("/index",index) +app.use("/home",home) + +home.get("/",(req,res)=>{ + res.send("home") +}) +home.get("/hexi",(req,res)=>{ + res.send("home/hexi") +}) + + +// 开启服务器监听 +app.listen(80); \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/07.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/07.js new file mode 100644 index 0000000..5fac501 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/07.js @@ -0,0 +1,10 @@ +const express = require("express") + +const router = require("./router") + +const app = express() + +app.use("/home",router.home) +app.use("/index",router.index) + +app.listen(80) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/08.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/08.js new file mode 100644 index 0000000..748ad96 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/08.js @@ -0,0 +1,9 @@ +const express = require("express") + +const app = express() + +app.get("/",(req,res)=>{ + res.send(req.query) +}) + +app.listen(80) diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/09.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/09.js new file mode 100644 index 0000000..64da70a --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/09.js @@ -0,0 +1,19 @@ +// 引入express +const express = require("express"); +const bodyParser = require("body-parser") +// 获取post数据,必须导入这个包 + +// 创建网站服务器 +const app = express(); + +app.use(bodyParser.urlencoded({extended:false})); +// extended为true时,实用qs格式化,效率更高 + +app.post("/",(req,res)=>{ + console.log(req.body.name) + res.send(req.body) + // req.body获取数据 +}) + +// 开启服务器监听 +app.listen(80) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/10.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/10.js new file mode 100644 index 0000000..9a2aacb --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/10.js @@ -0,0 +1,20 @@ +const express = require("express") + +const app = express() + +app.use(fun()) +// 注意这里直接调用函数,所以直接加括号 + +function fun(){ + return (req,res,next)=>{ + console.log(req.url); + console.log(req.method); + next() + } +} + +app.get("/",(req,res)=>{ + res.send("xsxaxasxasx") +}) + +app.listen(80) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/11.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/11.js new file mode 100644 index 0000000..372a170 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/11.js @@ -0,0 +1,11 @@ +const express = require("express") + +const app = express() + +app.get("/user/:id",(req,res)=>{ + res.send(req.params) +}) +// 动态路由,实用':' +// req.params来获取 + +app.listen(80) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/12.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/12.js new file mode 100644 index 0000000..f88bf8b --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/12.js @@ -0,0 +1,14 @@ +const express = require("express") +const path = require("path") +const app = express() + +app.use(express.static("static")) +console.log(path.join(__dirname,"static")) +// 最好实用console中的地址 +// 嗲用地址不用static + +app.get("/",(req,res)=>{ + res.send("你好") +}) + +app.listen(80) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/13.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/13.js new file mode 100644 index 0000000..b7f2ee2 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/13.js @@ -0,0 +1,22 @@ +// express官方微了art-template模板引擎更好的适用于express,在其基础上封装了press-art-template + +const express = require("express") + +const app = express() + +// 当渲染后缀会art的模板时,实用express-art-template +// 可以使用多种模板引擎 +// 模板后缀,选用的模板引擎 +app.engine("art",require("express-art-template")) + +// 设置模板存放地址 +app.set("views","templates") + +// 设置模板默认后缀 +app.set("view engine","art") + +app.get("/",(req,res)=>{ + res.render("index",{data:"data"}) +}) + +app.listen(80) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/14.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/14.js new file mode 100644 index 0000000..e875eab --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/14.js @@ -0,0 +1,31 @@ +// express官方微了art-template模板引擎更好的适用于express,在其基础上封装了press-art-template + +const express = require("express") + +const app = express() + +app.locals.name={ + name:"何琋", + sex:"男", + age:"22" +} + +// 当渲染后缀会art的模板时,实用express-art-template +// 可以使用多种模板引擎 +// 模板后缀,选用的模板引擎 +app.engine("art",require("express-art-template")) + +// 设置模板存放地址 +app.set("views","templates") + +// 设置模板默认后缀 +app.set("view engine","art") + +app.get("/",(req,res)=>{ + res.render("index",{data:app.locals.name}) +}) +app.get("/pc",(req,res)=>{ + res.render("pc.html",) +}) + +app.listen(80) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/pc.html b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/pc.html new file mode 100644 index 0000000..f28ddf6 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/pc.html @@ -0,0 +1,113 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/post.html b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/post.html new file mode 100644 index 0000000..314421b --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/post.html @@ -0,0 +1,14 @@ + + + + + Title + + +
+ + + +
+ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/router.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/router.js new file mode 100644 index 0000000..c9cf050 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/router.js @@ -0,0 +1,15 @@ +const Router = require("express").Router + +const home = Router() +const index = Router() + +home.get("/",(req,res)=>{ + res.send("home/") +}) + +index.get("/",(req,res)=>{ + res.send("index/") +}) + + +module.exports= {home,index} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/static/1.html b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/static/1.html new file mode 100644 index 0000000..566549b --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/static/1.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/static/a.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/static/a.js new file mode 100644 index 0000000..6e09fc8 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/static/a.js @@ -0,0 +1 @@ +xsxsxs \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/static/a.mp4 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/static/a.mp4 new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/templates/index.art b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/templates/index.art new file mode 100644 index 0000000..0e9d6dd --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code/templates/index.art @@ -0,0 +1 @@ +{{ data }} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code2/01cookie.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code2/01cookie.js new file mode 100644 index 0000000..c048463 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/code2/01cookie.js @@ -0,0 +1,19 @@ +const express = require("express") +// const cookieParser = require("cookie-parser") +// const UUID = require("uuid") +const app = express() + +app.use((req,res,next)=>{ + console.log("我来过"); + next() +}) +// app.use(cookieParser()) + +app.get("/hellow",(req,res)=>{ + // console.log("xs") + // console.log(req.cookie) + // res.cookie("name","何琋") + res.send("req.cookie") +}) + +app.listen(80) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/express.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/express.md new file mode 100644 index 0000000..3fb7722 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/express.md @@ -0,0 +1,289 @@ +# express框架学习 + +> B站 -前段知识分享喵- 《黑马2020最新 Express 教学视频》 + +## 特性 + +1. 简洁的路由定义方式 + +2. 简化了HTTP请求参数 + +3. 模板引擎支持度高,方便渲染 + +4. 中间件,有效控制请求 + +5. 大量第三方中间件插件 + +## 框架入门 + +```js +// 引入express +const express = require("express"); + +// 创建网站服务器 +const app = express(); + +// 路由 +app.get("/",(req,res)=>{ + res.send("Hello Node For Express"); + // send替代了end + // 1.自动检测响应内容类型 + // 2.自动设置HTTP状态吗 + // 3.自动设置响应类型和编码 +}); + +app.get("/list",(req,res)=>{ + res.send({name:"何小龙",sex:"男"}) +}) + +// 开启服务器监听 +app.listen(80) +``` +## 中间件 + +中间件包含**中间件方法**和**中间件处理函数** +中间件由express提供,负责拦截请求,请求函数由开发者提供 +```js +app.get("path",fun) +app.post("path",fun) +``` + +可以出现多个中间件,但是一旦匹配成功就不会再往下进行 + +### app.use + +app.use()中,第一个参数可以不传递路径,对应的是全局,注意需要next() +正常情况下传递路径,和 post,get相同 + +## 自定义404 + +```js +// 引入express +const express = require("express"); + +// 创建网站服务器 +const app = express(); + +app.use((req,res,next)=>{ + next() +}) + +app.get("/",(req,res)=>{ + res.send("这里是根目录") +}) + +// app.use() 这里不能使用/,否则会匹配所有,和不写一样 + +// 自定义404 +// 必须写在最后 +app.use((req,res,next)=>{ + res.send("请求页面不存在!") +}) + + +// 开启服务器监听 +app.listen(80); +console.log("服务器已开启") +``` + +### 错误处理中间件 + +```js +app.get("/",(req,res,next)=>{ + fs.readFile("./05.js",(err,r)=>{ + if (err!=null){ + next(err) + }else { + console.log(r.toString()) + res.send(r.toString()) + } + }) +}) + +app.use((err,req,res,next)=>{ + res.status(500).send("服务器出现错误"+err) +}) +``` + +### 模块化路由 + +```js +const app = express(); + +const index = express.Router() +const home = express.Router() + +app.use("/index",index) +app.use("/home",home) + +home.get("/",(req,res)=>{ + res.send("home") +}) +home.get("/hexi",(req,res)=>{ + res.send("home/hexi") +}) +``` + +### 模块化编程实现 + +```js +// 07.js + +const express = require("express") + +const router = require("./router") + +const app = express() + +app.use("/home",router.home) +app.use("/index",router.index) + +app.listen(80) + + +// router.js + +const Router = require("express").Router + +const home = Router() +const index = Router() + +home.get("/",(req,res)=>{ + res.send("home/") +}) + +index.get("/",(req,res)=>{ + res.send("index/") +}) + + +module.exports= {home,index} +``` + +### 获取get参数 + +```js +const express = require("express") + +const app = express() + +app.get("/",(req,res)=>{ + res.send(req.query) +}) + +app.listen(80) + +``` + +### 获取post参数 + +```js +// 引入express +const express = require("express"); +const bodyParser = require("body-parser") +// 获取post数据,必须导入这个包 + +// 创建网站服务器 +const app = express(); + +app.use(bodyParser.urlencoded({extended:false})); +// extended为true时,实用qs格式化,效率更高 + +app.post("/",(req,res)=>{ + console.log(req.body.name) + res.send(req.body) + // req.body获取数据 +}) + +// 开启服务器监听 +app.listen(80) +``` + +### use方法 + +```js +const express = require("express") + +const app = express() + +app.use(fun()) +// 注意这里直接调用函数,所以直接加括号 + +function fun(){ + return (req,res,next)=>{ + console.log(req.url); + console.log(req.method); + next() + } +} + +app.get("/",(req,res)=>{ + res.send("xsxaxasxasx") +}) + +app.listen(80) +``` + +### 动态路由 + +```js +const express = require("express") + +const app = express() + +app.get("/user/:id",(req,res)=>{ + res.send(req.params) +}) +// 动态路由,实用':' +// req.params来获取 + +app.listen(80) +``` + +### 静态文件 + +```js +const express = require("express") +const path = require("path") +const app = express() + +app.use(express.static("static")) +console.log(path.join(__dirname,"static")) +// 最好实用console中的地址 +// 嗲用地址不用static + +app.get("/",(req,res)=>{ + res.send("你好") +}) + +app.listen(80) +``` + +### 模板文件 + +```js +// express官方微了art-template模板引擎更好的适用于express,在其基础上封装了press-art-template + +const express = require("express") + +const app = express() + +// 当渲染后缀会art的模板时,实用express-art-template +// 可以使用多种模板引擎 +// 模板后缀,选用的模板引擎 +app.engine("art",require("express-art-template")) + +// 设置模板存放地址 +app.set("views","templates") + +// 设置模板默认后缀 +app.set("view engine","art") + +app.get("/",(req,res)=>{ + res.render("index",{data:"data"}) +}) + +app.listen(80) +``` + +### app.locals公共数据 \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/package-lock.json b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/package-lock.json new file mode 100644 index 0000000..9fc2082 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/package-lock.json @@ -0,0 +1,621 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.nlark.com/accepts/download/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.nlark.com/acorn/download/acorn-5.7.4.tgz", + "integrity": "sha1-Po2KmUfQWZoXltECJddDL0pKz14=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/array-flatten/download/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "art-template": { + "version": "4.13.2", + "resolved": "https://registry.nlark.com/art-template/download/art-template-4.13.2.tgz", + "integrity": "sha1-TEy9RN4IqtAxZgJAhx9Fx9c3z8E=", + "requires": { + "acorn": "^5.0.3", + "escodegen": "^1.8.1", + "estraverse": "^4.2.0", + "html-minifier": "^3.4.3", + "is-keyword-js": "^1.0.3", + "js-tokens": "^3.0.1", + "merge-source-map": "^1.0.3", + "source-map": "^0.5.6" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz", + "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/bytes/download/bytes-3.1.0.tgz", + "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/camel-case/download/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.nlark.com/clean-css/download/clean-css-4.2.3.tgz?cache=0&sync_timestamp=1628166368756&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fclean-css%2Fdownload%2Fclean-css-4.2.3.tgz", + "integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.nlark.com/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1624608014898&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.nlark.com/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1627358203890&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz", + "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz", + "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.nlark.com/content-type/download/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.nlark.com/cookie/download/cookie-0.4.0.tgz", + "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" + }, + "cookie-parser": { + "version": "1.4.5", + "resolved": "https://registry.npm.taobao.org/cookie-parser/download/cookie-parser-1.4.5.tgz", + "integrity": "sha1-PlctS3wMgPnGHa9gTkM2gxtdHUk=", + "requires": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.nlark.com/deep-is/download/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/depd/download/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.nlark.com/destroy/download/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/ee-first/download/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/encodeurl/download/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/escape-html/download/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.nlark.com/escodegen/download/escodegen-1.14.3.tgz", + "integrity": "sha1-TnuB+6YVgdyXWC7XjKt/Do1j9QM=", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.nlark.com/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1624608014898&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "optional": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.nlark.com/esprima/download/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=" + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/estraverse/download/estraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.nlark.com/etag/download/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz", + "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "express-art-template": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/express-art-template/download/express-art-template-1.0.1.tgz", + "integrity": "sha1-+96TatzgRizeGR013ZznC0r1d5g=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/finalhandler/download/finalhandler-1.1.2.tgz", + "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.nlark.com/forwarded/download/forwarded-0.2.0.tgz?cache=0&sync_timestamp=1622503451002&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fforwarded%2Fdownload%2Fforwarded-0.2.0.tgz", + "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.nlark.com/fresh/download/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=" + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", + "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.nlark.com/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1624607959970&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz", + "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.nlark.com/ipaddr.js/download/ipaddr.js-1.9.1.tgz", + "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=" + }, + "is-keyword-js": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/is-keyword-js/download/is-keyword-js-1.0.3.tgz", + "integrity": "sha1-rDDc81tnH0snsX9ctXI1EmAhEy0=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.nlark.com/js-tokens/download/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.nlark.com/levn/download/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.nlark.com/lower-case/download/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz", + "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.nlark.com/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1624608014898&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/methods/download/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.nlark.com/mime/download/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.nlark.com/mime-db/download/mime-db-1.49.0.tgz", + "integrity": "sha1-89/eYMmenPO8lwHWh3ePU3ABy+0=" + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.nlark.com/mime-types/download/mime-types-2.1.32.tgz", + "integrity": "sha1-HQDonn3n/gIAjbYQAdngKFJnD9U=", + "requires": { + "mime-db": "1.49.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "requires": { + "lower-case": "^1.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/on-finished/download/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.8.3.tgz", + "integrity": "sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU=", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/param-case/download/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "^2.2.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.nlark.com/parseurl/download/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.nlark.com/path-to-regexp/download/path-to-regexp-0.1.7.tgz?cache=0&sync_timestamp=1624608046390&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/prelude-ls/download/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.nlark.com/proxy-addr/download/proxy-addr-2.0.7.tgz", + "integrity": "sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU=", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz?cache=0&sync_timestamp=1616385248556&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.7.0.tgz", + "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.nlark.com/range-parser/download/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.nlark.com/raw-body/download/raw-body-2.4.0.tgz", + "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.nlark.com/safer-buffer/download/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.nlark.com/send/download/send-0.17.1.tgz", + "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/ms/download/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.nlark.com/serve-static/download/serve-static-1.14.1.tgz", + "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/setprototypeof/download/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.nlark.com/source-map/download/source-map-0.5.7.tgz?cache=0&sync_timestamp=1624608014898&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsource-map%2Fdownload%2Fsource-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.nlark.com/statuses/download/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/toidentifier/download/toidentifier-1.0.0.tgz", + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.nlark.com/type-is/download/type-is-1.6.18.tgz", + "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.nlark.com/uglify-js/download/uglify-js-3.4.10.tgz", + "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=", + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.nlark.com/commander/download/commander-2.19.0.tgz?cache=0&sync_timestamp=1627358203890&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.19.0.tgz", + "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.nlark.com/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1624608014898&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/unpipe/download/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.nlark.com/upper-case/download/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/utils-merge/download/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/vary/download/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.nlark.com/word-wrap/download/word-wrap-1.2.3.tgz", + "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=" + } + } +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/session是什么.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/session是什么.md new file mode 100644 index 0000000..55eb7f7 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/session是什么.md @@ -0,0 +1,85 @@ +# Session是什么 + +Session一般译作会话,牛津词典对其的解释是进行某活动连续的一段时间。从不同的层面看待session,它有着类似但不全然相同的含义。比如,在web应用的用户看来,他打开浏览器访问一个电子商务网站,登录、并完成购物直到关闭浏览器,这是一个会话。而在web应用的开发者开来,用户登录时我需要创建一个数据结构以存储用户的登录信息,这个结构也叫做session。因此在谈论session的时候要注意上下文环境。而本文谈论的是一种基于HTTP协议的用以增强web应用能力的机制或者说一种方案,它不是单指某种特定的动态页面技术,而这种能力就是保持状态,也可以称作保持会话。 + +# 为什么需要session + +谈及session一般是在web应用的背景之下,我们知道web应用是基于HTTP协议的,而HTTP协议恰恰是一种无状态协议。也就是说,用户从A页面跳转到B页面会重新发送一次HTTP请求,而服务端在返回响应的时候是无法获知该用户在请求B页面之前做了什么的。 + +对于HTTP的无状态性的原因,相关RFC里并没有解释,但联系到HTTP的历史以及应用场景,我们可以推测出一些理由: + +1. 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。那个时候没有动态页面技术,只有纯粹的静态HTML页面,因此根本不需要协议能保持状态; +2. 用户在收到响应时,往往要花一些时间来阅读页面,因此如果保持客户端和服务端之间的连接,那么这个连接在大多数的时间里都将是空闲的,这是一种资源的无端浪费。所以HTTP原始的设计是默认短连接,即客户端和服务端完成一次请求和响应之后就断开TCP连接,服务器因此无法预知客户端的下一个动作,它甚至都不知道这个用户会不会再次访问,因此让HTTP协议来维护用户的访问状态也全然没有必要; +3. 将一部分复杂性转嫁到以HTTP协议为基础的技术之上可以使得HTTP在协议这个层面上显得相对简单,而这种简单也赋予了HTTP更强的扩展能力。事实上,session技术从本质上来讲也是对HTTP协议的一种扩展。 +总而言之,HTTP的无状态是由其历史使命而决定的。但随着网络技术的蓬勃发展,人们再也不满足于死板乏味的静态HTML,他们希望web应用能动起来,于是客户端出现了脚本和DOM技术,HTML里增加了表单,而服务端出现了CGI等等动态技术。 + +而正是这种web动态化的需求,给HTTP协议提出了一个难题:一个无状态的协议怎样才能关联两次连续的请求呢?也就是说无状态的协议怎样才能满足有状态的需求呢? + +此时有状态是必然趋势而协议的无状态性也是木已成舟,因此我们需要一些方案来解决这个矛盾,来保持HTTP连接状态,于是出现了cookie和session。 + +对于此部分内容,读者或许会有一些疑问,笔者在此先谈两点: + +1. 无状态性和长连接 +可能有人会问,现在被广泛使用的HTTP1.1默认使用长连接,它还是无状态的吗? +连接方式和有无状态是完全没有关系的两回事。因为状态从某种意义上来讲就是数据,而连接方式只是决定了数据的传输方式,而不能决定数据。长连接是随着计算机性能的提高和网络环境的改善所采取的一种合理的性能上的优化,一般情况下,web服务器会对长连接的数量进行限制,以免资源的过度消耗。 +2. 无状态性和session +Session是有状态的,而HTTP协议是无状态的,二者是否矛盾呢? + +Session和HTTP协议属于不同层面的事物,后者属于ISO七层模型的最高层应用层,前者不属于后者,前者是具体的动态页面技术来实现的,但同时它又是基于后者的。在下文中笔者会分析Servlet/Jsp技术中的session机制,这会使你对此有更深刻的理解。 + +Cookie和Session + +上面提到解决HTTP协议自身无状态的方式有cookie和session。二者都能记录状态,前者是将状态数据保存在客户端,后者则保存在服务端。 + +首先看一下cookie的工作原理,这需要有基本的HTTP协议基础。 + +cookie是在RFC2109(已废弃,被RFC2965取代)里初次被描述的,每个客户端最多保持三百个cookie,每个域名下最多20个Cookie(实际上一般浏览器现在都比这个多,如Firefox是50个),而每个cookie的大小为最多4K,不过不同的浏览器都有各自的实现。对于cookie的使用,最重要的就是要控制cookie的大小,不要放入无用的信息,也不要放入过多信息。 + +无论使用何种服务端技术,只要发送回的HTTP响应中包含如下形式的头,则视为服务器要求设置一个cookie: + +Set-cookie:name=name;expires=date;path=path;domain=domain + +支持cookie的浏览器都会对此作出反应,即创建cookie文件并保存(也可能是内存cookie),用户以后在每次发出请求时,浏览器都要判断当前所有的cookie中有没有没失效(根据expires属性判断)并且匹配了path属性的cookie信息,如果有的话,会以下面的形式加入到请求头中发回服务端: + +Cookie: name="zj"; Path="/linkage" + +服务端的动态脚本会对其进行分析,并做出相应的处理,当然也可以选择直接忽略。 + +这里牵扯到一个规范(或协议)与实现的问题,简单来讲就是规范规定了做成什么样子,那么实现就必须依据规范来做,这样才能互相兼容,但是各个实现所使用的方式却不受约束,也可以在实现了规范的基础上超出规范,这就称之为扩展了。无论哪种浏览器,只要想提供cookie的功能,那就必须依照相应的RFC规范来实现。所以这里服务器只管发Set-cookie头域,这也是HTTP协议无状态性的一种体现。 + +需要注意的是,出于安全性的考虑,cookie可以被浏览器禁用。 + +再看一下session的原理: + +笔者没有找到相关的RFC,因为session本就不是协议层面的事物。它的基本原理是服务端为每一个session维护一份会话信息数据,而客户端和服务端依靠一个全局唯一的标识来访问会话信息数据。用户访问web应用时,服务端程序决定何时创建session,创建session可以概括为三个步骤: + +1. 生成全局唯一标识符(sessionid); +2. 开辟数据存储空间。一般会在内存中创建相应的数据结构,但这种情况下,系统一旦掉电,所有的会话数据就会丢失,如果是电子商务网站,这种事故会造成严重的后果。不过也可以写到文件里甚至存储在数据库中,这样虽然会增加I/O开销,但session可以实现某种程度的持久化,而且更有利于session的共享; +3. 将session的全局唯一标示符发送给客户端。 +问题的关键就在服务端如何发送这个session的唯一标识上。联系到HTTP协议,数据无非可以放到请求行、头域或Body里,基于此,一般来说会有两种常用的方式:cookie和URL重写。 + +1. Cookie +读者应该想到了,对,服务端只要设置Set-cookie头就可以将session的标识符传送到客户端,而客户端此后的每一次请求都会带上这个标识符,由于cookie可以设置失效时间,所以一般包含session信息的cookie会设置失效时间为0,即浏览器进程有效时间。至于浏览器怎么处理这个0,每个浏览器都有自己的方案,但差别都不会太大(一般体现在新建浏览器窗口的时候); +2. URL重写 +所谓URL重写,顾名思义就是重写URL。试想,在返回用户请求的页面之前,将页面内所有的URL后面全部以get参数的方式加上session标识符(或者加在path info部分等等),这样用户在收到响应之后,无论点击哪个链接或提交表单,都会在再带上session的标识符,从而就实现了会话的保持。读者可能会觉得这种做法比较麻烦,确实是这样,但是,如果客户端禁用了cookie的话,URL重写将会是首选。 + 到这里,读者应该明白我前面为什么说session也算作是对HTTP的一种扩展了吧。如下两幅图是笔者在Firefox的Firebug插件中的截图,可以看到,当我第一次访问index.jsp时,响应头里包含了Set-cookie头,而请求头中没有。当我再次刷新页面时,图二显示在响应中不在有Set-cookie头,而在请求头中却有了Cookie头。注意一下Cookie的名字:jsessionid,顾名思义,就是session的标识符,另外可以看到两幅图中的jsessionid的值是相同的,原因笔者就不再多解释了。另外读者可能在一些网站上见过在最后附加了一段形如jsessionid=xxx的URL,这就是采用URL重写来实现的session。 + +(图一,首次请求index.jsp) + + +(图二,再次请求index.jsp) + +Cookie和session由于实现手段不同,因此也各有优缺点和各自的应用场景: + +1. 应用场景 +Cookie的典型应用场景是Remember Me服务,即用户的账户信息通过cookie的形式保存在客户端,当用户再次请求匹配的URL的时候,账户信息会被传送到服务端,交由相应的程序完成自动登录等功能。当然也可以保存一些客户端信息,比如页面布局以及搜索历史等等。 +Session的典型应用场景是用户登录某网站之后,将其登录信息放入session,在以后的每次请求中查询相应的登录信息以确保该用户合法。当然还是有购物车等等经典场景; +2. 安全性 +cookie将信息保存在客户端,如果不进行加密的话,无疑会暴露一些隐私信息,安全性很差,一般情况下敏感信息是经过加密后存储在cookie中,但很容易就会被窃取。而session只会将信息存储在服务端,如果存储在文件或数据库中,也有被窃取的可能,只是可能性比cookie小了太多。 +Session安全性方面比较突出的是存在会话劫持的问题,这是一种安全威胁,这在下文会进行更详细的说明。总体来讲,session的安全性要高于cookie; +3. 性能 +Cookie存储在客户端,消耗的是客户端的I/O和内存,而session存储在服务端,消耗的是服务端的资源。但是session对服务器造成的压力比较集中,而cookie很好地分散了资源消耗,就这点来说,cookie是要优于session的; +4. 时效性 +Cookie可以通过设置有效期使其较长时间内存在于客户端,而session一般只有比较短的有效期(用户主动销毁session或关闭浏览器后引发超时); +5. 其他 +Cookie的处理在开发中没有session方便。而且cookie在客户端是有数量和大小的限制的,而session的大小却只以硬件为限制,能存储的数据无疑大了太多。 \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/文件说明.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/文件说明.md new file mode 100644 index 0000000..a9fbd9c --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/express/文件说明.md @@ -0,0 +1,77 @@ +# 文件说明 + +# node_modules + +> 模块安装路径 + +# package.json + +> 项目说明 + +# code + +> 代码目录 + +## 0001express创建.js + +> 搭建最初始的express + +01.js + +> 框架入门 + +02.js + +> 中间件 + +03.js + +> app.use + +04.js + +> 自定义404 + +05.js + +> 错误处理中间件 + +06.js + +> 模块化路由 + +07.js + +> 模块化路由实现 + +router.js + +> 模块化路由文件 + +08.js + +> 获取get参数 + +09.js + +> 获取post参数 + +10.js + +> use方法 + +11.js + +> 动态路由 + +12.js + +> 静态文件 + +13.js + +> 模板文件 + +14.js + +> app.locals公共数据 \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/app.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/app.js new file mode 100644 index 0000000..1e368fc --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/app.js @@ -0,0 +1,63 @@ +const Koa = require('koa'), + Router = require('koa-router'), + art = require('koa-art-template'), + path = require('path'), + static = require('koa-static'), + bodyParser = require('koa-bodyparser'); +const routers = require('./routers/routers') + + +const app = new Koa();// 创建koa应用 +const router = new Router(); // 创建路由,支持传递参数 +art(app, { + root: path.join(__dirname, 'templates'), + extname: '.html', + debug: process.env.NODE_ENV !== 'production', + cache:false, + minimize: true +});// 将art模板导入到koa项目中 +app.use(static(`${__dirname}/static`));// 设置静态文件读取目录,可以设置多个 +app.use(bodyParser());// 设置使用bodyParser接受POST数据 +app.use(async (ctx,next)=>{ + await next(); + // console.log(ctx.status); + if(parseInt(ctx.status)===404){ + ctx.body=404; + } + // ctx.response.redirect('/about');//重定向 +});// 定制404页面 + + +router.use('/',routers.routes()); + + +/* + +router.get('/', async (ctx) => { + await ctx.render('input'); + console.log(ctx.request) + // console.log(ctx.request.url); + // // console.log(ctx.request); + // console.log(ctx.request.query.name);// 获取get参数,获取不到是undefined + // console.log(ctx.request.querystring);// 将get参数转化为字符串格式 + // console.log(ctx.params);// 获取动态路由 +}) +router.post("/123", async (ctx)=>{ + ctx.body=ctx.request.body; + console.log(ctx.request.body) +}) +*/ + + +// 调用router.routes()来组装匹配好的路由,返回一个合并好的中间件 +// 调用router.allowedMethods()获得一个中间件,当发送了不符合的请求时,会返回 `405 Method Not Allowed` 或 `501 Not Implemented` +app.use(router.routes()); +app.use(router.allowedMethods({ + // throw: true, // 抛出错误,代替设置响应头状态 + // notImplemented: () => '不支持当前请求所需要的功能', + // methodNotAllowed: () => '不支持的请求方式' +})); +// 这俩要放在最后 +app.listen(9999,()=>{ + console.log("服务器已经启动:http://localhost:80") +}) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/app.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/app.js new file mode 100644 index 0000000..7eadcd5 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/app.js @@ -0,0 +1,40 @@ +var app = require('koa')() + , logger = require('koa-logger') + , json = require('koa-json') + , views = require('koa-views') + , onerror = require('koa-onerror'); + +var index = require('./routes/index'); +var users = require('./routes/users'); + +// error handler +onerror(app); + +// global middlewares +app.use(views('views', { + root: __dirname + '/views', + default: 'jade' +})); +app.use(require('koa-bodyparser')()); +app.use(json()); +app.use(logger()); + +app.use(function *(next){ + var start = new Date; + yield next; + var ms = new Date - start; + console.log('%s %s - %s', this.method, this.url, ms); +}); + +app.use(require('koa-static')(__dirname + '/public')); + +// routes definition +app.use(index.routes(), index.allowedMethods()); +app.use(users.routes(), users.allowedMethods()); + +// error-handling +app.on('error', (err, ctx) => { + console.error('server error', err, ctx) +}); + +module.exports = app; diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/bin/www b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/bin/www new file mode 100644 index 0000000..48ef91e --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('demo:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT || '3000'); +// app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app.callback()); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/package-lock.json b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/package-lock.json new file mode 100644 index 0000000..a3d4ef6 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/package-lock.json @@ -0,0 +1,7178 @@ +{ + "name": "demo", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "0.1.0", + "dependencies": { + "co": "^4.6.0", + "debug": "^2.6.3", + "jade": "~1.11.0", + "koa": "^1.4.0", + "koa-bodyparser": "^2.5.0", + "koa-json": "^1.1.3", + "koa-logger": "^1.3.1", + "koa-onerror": "^1.3.1", + "koa-router": "^5.4.0", + "koa-static": "^1.5.2", + "koa-views": "^3.1.0" + }, + "devDependencies": { + "nodemon": "^1.8.1" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "dependencies": { + "acorn": "^2.1.0" + } + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "dependencies": { + "string-width": "^2.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", + "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + }, + "node_modules/boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "dependencies": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/character-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", + "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=" + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "dependencies": { + "commander": "2.8.x", + "source-map": "0.4.x" + }, + "bin": { + "cleancss": "bin/cleancss" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css/node_modules/commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/cliui/node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/co-body": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-5.2.0.tgz", + "integrity": "sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==", + "dependencies": { + "inflation": "^2.0.0", + "qs": "^6.4.0", + "raw-body": "^2.2.0", + "type-is": "^1.6.14" + } + }, + "node_modules/co-render": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/co-render/-/co-render-0.2.0.tgz", + "integrity": "sha1-1YpOPKH2fqoZElDMiQpCDO4jdC8=", + "dependencies": { + "consolidate": "^0.13.0", + "debug": "2" + } + }, + "node_modules/co-views": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/co-views/-/co-views-0.3.0.tgz", + "integrity": "sha1-AcH7b6jqlxmpnhEJ6+HHxmSVjnA=", + "dependencies": { + "co-render": "0", + "debug": "2", + "utils-merge": "1" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/commander": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", + "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=", + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/composition": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/composition/-/composition-2.3.0.tgz", + "integrity": "sha1-dCgFN0yrVQxSCjNmL1pzLgII1vI=", + "dependencies": { + "any-promise": "^1.1.0", + "co": "^4.0.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "dev": true, + "dependencies": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/consolidate": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.13.1.tgz", + "integrity": "sha1-npUDVo60hQiJ2m7YeoUsjdLRP2Q=", + "dependencies": { + "bluebird": "^2.9.26" + } + }, + "node_modules/constantinople": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", + "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", + "deprecated": "Please update to at least constantinople 3.1.1", + "dependencies": { + "acorn": "^2.1.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/css": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", + "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", + "dependencies": { + "css-parse": "1.0.4", + "css-stringify": "1.0.5" + } + }, + "node_modules/css-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", + "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=" + }, + "node_modules/css-stringify": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", + "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/error-inject": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz", + "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=" + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "dependencies": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/humanize-number": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/humanize-number/-/humanize-number-0.0.2.tgz", + "integrity": "sha1-EcCvakcWQ2M1iFiASPF5lUFInBg=" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jade": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", + "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", + "deprecated": "Jade has been renamed to pug, please install the latest version of pug instead of jade", + "dependencies": { + "character-parser": "1.2.1", + "clean-css": "^3.1.9", + "commander": "~2.6.0", + "constantinople": "~3.0.1", + "jstransformer": "0.0.2", + "mkdirp": "~0.5.0", + "transformers": "2.1.0", + "uglify-js": "^2.4.19", + "void-elements": "~2.0.1", + "with": "~4.0.0" + }, + "bin": { + "jade": "bin/jade.js" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/jstransformer": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", + "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^6.0.1" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/koa": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-1.7.0.tgz", + "integrity": "sha512-bgKsbYjJac0E8O6ya+m6KosXXUigJ15N4XFCnCA0P/kNViu9OnMLv5WcnEeQ5q1SeuKqlqcf0WiroZQBiPHp8Q==", + "dependencies": { + "accepts": "^1.2.2", + "co": "^4.4.0", + "composition": "^2.1.1", + "content-disposition": "~0.5.0", + "content-type": "^1.0.0", + "cookies": "~0.8.0", + "debug": "^2.6.9", + "delegates": "^1.0.0", + "destroy": "^1.0.3", + "error-inject": "~1.0.0", + "escape-html": "~1.0.1", + "fresh": "^0.5.2", + "http-assert": "^1.1.0", + "http-errors": "^1.2.8", + "koa-compose": "^2.3.0", + "koa-is-json": "^1.0.0", + "mime-types": "^2.0.7", + "on-finished": "^2.1.0", + "only": "0.0.2", + "parseurl": "^1.3.0", + "statuses": "^1.2.0", + "type-is": "^1.5.5", + "vary": "^1.0.0" + }, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/koa-bodyparser": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-2.5.0.tgz", + "integrity": "sha1-PrckP0eZii53LbBfbcTg9PPMvfA=", + "dependencies": { + "co-body": "^5.1.0", + "copy-to": "^2.0.1" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/koa-compose": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-2.5.1.tgz", + "integrity": "sha1-cmz7F2lN5cufvwPArfFyMD+D8VY=" + }, + "node_modules/koa-is-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", + "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" + }, + "node_modules/koa-json": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/koa-json/-/koa-json-1.1.3.tgz", + "integrity": "sha1-WeM2P0IfYe9YatcspJ/OmoVITSY=", + "dependencies": { + "koa-is-json": "1", + "streaming-json-stringify": "3" + } + }, + "node_modules/koa-logger": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/koa-logger/-/koa-logger-1.3.1.tgz", + "integrity": "sha1-rT9fIZOzM0Mo8+uZphj0sEvui9U=", + "dependencies": { + "bytes": "1", + "chalk": "^1.1.3", + "humanize-number": "0.0.2", + "passthrough-counter": "^1.0.0" + } + }, + "node_modules/koa-onerror": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/koa-onerror/-/koa-onerror-1.3.1.tgz", + "integrity": "sha1-pbVh4ch+8yieQwF0bgE4LyT/viI=", + "dependencies": { + "copy-to": "~2.0.1", + "swig": "~1.4.2" + } + }, + "node_modules/koa-router": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-5.4.2.tgz", + "integrity": "sha1-Tb26fnFZU9VobAO3w/29IUYx+HA=", + "dependencies": { + "co": "^4.6.0", + "debug": "^2.2.0", + "http-errors": "^1.3.1", + "methods": "^1.0.1", + "path-to-regexp": "^1.1.1" + }, + "engines": { + "node": "> 0.12" + } + }, + "node_modules/koa-send": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-2.0.3.tgz", + "integrity": "sha512-fX69m+IqgXT4ZgBMsGVsMMB5tLYs9Sa1MhQLyau0n5Qetq5003aaFoCY/YpPL4M+WA7fpJfFk6aEArNzGP0Q3w==", + "dependencies": { + "debug": "^3.2.5", + "mz": "^2.0.0", + "resolve-path": "^1.2.1" + } + }, + "node_modules/koa-send/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/koa-send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/koa-static": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-1.5.3.tgz", + "integrity": "sha512-FmfSFJOrtWGZ/Ae5Q7xeM+ck1IdofNEvIQhdPLvGHyTjilhYmFGoyRN1+BAbTknWnDoRRyHsGGq0FMRDTcCb1w==", + "dependencies": { + "debug": "^3.2.5", + "koa-send": "~2.0.1" + } + }, + "node_modules/koa-static/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/koa-static/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/koa-views": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/koa-views/-/koa-views-3.1.0.tgz", + "integrity": "sha1-Ov67Qi2d/Row7/68Wi2GYbeU9kI=", + "dependencies": { + "co-views": "^0.3.0", + "debug": "^2.1.3", + "koa-send": "^1.3.1", + "object-assign": "^2.0.0" + } + }, + "node_modules/koa-views/node_modules/koa-send": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-1.3.2.tgz", + "integrity": "sha512-3p4FrvqwxbuJdVnsxIH3HtYcaj/FlxVqrQ66t7hrWkxCnD3ulcOksjq290JJFYtN5Gwn0dqKChn9dMDZ27WVpw==", + "dependencies": { + "debug": "^2.6.9", + "mz": "^1.0.1" + } + }, + "node_modules/koa-views/node_modules/mz": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-1.3.0.tgz", + "integrity": "sha1-BvCT/dmVagbTfhsegTROJ0eMQvA=", + "dependencies": { + "native-or-bluebird": "1", + "thenify": "3", + "thenify-all": "1" + } + }, + "node_modules/latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "dependencies": { + "package-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dependencies": { + "mime-db": "1.49.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/mz/node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/native-or-bluebird": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/native-or-bluebird/-/native-or-bluebird-1.2.0.tgz", + "integrity": "sha1-OcR7/Xgl0fuf+tMiEK4l2q3xAck=", + "deprecated": "'native-or-bluebird' is deprecated. Please use 'any-promise' instead." + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", + "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "chokidar": "^2.1.8", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dependencies": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "node_modules/optimist/node_modules/minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "dependencies": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/passthrough-counter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passthrough-counter/-/passthrough-counter-1.0.0.tgz", + "integrity": "sha1-GWfZ5m2lcrXAI8eH2xEqOHqxZvo=" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", + "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", + "dependencies": { + "asap": "~1.0.0" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body/node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", + "dependencies": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/resolve-path/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/resolve-path/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/resolve-path/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/resolve-path/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "dependencies": { + "semver": "^5.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streaming-json-stringify": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/streaming-json-stringify/-/streaming-json-stringify-3.1.0.tgz", + "integrity": "sha1-gCAEN6mTzDnE/gAmO3s7kDrIevU=", + "dependencies": { + "json-stringify-safe": "5", + "readable-stream": "2" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/swig": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/swig/-/swig-1.4.2.tgz", + "integrity": "sha1-QIXKBFM2kQS11IPihBs5t64aq6U=", + "deprecated": "This package is no longer maintained", + "dependencies": { + "optimist": "~0.6", + "uglify-js": "~2.4" + }, + "bin": { + "swig": "bin/swig.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/swig/node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/swig/node_modules/source-map": { + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", + "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/swig/node_modules/uglify-js": { + "version": "2.4.24", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", + "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", + "dependencies": { + "async": "~0.2.6", + "source-map": "0.1.34", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.5.4" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/swig/node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/swig/node_modules/yargs": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", + "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", + "dependencies": { + "camelcase": "^1.0.2", + "decamelize": "^1.0.0", + "window-size": "0.1.0", + "wordwrap": "0.0.2" + } + }, + "node_modules/term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "dependencies": { + "execa": "^0.7.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/transformers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", + "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", + "deprecated": "Deprecated, use jstransformer", + "dependencies": { + "css": "~1.0.8", + "promise": "~2.0", + "uglify-js": "~2.2.5" + } + }, + "node_modules/transformers/node_modules/is-promise": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", + "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" + }, + "node_modules/transformers/node_modules/optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "dependencies": { + "wordwrap": "~0.0.2" + } + }, + "node_modules/transformers/node_modules/promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", + "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", + "dependencies": { + "is-promise": "~1" + } + }, + "node_modules/transformers/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/transformers/node_modules/uglify-js": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", + "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", + "dependencies": { + "optimist": "~0.3.5", + "source-map": "~0.1.7" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dependencies": { + "source-map": "~0.5.1", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + }, + "optionalDependencies": { + "uglify-to-browserify": "~1.0.0" + } + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + }, + "node_modules/undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dev": true, + "dependencies": { + "debug": "^2.2.0" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "dependencies": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "dependencies": { + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/with": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", + "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", + "dependencies": { + "acorn": "^1.0.1", + "acorn-globals": "^1.0.3" + } + }, + "node_modules/with/node_modules/acorn": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", + "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "node_modules/yargs/node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "engines": { + "node": ">=0.10.0" + } + } + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "requires": { + "acorn": "^2.1.0" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", + "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "character-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", + "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "requires": { + "commander": "2.8.x", + "source-map": "0.4.x" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "co-body": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-5.2.0.tgz", + "integrity": "sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==", + "requires": { + "inflation": "^2.0.0", + "qs": "^6.4.0", + "raw-body": "^2.2.0", + "type-is": "^1.6.14" + } + }, + "co-render": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/co-render/-/co-render-0.2.0.tgz", + "integrity": "sha1-1YpOPKH2fqoZElDMiQpCDO4jdC8=", + "requires": { + "consolidate": "^0.13.0", + "debug": "2" + } + }, + "co-views": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/co-views/-/co-views-0.3.0.tgz", + "integrity": "sha1-AcH7b6jqlxmpnhEJ6+HHxmSVjnA=", + "requires": { + "co-render": "0", + "debug": "2", + "utils-merge": "1" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", + "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "composition": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/composition/-/composition-2.3.0.tgz", + "integrity": "sha1-dCgFN0yrVQxSCjNmL1pzLgII1vI=", + "requires": { + "any-promise": "^1.1.0", + "co": "^4.0.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "dev": true, + "requires": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "consolidate": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.13.1.tgz", + "integrity": "sha1-npUDVo60hQiJ2m7YeoUsjdLRP2Q=", + "requires": { + "bluebird": "^2.9.26" + } + }, + "constantinople": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", + "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", + "requires": { + "acorn": "^2.1.0" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "css": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", + "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", + "requires": { + "css-parse": "1.0.4", + "css-stringify": "1.0.5" + } + }, + "css-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", + "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=" + }, + "css-stringify": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", + "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "error-inject": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz", + "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "requires": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + } + }, + "http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + } + } + }, + "humanize-number": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/humanize-number/-/humanize-number-0.0.2.tgz", + "integrity": "sha1-EcCvakcWQ2M1iFiASPF5lUFInBg=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jade": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", + "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", + "requires": { + "character-parser": "1.2.1", + "clean-css": "^3.1.9", + "commander": "~2.6.0", + "constantinople": "~3.0.1", + "jstransformer": "0.0.2", + "mkdirp": "~0.5.0", + "transformers": "2.1.0", + "uglify-js": "^2.4.19", + "void-elements": "~2.0.1", + "with": "~4.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jstransformer": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", + "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", + "requires": { + "is-promise": "^2.0.0", + "promise": "^6.0.1" + } + }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "koa": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-1.7.0.tgz", + "integrity": "sha512-bgKsbYjJac0E8O6ya+m6KosXXUigJ15N4XFCnCA0P/kNViu9OnMLv5WcnEeQ5q1SeuKqlqcf0WiroZQBiPHp8Q==", + "requires": { + "accepts": "^1.2.2", + "co": "^4.4.0", + "composition": "^2.1.1", + "content-disposition": "~0.5.0", + "content-type": "^1.0.0", + "cookies": "~0.8.0", + "debug": "^2.6.9", + "delegates": "^1.0.0", + "destroy": "^1.0.3", + "error-inject": "~1.0.0", + "escape-html": "~1.0.1", + "fresh": "^0.5.2", + "http-assert": "^1.1.0", + "http-errors": "^1.2.8", + "koa-compose": "^2.3.0", + "koa-is-json": "^1.0.0", + "mime-types": "^2.0.7", + "on-finished": "^2.1.0", + "only": "0.0.2", + "parseurl": "^1.3.0", + "statuses": "^1.2.0", + "type-is": "^1.5.5", + "vary": "^1.0.0" + } + }, + "koa-bodyparser": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-2.5.0.tgz", + "integrity": "sha1-PrckP0eZii53LbBfbcTg9PPMvfA=", + "requires": { + "co-body": "^5.1.0", + "copy-to": "^2.0.1" + } + }, + "koa-compose": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-2.5.1.tgz", + "integrity": "sha1-cmz7F2lN5cufvwPArfFyMD+D8VY=" + }, + "koa-is-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", + "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" + }, + "koa-json": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/koa-json/-/koa-json-1.1.3.tgz", + "integrity": "sha1-WeM2P0IfYe9YatcspJ/OmoVITSY=", + "requires": { + "koa-is-json": "1", + "streaming-json-stringify": "3" + } + }, + "koa-logger": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/koa-logger/-/koa-logger-1.3.1.tgz", + "integrity": "sha1-rT9fIZOzM0Mo8+uZphj0sEvui9U=", + "requires": { + "bytes": "1", + "chalk": "^1.1.3", + "humanize-number": "0.0.2", + "passthrough-counter": "^1.0.0" + } + }, + "koa-onerror": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/koa-onerror/-/koa-onerror-1.3.1.tgz", + "integrity": "sha1-pbVh4ch+8yieQwF0bgE4LyT/viI=", + "requires": { + "copy-to": "~2.0.1", + "swig": "~1.4.2" + } + }, + "koa-router": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-5.4.2.tgz", + "integrity": "sha1-Tb26fnFZU9VobAO3w/29IUYx+HA=", + "requires": { + "co": "^4.6.0", + "debug": "^2.2.0", + "http-errors": "^1.3.1", + "methods": "^1.0.1", + "path-to-regexp": "^1.1.1" + } + }, + "koa-send": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-2.0.3.tgz", + "integrity": "sha512-fX69m+IqgXT4ZgBMsGVsMMB5tLYs9Sa1MhQLyau0n5Qetq5003aaFoCY/YpPL4M+WA7fpJfFk6aEArNzGP0Q3w==", + "requires": { + "debug": "^3.2.5", + "mz": "^2.0.0", + "resolve-path": "^1.2.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "koa-static": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-1.5.3.tgz", + "integrity": "sha512-FmfSFJOrtWGZ/Ae5Q7xeM+ck1IdofNEvIQhdPLvGHyTjilhYmFGoyRN1+BAbTknWnDoRRyHsGGq0FMRDTcCb1w==", + "requires": { + "debug": "^3.2.5", + "koa-send": "~2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "koa-views": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/koa-views/-/koa-views-3.1.0.tgz", + "integrity": "sha1-Ov67Qi2d/Row7/68Wi2GYbeU9kI=", + "requires": { + "co-views": "^0.3.0", + "debug": "^2.1.3", + "koa-send": "^1.3.1", + "object-assign": "^2.0.0" + }, + "dependencies": { + "koa-send": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-1.3.2.tgz", + "integrity": "sha512-3p4FrvqwxbuJdVnsxIH3HtYcaj/FlxVqrQ66t7hrWkxCnD3ulcOksjq290JJFYtN5Gwn0dqKChn9dMDZ27WVpw==", + "requires": { + "debug": "^2.6.9", + "mz": "^1.0.1" + } + }, + "mz": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-1.3.0.tgz", + "integrity": "sha1-BvCT/dmVagbTfhsegTROJ0eMQvA=", + "requires": { + "native-or-bluebird": "1", + "thenify": "3", + "thenify-all": "1" + } + } + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "requires": { + "mime-db": "1.49.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + } + } + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "native-or-bluebird": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/native-or-bluebird/-/native-or-bluebird-1.2.0.tgz", + "integrity": "sha1-OcR7/Xgl0fuf+tMiEK4l2q3xAck=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "nodemon": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", + "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", + "dev": true, + "requires": { + "chokidar": "^2.1.8", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + } + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "passthrough-counter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passthrough-counter/-/passthrough-counter-1.0.0.tgz", + "integrity": "sha1-GWfZ5m2lcrXAI8eH2xEqOHqxZvo=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", + "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", + "requires": { + "asap": "~1.0.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", + "requires": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "streaming-json-stringify": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/streaming-json-stringify/-/streaming-json-stringify-3.1.0.tgz", + "integrity": "sha1-gCAEN6mTzDnE/gAmO3s7kDrIevU=", + "requires": { + "json-stringify-safe": "5", + "readable-stream": "2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "swig": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/swig/-/swig-1.4.2.tgz", + "integrity": "sha1-QIXKBFM2kQS11IPihBs5t64aq6U=", + "requires": { + "optimist": "~0.6", + "uglify-js": "~2.4" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "source-map": { + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", + "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "uglify-js": { + "version": "2.4.24", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", + "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", + "requires": { + "async": "~0.2.6", + "source-map": "0.1.34", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.5.4" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "yargs": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", + "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", + "requires": { + "camelcase": "^1.0.2", + "decamelize": "^1.0.0", + "window-size": "0.1.0", + "wordwrap": "0.0.2" + } + } + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "transformers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", + "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", + "requires": { + "css": "~1.0.8", + "promise": "~2.0", + "uglify-js": "~2.2.5" + }, + "dependencies": { + "is-promise": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", + "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" + }, + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "requires": { + "wordwrap": "~0.0.2" + } + }, + "promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", + "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", + "requires": { + "is-promise": "~1" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "uglify-js": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", + "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", + "requires": { + "optimist": "~0.3.5", + "source-map": "~0.1.7" + } + } + } + }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + }, + "undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dev": true, + "requires": { + "debug": "^2.2.0" + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "with": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", + "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", + "requires": { + "acorn": "^1.0.1", + "acorn-globals": "^1.0.3" + }, + "dependencies": { + "acorn": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", + "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" + } + } + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + } + } + } + } +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/package.json b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/package.json new file mode 100644 index 0000000..d3e4c0a --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/package.json @@ -0,0 +1,27 @@ +{ + "name": "demo", + "version": "0.1.0", + "private": true, + "scripts": { + "start": "node bin/www", + "dev": "./node_modules/.bin/nodemon bin/www", + "prd": "pm2 start bin/www", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "co": "^4.6.0", + "debug": "^2.6.3", + "jade": "~1.11.0", + "koa": "^1.4.0", + "koa-bodyparser": "^2.5.0", + "koa-json": "^1.1.3", + "koa-logger": "^1.3.1", + "koa-onerror": "^1.3.1", + "koa-router": "^5.4.0", + "koa-static": "^1.5.2", + "koa-views": "^3.1.0" + }, + "devDependencies": { + "nodemon": "^1.8.1" + } +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/public/stylesheets/style.css b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/public/stylesheets/style.css new file mode 100644 index 0000000..9453385 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/public/stylesheets/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/routes/index.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/routes/index.js new file mode 100644 index 0000000..bc3be3a --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/routes/index.js @@ -0,0 +1,15 @@ +var router = require('koa-router')(); + +router.get('/', function *(next) { + yield this.render('index', { + title: 'Hello World Koa!' + }); +}); + +router.get('/foo', function *(next) { + yield this.render('index', { + title: 'Hello World foo!' + }); +}); + +module.exports = router; diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/routes/users.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/routes/users.js new file mode 100644 index 0000000..bfea3d3 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/routes/users.js @@ -0,0 +1,13 @@ +var router = require('koa-router')(); + +router.prefix('/users'); + +router.get('/', function *(next) { + this.body = 'this is a users response!'; +}); + +router.get('/bar', function *(next) { + this.body = 'this is a users/bar response!'; +}); + +module.exports = router; diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/views/error.jade b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/views/error.jade new file mode 100644 index 0000000..51ec12c --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/views/error.jade @@ -0,0 +1,6 @@ +extends layout + +block content + h1= message + h2= error.status + pre #{error.stack} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/views/index.jade b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/views/index.jade new file mode 100644 index 0000000..3d63b9a --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/views/index.jade @@ -0,0 +1,5 @@ +extends layout + +block content + h1= title + p Welcome to #{title} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/views/layout.jade b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/views/layout.jade new file mode 100644 index 0000000..15af079 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/demo/views/layout.jade @@ -0,0 +1,7 @@ +doctype html +html + head + title= title + link(rel='stylesheet', href='/stylesheets/style.css') + body + block content diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/ostest.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/ostest.js new file mode 100644 index 0000000..71171a8 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/ostest.js @@ -0,0 +1,78 @@ +//开启严格模式 +'use strict'; + +const os = require('os'); + +function deviceInfo() { + if (!os) { + return null; + } + + const info = { + platform: '', + hostname: '', + cpu: '', + mac: '' + }; + +//操作系统平台 + const pf = os.platform(); + + switch (pf) { + case 'darwin': + info.platform = 'macOS' + break; + case 'win32': + info.platform = 'Windows' + break; + default: + break; + } + + //主机名 + info.hostname = os.hostname(); + + //cpu + const cpus = os.cpus(); + if (cpus.length) { + info.cpu = cpus[0].model; + } + + //网卡 + const netmap = os.networkInterfaces(); + const conf = ['en0', 'WLAN', '以太网']; + + // console.log(netmap); + + for (let index = 0; index < conf.length; index++) { + const key = conf[index]; + const item = netmap[key]; + if (item) { + info.mac = item[0].mac + // console.log('mac:'+ mac); + break; + } + } + + return info; +} +console.log(deviceInfo()) +console.log(os.cpus()) +console.log(os.arch()) +console.log(os.endianness) +// console.log(os.getFreeMem()) +console.log(os.getPriority()) +console.log(os.loadavg()) +console.log(os.networkInterfaces()) +console.log(os.loadavg()) +console.log(os.getOSRelease) +console.log(os.tmpdir()) +console.log(os.getTotalMem) +console.log(os.getOSType) +console.log(os.getUptime) +console.log(os.getOSVersion) +console.log(os.constants) +//module.exports 暴露接口的方法 +module.exports = { + deviceInfo: deviceInfo +}; \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/package-lock.json b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/package-lock.json new file mode 100644 index 0000000..4b58130 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/package-lock.json @@ -0,0 +1,3936 @@ +{ + "name": "koa", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "koa", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "art-template": "^4.13.2", + "koa": "^2.13.1", + "koa-art-template": "^1.1.1", + "koa-bodyparser": "^4.3.0", + "koa-router": "^10.1.1", + "koa-static": "^5.0.0", + "nodemon": "^2.0.12" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dependencies": { + "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/art-template": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/art-template/-/art-template-4.13.2.tgz", + "integrity": "sha512-04ws5k+ndA5DghfheY4c8F1304XJKeTcaXqZCLpxFkNMSkaR3ChW1pX2i9d3sEEOZuLy7de8lFriRaik1jEeOQ==", + "dependencies": { + "acorn": "^5.0.3", + "escodegen": "^1.8.1", + "estraverse": "^4.2.0", + "html-minifier": "^3.4.3", + "is-keyword-js": "^1.0.3", + "js-tokens": "^3.0.1", + "merge-source-map": "^1.0.3", + "source-map": "^0.5.6" + }, + "engines": { + "node": ">= 1.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "dependencies": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-keyword-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-keyword-js/-/is-keyword-js-1.0.3.tgz", + "integrity": "sha1-rDDc81tnH0snsX9ctXI1EmAhEy0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/koa": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", + "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "~3.1.0", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^1.2.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-art-template": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/koa-art-template/-/koa-art-template-1.1.1.tgz", + "integrity": "sha512-Dgt+D4nU3p8/7ykwCCdnpKUq/rrJUVkoYKUoTHoApCL4G1Qku1xwuNXMYfHjHHk/RnqS+CwxMuNdBlDOyXM3tQ==", + "dependencies": { + "debug": "^2.6.1" + }, + "engines": { + "node": ">= 7.6.0" + }, + "peerDependencies": { + "art-template": ">=4.11.0" + } + }, + "node_modules/koa-art-template/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/koa-art-template/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/koa-bodyparser": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", + "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", + "dependencies": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + }, + "node_modules/koa-convert": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", + "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^3.0.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/koa-convert/node_modules/koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "dependencies": { + "any-promise": "^1.1.0" + } + }, + "node_modules/koa-router": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-10.1.1.tgz", + "integrity": "sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ==", + "dependencies": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "koa-compose": "^4.1.0", + "methods": "^1.1.2", + "path-to-regexp": "^6.1.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/koa-router/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/koa-router/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "dependencies": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/koa-send/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/koa-send/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "dependencies": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + }, + "engines": { + "node": ">= 7.6.0" + } + }, + "node_modules/koa/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/koa/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dependencies": { + "mime-db": "1.49.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/nodemon": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz", + "integrity": "sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==", + "hasInstallScript": true, + "dependencies": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.3", + "update-notifier": "^4.1.0" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", + "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body/node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", + "dependencies": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/resolve-path/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/resolve-path/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/resolve-path/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/resolve-path/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dependencies": { + "debug": "^2.2.0" + } + }, + "node_modules/undefsafe/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/undefsafe/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ylru": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", + "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==", + "engines": { + "node": ">= 4.0.0" + } + } + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "art-template": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/art-template/-/art-template-4.13.2.tgz", + "integrity": "sha512-04ws5k+ndA5DghfheY4c8F1304XJKeTcaXqZCLpxFkNMSkaR3ChW1pX2i9d3sEEOZuLy7de8lFriRaik1jEeOQ==", + "requires": { + "acorn": "^5.0.3", + "escodegen": "^1.8.1", + "estraverse": "^4.2.0", + "html-minifier": "^3.4.3", + "is-keyword-js": "^1.0.3", + "js-tokens": "^3.0.1", + "merge-source-map": "^1.0.3", + "source-map": "^0.5.6" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "requires": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "requires": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + } + }, + "copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "requires": { + "ini": "1.3.7" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "requires": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-keyword-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-keyword-js/-/is-keyword-js-1.0.3.tgz", + "integrity": "sha1-rDDc81tnH0snsX9ctXI1EmAhEy0=" + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "koa": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", + "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", + "requires": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "~3.1.0", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^1.2.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "koa-art-template": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/koa-art-template/-/koa-art-template-1.1.1.tgz", + "integrity": "sha512-Dgt+D4nU3p8/7ykwCCdnpKUq/rrJUVkoYKUoTHoApCL4G1Qku1xwuNXMYfHjHHk/RnqS+CwxMuNdBlDOyXM3tQ==", + "requires": { + "debug": "^2.6.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "koa-bodyparser": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", + "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", + "requires": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + } + }, + "koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + }, + "koa-convert": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", + "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "requires": { + "co": "^4.6.0", + "koa-compose": "^3.0.0" + }, + "dependencies": { + "koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "requires": { + "any-promise": "^1.1.0" + } + } + } + }, + "koa-router": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-10.1.1.tgz", + "integrity": "sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ==", + "requires": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "koa-compose": "^4.1.0", + "methods": "^1.1.2", + "path-to-regexp": "^6.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "requires": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "requires": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "requires": { + "mime-db": "1.49.0" + } + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, + "nodemon": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz", + "integrity": "sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==", + "requires": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.3", + "update-notifier": "^4.1.0" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "^2.2.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-to-regexp": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", + "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", + "requires": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "requires": { + "nopt": "~1.0.10" + } + }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, + "ylru": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", + "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==" + } + } +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/package.json b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/package.json new file mode 100644 index 0000000..c5849b7 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/package.json @@ -0,0 +1,22 @@ +{ + "name": "koa", + "version": "1.0.0", + "description": "", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "nodemon app.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "art-template": "^4.13.2", + "koa": "^2.13.1", + "koa-art-template": "^1.1.1", + "koa-bodyparser": "^4.3.0", + "koa-router": "^10.1.1", + "koa-static": "^5.0.0", + "nodemon": "^2.0.12" + } +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/readme.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/readme.md new file mode 100644 index 0000000..7cf3209 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/readme.md @@ -0,0 +1,80 @@ +# koa模板V0.1 + +## 安装的包 + +1. koa 核心包 +2. art-templates +3. koa-art-templates 模版视图渲染中间件 + +## 使用方法 + +### 1 art + +* options + +```js +// 模板名 +filename: null, + +// 模板语法规则列表 +rules: [nativeRule, artRule], + +// 是否开启对模板输出语句自动编码功能。为 false 则关闭编码输出功能 +// escape 可以防范 XSS 攻击 +escape: true, + +// 启动模板引擎调试模式。如果为 true: {cache:false, minimize:false, compileDebug:true} +debug: detectNode ? process.env.NODE_ENV !== 'production' : false, + +// bail 如果为 true,编译错误与运行时错误都会抛出异常 +bail: true, + +// 是否开启缓存 +cache: true, + +// 是否开启压缩。它会运行 htmlMinifier,将页面 HTML、CSS、CSS 进行压缩输出 +// 如果模板包含没有闭合的 HTML 标签,请不要打开 minimize,否则可能被 htmlMinifier 修复或过滤 +minimize: true, + +// 是否编译调试版 +compileDebug: false, + +// 模板路径转换器 +resolveFilename: resolveFilename, + +// 子模板编译适配器 +include: include, + +// HTML 压缩器。仅在 NodeJS 环境下有效 +htmlMinifier: htmlMinifier, + +// HTML 压缩器配置。参见 https://github.com/kangax/html-minifier +htmlMinifierOptions: { + collapseWhitespace: true, + minifyCSS: true, + minifyJS: true, + // 运行时自动合并:rules.map(rule => rule.test) + ignoreCustomFragments: [] +}, + +// 错误事件。仅在 bail 为 false 时生效 +onerror: onerror, + +// 模板文件加载器 +loader: loader, + +// 缓存中心适配器(依赖 filename 字段) +caches: caches, + +// 模板根目录。如果 filename 字段不是本地路径,则在 root 查找模板 +root: '/', + +// 默认后缀名。如果没有后缀名,则会自动添加 extname +extname: '.art', + +// 忽略的变量。被模板编译器忽略的模板变量列表 +ignore: [], + +// 导入的模板变量 +imports: runtime +``` \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/routers/main/get.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/routers/main/get.js new file mode 100644 index 0000000..07e14fe --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/routers/main/get.js @@ -0,0 +1,8 @@ +const Router = require('koa-router'); + +let router = new Router(); +router.get('/',async(ctx)=>{ + ctx.body="首页"; +}) + +module.exports=router; \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/routers/routers.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/routers/routers.js new file mode 100644 index 0000000..3074179 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/routers/routers.js @@ -0,0 +1,11 @@ +const Router = require('koa-router'); +const router = new Router(); + +// 路由列表 +const main = require('./main/get') + + +router.use('/',main.routes()); +// router.use('/admin',admin.routes()); + +module.exports=router; \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/static/css/default.css b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/static/css/default.css new file mode 100644 index 0000000..d5958a2 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/static/css/default.css @@ -0,0 +1,52 @@ +/*css 初始化 */ +html, body, ul, li, ol, dl, dd, dt, p, h1, h2, h3, h4, h5, h6, +form, fieldset, legend, img { margin:0; padding:0; } +fieldset, img,input,button { border:none; padding:0;margin:0;outline-style:none; } +ul, ol { list-style:none; } +input { padding-top:0; padding-bottom:0; font-family: "SimSun","宋体";} +select, input { vertical-align:middle; } +select, input, textarea { font-size:12px; margin:0; } +textarea { resize:none; } +img {border:0; vertical-align:middle;} +table { border-collapse:collapse; } +body { + font:12px/150% Arial,Verdana,"\5b8b\4f53"; + color:#666; + background:#fff +} +.clearfix:before,.clearfix:after{ + content:""; + display:table; +} +.clearfix:after{clear:both;} +.clearfix{ + *zoom:1;/*IE/7/6*/ +} +a{color:#666; text-decoration:none; } +a:hover{color:#C81623;} +h1,h2,h3,h4,h5,h6{text-decoration:none;font-weight:normal;} +s,i,em{font-style:normal;text-decoration:none;} +.col-red{color: #C81623!important;} + +/*公共类*/ +.w{ + width: 1210px;margin:0 auto; +} +.fl { + float:left +} +.fr { + float:right +} +.al { + text-align:left +} +.ac { + text-align:center +} +.ar { + text-align:right +} +.hide { + display:none +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/templates/input.html b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/templates/input.html new file mode 100644 index 0000000..957d88e --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/templates/input.html @@ -0,0 +1,13 @@ + + + + + post + + +
+ + +
+ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/templates/user.html b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/templates/user.html new file mode 100644 index 0000000..087495b --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/templates/user.html @@ -0,0 +1,10 @@ + + + + + 使用模板 + + +

Hello World!

+ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/test.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/test.js new file mode 100644 index 0000000..b139416 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/koa/test.js @@ -0,0 +1,13 @@ +var Koa = require('koa'); +var bodyParser = require('koa-bodyparser'); + +var app = new Koa(); +app.use(bodyParser()); + +app.use(async ctx => { + // the parsed body will store in ctx.request.body + // if nothing was parsed, body will be an empty object {} + ctx.body = ctx.request.body; +}); + +app.listen(80) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/learn-http/package.json b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/learn-http/package.json new file mode 100644 index 0000000..38509fc --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/learn-http/package.json @@ -0,0 +1,12 @@ +{ + "name": "learn-http", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/learn-http/server.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/learn-http/server.js new file mode 100644 index 0000000..23fa5fe --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/learn-http/server.js @@ -0,0 +1,9 @@ +const net = require("net"); + +const server = net.createServer() + +server.connection(client=>{ + console.log("E") +}) + +server.listen(80) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/learn-http/web.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/learn-http/web.js new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/nodejs20210812.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/nodejs20210812.md new file mode 100644 index 0000000..a5a4a68 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/nodejs20210812.md @@ -0,0 +1,296 @@ +# nodejs + +> 尚硅谷 超哥 + +```js +console.log(arguments)//打印回调函数中的参数 +``` + +进程和线程 + +​ 进程 + +​ 负责为程序运行提供必备的环境 + +​ 相当于工厂中的车间 + +​ 线程 + +​ 计算机中的最小单位,负责执行进程中的任务 + +​ 工厂中的工人 + + + +# nodejs简介 + +* 跨平台,运行于服务器的js运行环境 +* V8引擎,事件驱动,非阻塞,异步IO模型 +* 单线程,可用分布式拓展 +* 开源 + +## 使用Node + +```bash +node file.js +``` + +es-checker:查看es支持度,可以全局安装 + +## 一 基础 + +### 1.1 模块 + +缺陷: + +* 没有模块系统 + +* 标准库较少 + +* 没有标准接口 + +* 缺乏管理系统 + +**node.js不能使用import** + +nodejs的模块实在一个函数中,不是全局作用域 +```js +//单个 +//模块文件 +//testModule.js + +function a() { + // body... +} +module.exports=a; + +//引入文件 +//main.js +let testModule=require('./testModel');//可以不用加后缀,但是前面的./必须 +testModule(); + +// 多个1 +//模块文件 +//testModule.js +var func1 = function() { + console.log("func1"); +}; +var func2 = function() { + console.log("func2"); +}; +exports.function1 = func1; +exports.function2 = func2; + +//引入文件 +//main.js +let testModule=require('./testModel');//可以不用加后缀,但是前面的./必须 +testModule.function1(); +testModule.function2(); + +// 多个2 +//模块文件 +//testModule.js +let a=function() { + console.log("a"); +} +let b=function() { + console.log("b"); +} +module.exports={ + a, + b +} + +let testModule=require('./testModel') +testModule.a(); +testModule.b() +``` + +## 基本内置模块 +### os模块 +//模块都需要导入包 +let os=require("os"); +```js +let os=require('os'); +hostname();//主机名 +type();//系统名 +platform();//编译时系统名 +arch();//系统架构 +release();//发行版本 +uptime();//操作系统运行时间,单位为秒 +loadavg();//返回一个1,5,15分钟平均负载的数组 +totalmem();//返回系统总内存 +freemem();//空闲内存 +cpus();//数组,每个cpu信息 +networkInterfaces();//获取网络接口列表 + +``` +### url模块 +```js +let url=require("url") + +console.log("将url字符串转化为url对象"); +url.parse(); +console.log("将url对象转化为url字符串"); +url.format(urlObj); +console.log("组合变数,构造url字符串"); +url.resolve(fron,to); + +``` + +### Query String模块 + +### util模块 + + + +全局对象 + +**global** + +包 + +package + +-package.json 描述文件(必须) + +-bin 可执行二进制文件 + +-lib js文件 + +-doc 文档 + +-test 单元测试 + +不能写注释 + + + +npm命令 + +- npm -v 查看npm版本 +- npm version 查看所有模块版本 +- npm search 包名 搜索包 +- npm install/i 包名 安装包 +- npm remove/r 包名 删除包 或者uninstall +- npm install --save/-S 安装包并添加到依赖 +- npm install 下载当前项目所有依赖 +- npm install -g 安装到全局(一般都是工具) +- +- npm list 查看已经按照的包 + +初始化项目 npm init + + + +npm国内镜像 + +npm i cnpm -g + +导包本级找不到,会向上继续找,一直到根目录,如果找不到,报错 + + + +## Buffer(缓冲区) + +​ -Buffer 的结构和数组很像,操作方式也很像 + +原生数组,性能比较差 + +原生数组存不了2进制文件 + +核心对象,不用导入 + +存储的是2进制,显示为16进制 + +``` +let str= "Hello World!"; +let buf = Buffer.form(str); +console.log(buf);//存储的是二进制 +``` + +`let a = Buffer.alloc(x)`创建定长Buffer + +`let b = Buffer.allocUnsafe(x)创建不初始化的空间的Buffer,但是含有敏感数据,但是效率高,因为省略了初始化控件的步骤` + +buffer创建后大小不可更改,否则会出现内存错误,因为buffer在内存上操作 + +给buffer中元素操作,不能超过256,否则会溢出 + +.toString将Buffer转化为字符串 + +存到缓冲区`Buffer.from(str)` + +### 文件系统fs + +```js +const fs = require("fs"); +``` + +同步文件操作和一部文件操作 + +同步会阻塞程序运行,必须等待文件行为完成 + +异步是等操作完成时通过回调函数返回内容 + +* 文件写入(同步) 出现一场会完蛋 + +```js +//打开文件 +fs.openSync(path,flags[,mode]) + - path文件路径 + - flags操作类型 + r只读 + w写入 + -mode(可选),设置文件操作权限,一般不写 + //该方法会返回一个文件对象(文件描述符) + //let fd =fs.openSync("hellow.txt","w") + +//写入文件 + fs.writeSync(fd(文件描述符),string[,position(写入起始位置)[,encoding]]) + position起始位置 + encoding写入编码,默认utf-8 + //fs.writeSync(fd,"Hello World!"); +//保存关闭文件 + fs.closeSync(fd); +``` + +* 文件写入(异步) + +```js +//打开文件 +fs.open(path[, flags[, mode]], callback),结果是回调函数 + path | | + flags | 请参阅对文件系统 flags 的支持。 默认值: 'r'。 + mode | 默认值: 0o666 (可读可写) + callback + err + fd + //fs.open("filename","w",(err,fd)=>{}) + +//写入文件 + fs.write(fd, buffer[, offset[, length[, position]]], callback)//在回调函数中执行 + +//关闭文件 + fs.close(fd[, callback]) + +``` + +* 简单文件写入 + +``` +fs.writeFile(fs.writeFile(file, data[, options], callback)) +fs.writeFileSync(file, data[, options]) +``` + +* 流文件写入(更好印度贵大文件和性能解决方案) + +```js +let fd = fs.createWriteStream(path[,option]) +fd.once("open",()=>{console.log("监听打开事件,因为只会生效一次,所以")}) +fd.wirte(Str) +fd.close()//不能使用这个,否则会瞬间关闭,后面的写入会失效 +fd.end();//这个可以正常关闭 +``` + +* 读取性质的参考api diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/webDownload/express+MongoDB+file.stream+download.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/webDownload/express+MongoDB+file.stream+download.js new file mode 100644 index 0000000..8016c67 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/webDownload/express+MongoDB+file.stream+download.js @@ -0,0 +1,18 @@ +const express = require("express"); + +// const gfs = require("gfs") + +const app = express(); + +app.get("/download",(req,res)=>{ + gfs.getGridFile('./atom-macs.zip', function(err, file){ + res.header('Content-Type', file.contentType); + res.header('Content-Disposition', 'attachment; filename='+file.filename); + return file.stream(true).pipe(res); + }); +}) + +app.set('port', 80); +app.set('host','192.168.31.74'); + +app.listen("80") \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/webDownload/express+download.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/webDownload/express+download.js new file mode 100644 index 0000000..7981eae --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/webDownload/express+download.js @@ -0,0 +1,14 @@ +const express = require("express"); + +const app = express(); + +app.get("/download",(req,res)=>{ + // console.log(res)res + res.download('./atom-macs.zip')//下载命令 另一种可以通过使用iframe的src来操作,后面还可以修改文件名称 + // res.send("xs") +}) + +app.set('port', 80); +app.set('host','192.168.31.74'); + +app.listen("80") \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/webDownload/package-lock.json b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/webDownload/package-lock.json new file mode 100644 index 0000000..b4bbd94 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/webDownload/package-lock.json @@ -0,0 +1,855 @@ +{ + "name": "webDownload", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "express": "^4.17.1" + } + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dependencies": { + "mime-db": "1.49.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + } + }, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "requires": { + "mime-db": "1.49.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + } + } +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/webDownload/package.json b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/webDownload/package.json new file mode 100644 index 0000000..1949d75 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/Node/webDownload/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "express": "^4.17.1" + } +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/尚学堂.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/尚学堂.md new file mode 100644 index 0000000..e300538 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/尚学堂.md @@ -0,0 +1,448 @@ +# JavaScript + +## 运算符、数据类型和流程循环语句 + +switch case 采用的是=== + +default 没有选中的case + + + +## String + +字符串补全:str.padStart(length,"x") + +Str.padEnd(length,"x") + +## 函数与对象 + +### (1) 函数的声明 + +* 驼峰命名法 + + 大驼峰:首字母大写 + + 小驼峰:首字母小写 + +```js +function funName(参数){ + +} +``` + +当一个函数声明多次,后面的会覆盖 + +函数名的提升:所有的函数都会被提升带代码头部 + +不能再条件语句中声明函数 + +### (2)函数的属性和方法 + +内部属性 + +```js +function getName(){}; +getName.name//这里会显示函数的名字 +``` + +当这样子声明时,不能直接通过函数名调用 + +```  +let a = function as(){} +a();//正确 +as();//报错 +``` + +### (3) 函数的作用域 + +全局作用域 + +局部作用域 + +### (4) 函数的参数 + +函数的参数可以省略,也可以多,缺少的undefined + +查看函数有几个参数fun.length + +数值,字符串,布尔值不会再函数中改变,这个原始类型,引用类型才会改变 + + + +读取参数 + +arguments,只有在函数内部才能出现 + +### (5) 其他 + +自调用 + +```js +(function a(){console.log("xsxsxsxs")}()) +(function a(){console.log("xsxsxsxs")}() +``` + +Eval()将字符串当作语句执行 + +```js +eval(console.log("Hello World!"));//Hello World! +``` + +### (6) 闭包 + +函数嵌套,内部函数调用外部参数 + +函数变量一直在内存当中(一般函数执行完,变量会被回收,有必报的话,变量会一直存在于内存中) + +### (7) 对象 + +```js +let a={ + q:"sx", + "xsx":"xs" +} +a.q; +a["xsx"];//不能使用a."xsx"; + + +Object.keys(a);//返回key数组 +delete obj.p // true删除对象属性 +``` + + + +## 标准库 Math和Date + +### (1)Math + +Math是 JavaScript 的**原生对象**,提供各种数学功能。**该对象不是构造函数**,不能生成实例,所有的属性和方法都必须在Math对象上调用。 + +#### 静态属性 + +Math对象的静态属性,提供以下一些数学常数。 + +> Math.E:常数e。 +> Math.LN2:2 的自然对数。 +> Math.LN10:10 的自然对数。 +> Math.LOG2E:以 2 为底的e的对数。 +> Math.LOG10E:以 10 为底的e的对数。 +> Math.PI:常数 Pi。 +> Math.SQRT1_2:0.5 的平方根。 +> Math.SQRT2:2 的平方根。 + +```js +Math.E // 2.718281828459045 +Math.LN2 // 0.6931471805599453 +Math.LN10 // 2.302585092994046 +Math.LOG2E // 1.4426950408889634 +Math.LOG10E // 0.4342944819032518 +Math.PI // 3.141592653589793 +Math.SQRT1_2 // 0.7071067811865476 +Math.SQRT2 // 1.4142135623730951 +``` + +这些属性都是只读的,不能修改。 + +#### 静态方法 + +Math对象提供以下一些静态方法。 + +> Math.abs():绝对值 +> Math.ceil():向上取整 +> Math.floor():向下取整 +> Math.max():最大值 +> Math.min():最小值 Math.max方法返回参数之中最大的那个值,Math.min返回最小的那个值。如果参数为空, Math.min返回Infinity, Math.max返回-Infinity。 +> Math.pow():指数运算 Math.pow方法返回以第一个参数为底数、第二个参数为幂的指数值。 +> Math.sqrt():平方根 +> Math.log():自然对数 +> Math.exp():e的指数 +> Math.round():四舍五入 +> Math.random():随机数 返回0到1之间的一个伪随机数,可能等于0,但是一定小于1。 + +#### 三角函数方法 + +Math对象还提供一系列三角函数方法。 + +> Math.sin():返回参数的正弦(参数为弧度值) +> Math.cos():返回参数的余弦(参数为弧度值) +> Math.tan():返回参数的正切(参数为弧度值) +> Math.asin():返回参数的反正弦(返回值为弧度值) +> Math.acos():返回参数的反余弦(返回值为弧度值) +> Math.atan():返回参数的反正切(返回值为弧度值) + +### (2) Date + +#### 普通函数的用法 + +Date对象可以作为普通函数直接调用,返回一个代表当前时间的字符串。 + +```js +Date() +// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)" +``` + +注意,即使带有参数,Date作为普通函数使用时,返回的还是当前时间。 + +```js +Date(2000, 1, 1) +// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)" +``` + +上面代码说明,无论有没有参数,直接调用Date总是返回当前时间。 + + + +#### 构造函数的用法 + +Date还可以当作构造函数使用。对它使用new命令,会返回一个Date对象的实例。如果不加参数,实例代表的就是当前时间。 + +```js +var today = new Date(); +``` + +Date实例有一个独特的地方。其他对象求值的时候,都是默认调用.valueOf()方法,但是Date实例求值的时候,默认调用的是toString()方法。这导致对Date实例求值,返回的是一个字符串,代表该实例对应的时间。 + +```js +var today = new Date(); + +today +// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)" + +// 等同于 +today.toString() +// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)" +``` + +作为构造函数时,Date对象可以接受多种格式的参数,返回一个该参数对应的时间实例。 + +```js +// 参数为时间零点开始计算的毫秒数 +new Date(1378218728000) +// Tue Sep 03 2013 22:32:08 GMT+0800 (CST) + +// 参数为日期字符串 +new Date('January 6, 2013'); +// Sun Jan 06 2013 00:00:00 GMT+0800 (CST) + +// 参数为多个整数, +// 代表年、月、日、小时、分钟、秒、毫秒 +new Date(2013, 0, 1, 0, 0, 0, 0) +// Tue Jan 01 2013 00:00:00 GMT+0800 (CST) +``` + +关于Date构造函数的参数,有几点说明。 + +第一点,参数可以是负整数,代表1970年元旦之前的时间。 + +```js +new Date(-1378218728000) +// Fri Apr 30 1926 17:27:52 GMT+0800 (CST) +``` + +第二点,只要是能被Date.parse()方法解析的字符串,都可以当作参数。 + +```js +new Date('2013-2-15') +new Date('2013/2/15') +new Date('02/15/2013') +new Date('2013-FEB-15') +new Date('FEB, 15, 2013') +new Date('FEB 15, 2013') +new Date('Feberuary, 15, 2013') +new Date('Feberuary 15, 2013') +new Date('15 Feb 2013') +new Date('15, Feberuary, 2013') +// Fri Feb 15 2013 00:00:00 GMT+0800 (CST) +``` + +上面多种日期字符串的写法,返回的都是同一个时间。 + +第三,参数为年、月、日等多个整数时,年和月是不能省略的,其他参数都可以省略的。也就是说,这时至少需要两个参数,因为如果只使用“年”这一个参数,Date会将其解释为毫秒数。 + +```js +new Date(2013) +// Thu Jan 01 1970 08:00:02 GMT+0800 (CST) +``` + +上面代码中,2013被解释为毫秒数,而不是年份。 + +```js +new Date(2013, 0) +// Tue Jan 01 2013 00:00:00 GMT+0800 (CST) +new Date(2013, 0, 1) +// Tue Jan 01 2013 00:00:00 GMT+0800 (CST) +new Date(2013, 0, 1, 0) +// Tue Jan 01 2013 00:00:00 GMT+0800 (CST) +new Date(2013, 0, 1, 0, 0, 0, 0) +// Tue Jan 01 2013 00:00:00 GMT+0800 (CST) +``` + +上面代码中,不管有几个参数,返回的都是2013年1月1日零点。 + +最后,各个参数的取值范围如下。 + +> 年:使用四位数年份,比如2000。如果写成两位数或个位数,则加上1900,即10代表1910年。如果是负数,表示公元前。 +> 月:0表示一月,依次类推,11表示12月。 +> 日:1到31。 +> 小时:0到23。 +> 分钟:0到59。 +> 秒:0到59 +> 毫秒:0到999。 + +注意,月份从0开始计算,但是,天数从1开始计算。另外,除了日期的默认值为1,小时、分钟、秒钟和毫秒的默认值都是0。 + +这些参数如果超出了正常范围,会被自动折算。比如,如果月设为15,就折算为下一年的4月。 + +```js +new Date(2013, 15) +// Tue Apr 01 2014 00:00:00 GMT+0800 (CST) +new Date(2013, 0, 0) +// Mon Dec 31 2012 00:00:00 GMT+0800 (CST) +``` + +上面代码的第二个例子,日期设为0,就代表上个月的最后一天。 + +参数还可以使用负数,表示扣去的时间。 + +```js +new Date(2013, -1) +// Sat Dec 01 2012 00:00:00 GMT+0800 (CST) +new Date(2013, 0, -1) +// Sun Dec 30 2012 00:00:00 GMT+0800 (CST) +``` + +#### 日期的运算 + +类型自动转换时,Date实例如果转为数值,则等于对应的毫秒数;如果转为字符串,则等于对应的日期字符串。所以,两个日期实例对象进行减法运算时,返回的是它们间隔的毫秒数;进行加法运算时,返回的是两个字符串连接而成的新字符串。 + +```js +var d1 = new Date(2000, 2, 1); +var d2 = new Date(2000, 3, 1); + +d2 - d1 +// 2678400000 +d2 + d1 +// "Sat Apr 01 2000 00:00:00 GMT+0800 (CST)Wed Mar 01 2000 00:00:00 GMT+0800 (CST)" +``` + +#### 静态方法 + +##### Date.now() + +Date.now方法返回当前时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数,相当于 Unix 时间戳乘以1000。 + +```js +Date.now() // 1364026285194 +``` + +##### Date.parse() + +Date.parse方法用来解析日期字符串,返回该时间距离时间零点(1970年1月1日 00:00:00)的毫秒数。 + +日期字符串应该符合 RFC 2822 和 ISO 8061 这两个标准,即YYYY-MM-DDTHH:mm:ss.sssZ格式,其中最后的Z表示时区。但是,其他格式也可以被解析,请看下面的例子。 + +```js +Date.parse('Aug 9, 1995') +Date.parse('January 26, 2011 13:51:50') +Date.parse('Mon, 25 Dec 1995 13:30:00 GMT') +Date.parse('Mon, 25 Dec 1995 13:30:00 +0430') +Date.parse('2011-10-10') +Date.parse('2011-10-10T14:48:00') +``` + +上面的日期字符串都可以解析。 + +如果解析失败,返回NaN。 + +```js +Date.parse('xxx') // NaN +``` + +#### 实例方法 + +Date的实例对象,有几十个自己的方法,除了valueOf和toString,可以分为以下三类。 + +> to类:从Date对象返回一个字符串,表示指定的时间。 +> get类:获取Date对象的日期和时间。 +> set类:设置Date对象的日期和时间。 + +##### Date.prototype.valueOf() + +valueOf方法返回实例对象距离时间零点(1970年1月1日00:00:00 UTC)对应的毫秒数,该方法等同于getTime方法。 + +```js +var d = new Date(); + +d.valueOf() // 1362790014817 +d.getTime() // 1362790014817 +``` + +预期为数值的场合,Date实例会自动调用该方法,所以可以用下面的方法计算时间的间隔。 + +```js +var start = new Date(); +// ... +var end = new Date(); +var elapsed = end - start; +``` + +##### get 类方法 + +Date对象提供了一系列get*方法,用来获取实例对象某个方面的值。 + +> getTime():返回实例距离1970年1月1日00:00:00的毫秒数,等同于valueOf方法。 +> getDate():返回实例对象对应每个月的几号(从1开始)。 +> getDay():返回星期几,星期日为0,星期一为1,以此类推。 +> getYear():返回距离1900的年数。 +> getFullYear():返回四位的年份。 +> getMonth():返回月份(0表示1月,11表示12月)。 +> getHours():返回小时(0-23)。 +> getMilliseconds():返回毫秒(0-999)。 +> getMinutes():返回分钟(0-59)。 +> getSeconds():返回秒(0-59)。 +> getTimezoneOffset():返回当前时间与 UTC 的时区差异,以分钟表示,返回结果考虑到了夏令时因素。 + +所有这些get*方法返回的都是整数,不同方法返回值的范围不一样。 + +> 分钟和秒:0 到 59 小时:0 到 23 星期:0(星期天)到 6(星期六) 日期:1 到 31 月份:0(一月)到 11(十二月) 年份:距离1900年的年数 + +```js +var d = new Date('January 6, 2013'); + +d.getDate() // 6 +d.getMonth() // 0 +d.getYear() // 113 +d.getFullYear() // 2013 +``` + +下面是一个例子,计算本年度还剩下多少天。 + +```js +function leftDays() { + var today = new Date(); + var endYear = new Date(today.getFullYear(), 11, 31, 23, 59, 59, 999); + var msPerDay = 24 * 60 * 60 * 1000; + return Math.round((endYear.getTime() - today.getTime()) / msPerDay); +} +``` + +##### set 类方法 + +Date对象提供了一系列set*方法,用来设置实例对象的各个方面。 + +> setDate(date):设置实例对象对应的每个月的几号(1-31),返回改变后毫秒时间戳。 +> setYear(year): 设置距离1900年的年数。 +> setFullYear(year [, month, date]):设置四位年份。 +> setHours(hour [, min, sec, ms]):设置小时(0-23)。 +> setMilliseconds():设置毫秒(0-999)。 +> setMinutes(min [, sec, ms]):设置分钟(0-59)。 +> setMonth(month [, date]):设置月份(0-11)。 +> setSeconds(sec [, ms]):设置秒(0-59)。 +> setTime(milliseconds):设置毫秒时间戳。 + +这些方法基本是跟get*方法一一对应的,但是没有setDay方法,因为星期几是计算出来的,而不是设置的。另外,需要注意的是,凡是涉及到设置月份,都是从0开始算的,即0是1月,11是12月。 + + + +## DOM + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/截屏2021-08-22 上午3.17.45.png b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/截屏2021-08-22 上午3.17.45.png new file mode 100644 index 0000000..a0a89fe Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/截屏2021-08-22 上午3.17.45.png differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/测试/S个人探索/0.0.01for循环是同步进行吗.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/测试/S个人探索/0.0.01for循环是同步进行吗.js new file mode 100644 index 0000000..9d78663 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/测试/S个人探索/0.0.01for循环是同步进行吗.js @@ -0,0 +1,9 @@ +console.log("start") + +for(let i = 0;i<10;i++){ + console.log(i) +} + +console.log("结束",end=" ") + +// for是同步的 \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/测试/S个人探索/0.0.02这是轮询吗.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/测试/S个人探索/0.0.02这是轮询吗.js new file mode 100644 index 0000000..29a200e --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/测试/S个人探索/0.0.02这是轮询吗.js @@ -0,0 +1,13 @@ +let i = 0; + +let s = setInterval(function (){ + if(i==100){ + console.log("轮询结束") + clearInterval(s); + } + console.log(i) + i++ + // if(i%5==0){ + + // } +},5) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/测试/S个人探索/0.0.03递归.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/测试/S个人探索/0.0.03递归.js new file mode 100644 index 0000000..cbdade5 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/测试/S个人探索/0.0.03递归.js @@ -0,0 +1,11 @@ +let i=120; + +function s(sn){ + if(sn==0){ + return 1 + }else{ + return sn*s(sn-1) + } +} + +console.log(s(i)) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/测试/闭包/0.0.01闭包.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/测试/闭包/0.0.01闭包.js new file mode 100644 index 0000000..ba9bf22 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/JS/测试/闭包/0.0.01闭包.js @@ -0,0 +1,19 @@ +// 让函数中声明的变量常驻内存 + +function fun(){ + let i=99; + add=function () { + i+=1; + } + return ()=>{console.log(i)} +} + +let sss=fun() + +sss() + +add() + +sss() + +console.log((sss.length)) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/TypeScript.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/TypeScript.md new file mode 100644 index 0000000..d148d37 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/TypeScript.md @@ -0,0 +1,714 @@ +## 基础数据类型 + +Number, String, Undefined, Null, Boolean + +- 数字支持进制 + + 0b - 二进制 + 0o - 八进制 + 0x - 十六进制 + +- Undefined和Null + + 这两个值可以赋予任何类型 + +## 引用数据类型 + +### 数组 + +```ts +let arr: Number[] = [1, 2, 3]; + +let arr2: [] = [];// 空数组,不能再存值 + +// 泛型 +let arr3: Array = [10, 20, 99] +``` + +### 对象 + +```ts +let obj: Object = {};// 除了Number,String,Boolean +obj = null; +obj = undefined; +obj = []; +obj = new String(); +obj = String +``` + +## Any 任意类型 + +- 用于不明确传递的值,如后台返回的数据 + +```ts +let a: Any = null; +a = 32; +a = [1, 2, 3]; +a = 'Hello' + +let newArr: any[] = [1, 'a', true] +``` + +## Void 空值 + +- 没有任何返回值的函数 + +```ts +function fun() :Void{ + return undefined;// Undefined也算是空值 +} +``` + +## 类型推断 + +- 没有明确制定类型时做的一个推断 + +```ts +let a = 32; +a = true;// 这里会报错,上面a已经被定义为了Number类型 + +let b; // 没有赋值 +b = 32; +b = true; +// b为Any类型 +``` + +## 联合类型 + +```ts +let a: Boolean | Number | String = true;// 后面还可以再跟多种类型 + +/* +** 只能访问这些类型的共有方法 +*/ + +a.split('');// 会报错 +a.otString();// 不会报错 +a = 123; // 这里不会报错 +a = false;// 不会报错 +a = '32';// 不报错 +a.split('');// 这里因为赋值了所以不会报错 +``` + +## 接口——对象类型 + +- 对对象的约束,描述对象的形状 +- 定义接口名称开头使用大写的`I` +- 非可选属性不能多也不能少 + +```ts +interface Iperson = { + name: String;// 分号和逗号都可以 + age: Number; +} + +let xiaoming = { + name: '小明', + age: 18 +} +``` + +### 可选属性 + +```ts +interface IPerson{ + name: String; + age: Number; + sex?: String;// sex可以没有 + // 不能有其他的属性 +} +``` + +### 任意属性(不确定时) + +- 一但定义了任意类型,该对象内部必须所有的属性(包括已确定的属性)都为该任意类型的类型子集 +- 一个接口只能定义一个任意属性,如果有多个类型,任意属性可以使用联合类型`[propName: String]: String | Number | Boolean` + +```ts +interface IPerson{ + [propName: String]: String +} + +let xi: IPerson{ + name: "何琋", + age: "32" +} +``` + +```ts +interface IPerson{ + age: Number; + [propName: String]: String;// 这里会让上面报错,Number类型不是String类型的子集,所以一般使用Any类型 +} +``` + +### 只读属性 + +```ts +interface IPerson{ + readonly sex: String; +} +let hexi: IPerson = { + sex : "男" +} +hexi.sex = "女";// 这里会报错,sex为只读属性 +``` + +```ts +// 测试只读任意属性 + +interface IPerson{ + readonly [propName: string]: string +} + +let hexi:IPerson = { + name: "何琋", + sex: "男" +} + +hexi.sex = "女" +``` + +## 接口——数组类型 + +- 不常用 + +```ts +interface IArray{ + [index:Number]: Number;// index: Number 下标是数字的 +} +``` + +## 接口——函数类型 + +```ts +interface ISearchFunc{ + (a: String, b: String): boolean; +} + +const fun1:ISearchFunc = function(a: String, b: String): boolean{ + return a.search(b) !== -1 +} +``` + +## 函数 + +### 函数声明 + +```js +// 函数声明,命名函数 +function fun1(a, b){ + return a + b +} +// 函数表达式,匿名函数 +const fun2 = function(a, b){ + return a + b +} +``` + +```ts +function fun1(a: Number, b: Number): Number{ + return a + b +} + +const fun2 = function(a: Number, b:Number): Number{ + return a + b +} + +const fun3: (a: Number, b:Number) => Number = function(a: Number, b:Number): Number{ + return a + b +} +``` + +### 可选参数和默认参数 + +- 必选参数不能位于可选参数之后 +- 默认参数可以放在可选参数之后 + +```ts +const getName = function(x: String = "何", y?: String): String{ + return x = y; +} + +const geName2 = function(x: String, y?: String, z: String = "早上好"): String{ + return x + y + z +} +``` + +### 剩余参数 + +```ts +const fn = function(a: String, b: String, args: number[]){ + console.log(a, b, args) +} +``` + +### 函数重载 + +- 函数名称相同,参数类型不同 + +```ts +// 函数重载 +// 这里需要先定义 +function add(x: string, y:string): string +function add(x: number, y: number): number + +function add(x: string | number, y: string | number): string | number{ + if(typeof x === 'string' && typeof y === "string"){ + return x + y + }else if(typeof x === 'number' && typeof y === 'number'){ + return x + y + } +} + +console.log(add(1, 2))// 3 +console.log(add('何', '琋'))// 何琋 +``` + +## 断言 + +- 联合类型断言为其中一个类型 + +`变量 as 类型` +`<类型>变量` + +```ts +// 断言 + +function getSome(x: number | string): void{ + if((x as string).length){ + console.log((x).length) + }else{ + console.log(x.toString().length) + } +} + +getSome(32389382) +getSome('何琋大坏蛋') +``` + +- 将任何一个变量断言为any,any可以访问任意属性 + +```ts +(window as any).a = '何琋'// 不进行断言是无法访问的 +``` + +- 将any类型断言为任意具体子类型 + +## 类型别名 + +```ts +type name = string +let a: name = "何琋" +``` + +- 字面量类型 + +```ts +// 类型别名何字面量类型 + +type newName = "何琋" | "何蔺" | "何茗" + +let myName: newName = "何琋" + +console.log(myName) +``` + +## 元组 + +```ts +let arr: number[] = [1, 2, 3, 4] +// 数组合并同一类型 +// 元组Tuple,合并不同类型 +let Tarr: [number, string] = [1, '1'] // 这里不能再添加,也不能换位 +// 添加元素时,需要从生命中的类型取 +Tarr.push('32') +Tarr.push(32) +Tarr.push(true)// 报错 +``` + +## 枚举 + +- Enum + +```ts +// 自动赋值 +enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; +// 事实上被编译为 +var Days; +(function (Days) { + Days[Days["Sun"] = 0] = "Sun"; + Days[Days["Mon"] = 1] = "Mon"; + Days[Days["Tue"] = 2] = "Tue"; + Days[Days["Wed"] = 3] = "Wed"; + Days[Days["Thu"] = 4] = "Thu"; + Days[Days["Fri"] = 5] = "Fri"; + Days[Days["Sat"] = 6] = "Sat"; +})(Days || (Days = {})); + +// 手动赋值 +enum test { + one=1, + two=2, + three=3, + four=4 +} +// 半自动 + +enum test2{ + one=1, + tow,// 2 + three=12, + four,// 13 +} +``` + +- 常数项和计算所得项 + +```ts +enum Color {Red = "red".length, Green, Blue};// 会报错,计算所得项后面不能跟自动赋值 +``` + +- 常数枚举 + - 常数枚举不会被编译,哪里用那里直接赋值 + - 常数枚举不能使用计算所得项 + +```ts +const enum test{ + one, + two, + three +} +``` + +- 外部枚举 + +```ts +declare enum test{ + Up, + Down, + Left, + Right +} +// 可以和const一起使用 +declare const enum test2{ + Up, + Down, + Left, + Right +} +``` + +## 类 + +- 抽象类(Abstract Class):抽象类是供其他类继承的基类,抽象类不允许被实例化。抽象类中的抽象方法必须在子类中被实现 +- 封装(Encapsulation):将对数据的操作细节隐藏起来,只暴露对外的接口。外界调用端不需要(也不可能)知道细节,就能通过对外提供的接口来访问该对象,同时也保证了外界无法任意更改对象内部的数据 +- 继承(Inheritance):子类继承父类,子类除了拥有父类的所有特性外,还有一些更具体的特性 +- 多态(Polymorphism):由继承而产生了相关的不同的类,对同一个方法可以有不同的响应。比如 `Cat` 和 `Dog` 都继承自 `Animal`,但是分别实现了自己的 `eat` 方法。此时针对某一个实例,我们无需了解它是 `Cat` 还是 `Dog`,就可以直接调用 `eat` 方法,程序会自动判断出来应该如何执行 `eat` + +```js +// 属性和方法 +class Animal { + public name; + constructor(name) { + this.name = name; + } + sayHi() { + return `My name is ${this.name}`; + } +} + +let a = new Animal('Jack'); +console.log(a.sayHi()); // My name is Jack +// 类的继承 +class Cat extends Animal { + constructor(name) { + super(name); // 调用父类的 constructor(name) + console.log(this.name); + } + sayHi() { + return 'Meow, ' + super.sayHi(); // 调用父类的 sayHi() + } +} + +let c = new Cat('Tom'); // Tom +console.log(c.sayHi()); // Meow, My name is Tom +``` + +- 存取器 + +```js +class Animal { + constructor(name) { + this.name = name; + } + get name() { + return 'Jack'; + } + set name(value) { + console.log('setter: ' + value); + } +} + +let a = new Animal('Kitty'); // setter: Kitty +a.name = 'Tom'; // setter: Tom +console.log(a.name); // Jack +``` + +- 静态方法和属性 + +```js +class Animal { + static name = 42; + static isAnimal(a) { + return a instanceof Animal; + } +} + +let a = new Animal('Jack'); +Animal.isAnimal(a); // true +a.isAnimal(a); // TypeError: a.isAnimal is not a function +``` + +### TypeScript 中类的用法 + +- `public` 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 `public` 的 +- `private` 修饰的属性或方法是私有的,不能在声明它的类的外部访问 +- `protected` 修饰的属性或方法是受保护的,它和 `private` 类似,区别是它在子类中也是允许被访问的 + +```ts +class Animal { + public name; + public constructor(name) { + this.name = name; + } +} + +let a = new Animal('Jack'); +console.log(a.name); // Jack +a.name = 'Tom'; +console.log(a.name); // Tom +``` + +```ts +class Animal { + private name; + public constructor(name) { + this.name = name; + } +} + +let a = new Animal('Jack'); +console.log(a.name); +a.name = 'Tom'; + +// index.ts(9,13): error TS2341: Property 'name' is private and only accessible within class 'Animal'. +// index.ts(10,1): error TS2341: Property 'name' is private and only accessible within class 'Animal'. +``` + +```ts +class Animal { + protected name; + public constructor(name) { + this.name = name; + } +} + +class Cat extends Animal { + constructor(name) { + super(name); + console.log(this.name); + } +} +``` + +当构造函数修饰为 `private` 时,该类不允许被继承或者实例化 + +```ts +class Animal { + public name; + private constructor(name) { + this.name = name; + } +} +class Cat extends Animal { + constructor(name) { + super(name); + } +} + +let a = new Animal('Jack'); + +// index.ts(7,19): TS2675: Cannot extend a class 'Animal'. Class constructor is marked as private. +// index.ts(13,9): TS2673: Constructor of class 'Animal' is private and only accessible within the class declaration. +``` + +当构造函数修饰为 `protected` 时,该类只允许被继承: + +```ts +class Animal { + public name; + protected constructor(name) { + this.name = name; + } +} +class Cat extends Animal { + constructor(name) { + super(name); + } +} + +let a = new Animal('Jack'); + +// index.ts(13,9): TS2674: Constructor of class 'Animal' is protected and only accessible within the class declaration. +``` + +### readonly + +只读属性关键字,只允许出现在属性声明或索引签名或构造函数中。 + +```ts +class Animal { + readonly name; + public constructor(name) { + this.name = name; + } +} + +let a = new Animal('Jack'); +console.log(a.name); // Jack +a.name = 'Tom'; + +// index.ts(10,3): TS2540: Cannot assign to 'name' because it is a read-only property. +``` + +注意如果 `readonly` 和其他访问修饰符同时存在的话,需要写在其后面。 + +```ts +class Animal { + // public readonly name; + public constructor(public readonly name) { + // this.name = name; + } +} +``` + +### 抽象类 + +`abstract` 用于定义抽象类和其中的抽象方法。 +首先,抽象类是不允许被实例化的: +其次,抽象类中的抽象方法必须被子类实现: + +```ts +abstract class Animal { + public name; + public constructor(name) { + this.name = name; + } + public abstract sayHi(); +} + +class Cat extends Animal { + public sayHi() { + console.log(`Meow, My name is ${this.name}`); + } +} + +let cat = new Cat('Tom'); +``` + +- 类的类型 + +给类加上 TypeScript 的类型很简单,与接口类似: + +```ts +class Animal { + name: string; + constructor(name: string) { + this.name = name; + } + sayHi(): string { + return `My name is ${this.name}`; + } +} + +let a: Animal = new Animal('Jack'); +console.log(a.sayHi()); // My name is Jack +``` + +## 类与接口 + +```ts +interface Alarm { + alert(): void; +} +``` + +## 泛型 + +```ts +unction createArray(length: number, value: T): Array { + let result: T[] = []; + for (let i = 0; i < length; i++) { + result[i] = value; + } + return result; +} + +createArray(3, 'x'); // ['x', 'x', 'x'] +``` + +- 多参数 + +```ts +function swap(tuple: [T, U]): [U, T] { + return [tuple[1], tuple[0]]; +} + +swap([7, 'seven']); // ['seven', 7] +``` + +- 泛型约束 + +```ts +interface Lengthwise { + length: number; +} +// 只允许这个函数传入那些包含 `length` 属性的变量 +function loggingIdentity(arg: T): T { + console.log(arg.length); + return arg; +} +``` + +- 泛型接口 + +```ts +interface CreateArrayFunc { + (length: number, value: T): Array; +} + +let createArray: CreateArrayFunc; +createArray = function(length: number, value: T): Array { + let result: T[] = []; + for (let i = 0; i < length; i++) { + result[i] = value; + } + return result; +} + +createArray(3, 'x'); // ['x', 'x', 'x'] +``` + +- 泛型类 + +```ts +class GenericNumber { + zeroValue: T; + add: (x: T, y: T) => T; +} + +let myGenericNumber = new GenericNumber(); +myGenericNumber.zeroValue = 0; +myGenericNumber.add = function(x, y) { return x + y; }; +``` \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/001.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/001.js new file mode 100644 index 0000000..ae43e42 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/001.js @@ -0,0 +1,6 @@ +// 测试只读任意属性 +var hexi = { + name: "何琋", + sex: "男" +}; +hexi.sex = "女"; diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/001.ts b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/001.ts new file mode 100644 index 0000000..b348a01 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/001.ts @@ -0,0 +1,12 @@ +// 测试只读任意属性 + +interface IPerson{ + readonly [propName: string]: string +} + +let hexi:IPerson = { + name: "何琋", + sex: "男" +} + +// hexi.sex = "女" \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/002.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/002.js new file mode 100644 index 0000000..5a25499 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/002.js @@ -0,0 +1,11 @@ +// 函数重载 +function add(x, y) { + if (typeof x === 'string' && typeof y === "string") { + return x + y; + } + else if (typeof x === 'number' && typeof y === 'number') { + return x + y; + } +} +console.log(add(1, 2)); // 3 +console.log(add('何', '琋')); // 何琋 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/002.ts b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/002.ts new file mode 100644 index 0000000..9acc41d --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/002.ts @@ -0,0 +1,15 @@ +// 函数重载 + +function add(x: string, y:string): string +function add(x: number, y: number): number + +function add(x: string | number, y: string | number): string | number{ + if(typeof x === 'string' && typeof y === "string"){ + return x + y + }else if(typeof x === 'number' && typeof y === 'number'){ + return x + y + } +} + +console.log(add(1, 2))// 3 +console.log(add('何', '琋'))// 何琋 \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/003.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/003.js new file mode 100644 index 0000000..c84fbc7 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/003.js @@ -0,0 +1,17 @@ +// 断言 +function getSome(x) { + if (x.length) { + console.log(x.length); + } + else { + console.log(x.toString().length); + } +} +getSome(32389382); +getSome('何琋大坏蛋'); +function fn(x, y) { + return x + y; +} +var a = fn(1, 2); +var b = fn('何', '琋'); +console.log(a, b); diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/003.ts b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/003.ts new file mode 100644 index 0000000..a003fd4 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/003.ts @@ -0,0 +1,21 @@ +// 断言 + +function getSome(x: number | string): void{ + if((x as string).length){ + console.log((x).length) + }else{ + console.log(x.toString().length) + } +} + +getSome(32389382) +getSome('何琋大坏蛋') + +function fn(x: any, y:any): any{ + return x + y +} + +let aas: number = fn(1, 2) as number; +let ba: string = fn('何', '琋') as string + +console.log(aas, ba) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/004.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/004.js new file mode 100644 index 0000000..188f384 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/004.js @@ -0,0 +1,3 @@ +// 类型别名何字面量类型 +var myName = "何琋"; +console.log(myName); diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/004.ts b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/004.ts new file mode 100644 index 0000000..563758f --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/004.ts @@ -0,0 +1,7 @@ +// 类型别名何字面量类型 + +type newName = "何琋" | "何蔺" | "何茗" + +let myName: newName = "何琋" + +console.log(myName) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/005.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/005.js new file mode 100644 index 0000000..c38d68d --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/005.js @@ -0,0 +1,3 @@ +var a = ['1', 32]; +a.push('43'); +console.log(a); diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/005.ts b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/005.ts new file mode 100644 index 0000000..19575e3 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/005.ts @@ -0,0 +1,3 @@ +let a: [string, number] = ['1', 32] // 这里不能再添加,也不能换位 +a.push('43') +console.log(a) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/helloworld.ts b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/helloworld.ts new file mode 100644 index 0000000..8699fa4 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/helloworld.ts @@ -0,0 +1,119 @@ +function sayHello(str:string){ + console.log('Hello',str) +} + +sayHello('World') +// 以上为为开始 + +console.log("基础类型"); +// 布尔值 +let a:boolean = false; +// 数字 +let b:number = 32; +// 字符串 +let c:string = "何琋"; +// 数组 +let d:number[] = [12, 13]; +// 元组Tuple +let e:[string, number] = ['age', 12];// 位置不能反 +// 枚举 +enum Color {Pink, Red, Blue};// 默认值为0开始 +let f:Color = Color.Blue +enum Age {small = 32, big = 99}; +let g:Age = Age.big; +// 任意值 +let suiji: any = 32; +let suiji2: any[] = [a, b, c, d] + +// 空值 +function fun1(): void{ + console.log('没有返回值的函数') +} +// 空值只能赋予undefined和null + +// undefined和null +// 默认情况下 undefined和null为所有类型的值 + +//never +//never类型表示的是那些永不存在的值的类型。 例如,never类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型; 变量也可能是never类型,当它们被永不为真的类型保护所约束时 +// 返回never的函数必须存在无法达到的终点 +function error(message: string): never { + throw new Error(message); +} + +// 推断的返回值类型为never +function fail() { + return error("Something failed"); +} + +// 返回never的函数必须存在无法达到的终点 +function infiniteLoop(): never { + while (true) { + } +} + +// 类型断言 +// 1。尖括号 +let someValue: any = "this is a string"; + +let strLength: number = (someValue).length; +// 2。as JSX只能使用as +let someValue2: any = "this is a string"; + +let strLength2: number = (someValue as string).length; + +// 对象解构赋值 +let o = { + aa: "foo", + bb: 12, + cc: "bar" +}; +// 属性重命名 +let { aa: newName1, bb: newName2 } = o; +// 加入ts +let {aa, bb}: {aa: string, bb: number} = o; +// 默认值 +function keepWholeObject(wholeObject: { a: string, b?: number }) { + let { a, b = 1001 } = wholeObject; +} +// 函数声明 +type C = { a: string, b?: number } +function fun2({ a, b }: C): void { + // ... +} + + +// 接口 +function printLabel(labelledObj: { label: string }) { + console.log(labelledObj.label); +} + +let myObj = { size: 10, label: "Size 10 Object" }; +printLabel(myObj); + +// 接口实现上面的内容 +interface LabelledValue { + label: string; + size?: number;// 可选属性 +} + +function printLabel2(labelledObj: LabelledValue) { + console.log(labelledObj.label); +} + +let myObj2 = {size: 10, label: "Size 10 Object"}; +printLabel(myObj2); + +// 只读属性 +interface Point { + readonly x: number; + readonly y: number; +} + +// 函数类型 +interface SearchFunc { + (source: string, subString: string): boolean; +} +function fun3(source:string, subString: string){ + return +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/tsconfig.json b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/tsconfig.json new file mode 100644 index 0000000..b73f9db --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A1-JavaScript/TypeScript/src/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es5", + "sourceMap": true + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/CSS/0.0.01文字穿透.html b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/CSS/0.0.01文字穿透.html new file mode 100644 index 0000000..db0e7bb --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/CSS/0.0.01文字穿透.html @@ -0,0 +1,47 @@ + + + + + 文字穿透 + + + +
Hello World!
+
Hello World!
+ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/CSS/bg.jpg b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/CSS/bg.jpg new file mode 100644 index 0000000..f168bf9 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/CSS/bg.jpg differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/CSS/test.html b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/CSS/test.html new file mode 100644 index 0000000..06f7ee8 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/CSS/test.html @@ -0,0 +1,84 @@ + + + + + Title + + + +
+
Hello World!
+
+
Hello World!
+ +
+ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/CSS/test2.html b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/CSS/test2.html new file mode 100644 index 0000000..a768467 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/CSS/test2.html @@ -0,0 +1,54 @@ + + + + + Title + + + +
+
Hello World!
+
+ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/HTML/尚学堂.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/HTML/尚学堂.md new file mode 100644 index 0000000..27d60bb --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/HTML/尚学堂.md @@ -0,0 +1,2149 @@ +# HTML5+CSS3 + +## 前序:我的发现 + +### 1 蒙版文字 + +```css +/* 让文字显示背景的颜色*/ +*{ + background-image: -webkit-gradient(linear,0 0,0 bottom, from(#e9f8ea), to(#88d78d)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} +``` + + + +## 章节一 webstorm安装与设置 + + + +优点:自动补全 + +## 章节二 HTML基础元素 + +### 1 标题标签`

` + +作用:设置标题 + +```html +

一号标题

+

二号标题

+

三号标题

+

四号标题

+
五号标题
+
六号标题
+``` + +### 2 段落标记`

` + +```html +

这是一个段落

+

这是一个段落

+

这是一个段落

+``` + +### 3 强制换行`

` + +```html +
+ + + +``` + +### 4 分割线`
` + +```html + +

这是第一个段落

+
+
+

这是第二个段落

+ +``` + +### 5 图片`` + +```html + + + + + + + + + + + + + + + + + + +蜡笔小新 +``` + +### 6 超链接`` + +```html + +百度一下 + +跳转到06 + +跳转到图片 + + + + +
+ + +点击我 + +跳转到我 + +跳转到06的某个位置 +点击我 + + + +返回页面顶部 +``` + +### 7 文本格式化标签 + +```html + +加粗 +倾斜 +下划线 + +删除线 +删除线 + +强调,倾斜显示 +强调,加粗显示 + +上标 +下标 +23 +O2 + +小号字体 +大号字体 +``` + +### 8 无序列表`
    ` + +```html + +``` + +### 9 有序列表`
      ` + +```html + +``` + +### 10 自定义列表`
      ` + +
      +
      项目
      +
      项目的注释
      +
      项目的注释
      +
      项目的注释
      +
      + +
      +
      帮助中心
      +
      账户管理
      +
      账户管理
      +
      账户管理
      +
      + +
      +
      服务支持
      +
      账户管理
      +
      账户管理
      +
      账户管理
      +
      账户管理
      +
      + + + +```html +
      +
      项目
      +
      项目的注释
      +
      项目的注释
      +
      项目的注释
      +
      + +
      +
      帮助中心
      +
      账户管理
      +
      账户管理
      +
      账户管理
      +
      + +
      +
      服务支持
      +
      账户管理
      +
      账户管理
      +
      账户管理
      +
      账户管理
      +
      + + +``` + +### 11 表格 + +#### 表格创建 + +```html + + + + + + + + + + + + + + + + + + + + + +
      表格的标题
      三行两列的表格三行两列的表格
      三行两列的表格三行两列的表格三行两列的表格三行两列的表格
      三行两列的表格三行两列的表格
      +``` + + + + + + + + + + + + + + + + + + + + + +
      表格的标题
      三行两列的表格三行两列的表格
      三行两列的表格三行两列的表格三行两列的表格三行两列的表格
      三行两列的表格三行两列的表格
      + +#### table属性 + +```html + +``` + + + +#### tr属性 + +```html + +``` + + + +#### td属性 + +```html + +``` + +## 章节三 表单 + +### 1 form + +```html + + +
      + +
      +``` + +### 2 表单元素 + +```html + +
      + 用户名: +
      + 密码: +
      + 性别: + 男 + 女 + 人妖 +
      + 爱好: + 唱 + 跳 + rap +
      + + + + + + +
      + + + +
      +

      + 性别: + + + + +

      +

      + 爱好: + + + + + + + + +

      +

      + 下拉列表: + + +

      +

      + 多行文本框: + +

      +

      + 文件: + +

      +

      + 图片提价按钮: + +

      +

      + 隐藏域: + +

      +
      +``` + +### 3 表单元素常用属性 + +```html + +
      +

      + 姓名: +

      +

      + 密码: +

      +

      + 性别: + + + + +

      +

      + 爱好: + + + + + + +

      +

      + 城市: + +

      +

      + + +

      + +
      +``` + +### 4 H5新增type类型 + +```html + +
      +

      邮箱:

      +

      网址:

      +

      搜索:

      +

      电话:

      +

      颜色:

      +

      数字:

      +

      范围:

      +

      日期:

      +

      月:

      +

      周:

      +

      + +
      +``` + +### 5 H5新增表单元素属性 + +```html + +
      +

      + 姓名: +

      +

      + 密码: +

      +

      + 邮箱: +

      +

      + +

      +
      +``` + +### 6 行内元素与块级元素 + +```html + +

      一号标题

      +

      这是一个段落

      + +加粗 +超链接 +``` + +## 章节四 H5新增元素与CSS初识 + +### 1 div和span + +```html + +``` + +### 2 H5新增语义化布局标签 + +```html5 + +``` + +### 3 视频和音频 + +```html + +``` + +### 4 CSS与引入方式 + +```html + + + + + + + +``` + +## 章节五 CSS常用属性 + +### 1 字体的属性 + +```html + + +``` + +### 2 背景属性 + +```html + +``` + +### 3 文本属性 + +```html + +``` + +### 4 列表属性 + +```html + +``` + +### 5 表格属性 + +```html + +``` + +### 6 overflow:hidden + +```html + +``` + +### 7 行高间距 + +```html + +``` + +### AAAAAAAAA8 选择器 + +```html + +``` + +## 章节六 盒模型 + +```css +box-sizing: content-box|border-box|inherit; +/* + content-box标准盒模型,宽高定义内容大小 + border-box怪异盒模型ie,宽高定义边框以内 + inherit继承父元素 +*/ +``` + +```html + +``` + +### 厂商前缀 + +```html + +``` + +## 章节七 浮动和定位 + +### 1 浮动和清除 + +```html + +``` + +### 2 display + +```html + +``` + +### 3 position + +```html + +``` + +## 章节八 C3新特性 + +### 1 圆角`border-radius` + +```html + +``` + +### 2 阴影`box-shadow` + +```html + +``` + +### 3 背景渐变`background-image:-o-linear-gradient(,,)` + + + +AAAAAAAAAAAAAA 上面的元素需要加position 不然会被覆盖 + +```html + +``` + +### 4 位移与旋转transform + +```html + +``` + +### 5 过渡`transition` + +```html + +``` + +### 6 动画`animation` + +```html + +``` + + + +## 章节九 响应式布局 + +### 1 媒体查询 + +768px-992px + +```html + +``` + +## 2 响应式 + +```html + +``` + +### 3 多列(报纸效果) + +```html + +``` + + + +## 章节十 雪碧图 + +### 雪碧图 + +```html + +``` + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/.gitignore b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/index.html b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/index.html new file mode 100644 index 0000000..25e8fad --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
      + + + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/package.json b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/package.json new file mode 100644 index 0000000..eddc3d6 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/package.json @@ -0,0 +1,22 @@ +{ + "name": "demo-mobx", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "mobx": "^6.6.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.0.17", + "@types/react-dom": "^18.0.6", + "@vitejs/plugin-react": "^2.1.0", + "vite": "^3.1.0" + } +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/pnpm-lock.yaml b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/pnpm-lock.yaml new file mode 100644 index 0000000..eefce42 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/pnpm-lock.yaml @@ -0,0 +1,889 @@ +lockfileVersion: 5.4 + +specifiers: + '@types/react': ^18.0.17 + '@types/react-dom': ^18.0.6 + '@vitejs/plugin-react': ^2.1.0 + mobx: ^6.6.2 + react: ^18.2.0 + react-dom: ^18.2.0 + vite: ^3.1.0 + +dependencies: + mobx: 6.6.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + +devDependencies: + '@types/react': 18.0.21 + '@types/react-dom': 18.0.6 + '@vitejs/plugin-react': 2.1.0_vite@3.1.8 + vite: 3.1.8 + +packages: + + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/compat-data/7.19.4: + resolution: {integrity: sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.19.3: + resolution: {integrity: sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.19.5 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helpers': 7.19.4 + '@babel/parser': 7.19.4 + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.4 + '@babel/types': 7.19.4 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.19.5: + resolution: {integrity: sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure/7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-compilation-targets/7.19.3_@babel+core@7.19.3: + resolution: {integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.19.4 + '@babel/core': 7.19.3 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + semver: 6.3.0 + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name/7.19.0: + resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-module-transforms/7.19.0: + resolution: {integrity: sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.19.4 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.4 + '@babel/types': 7.19.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils/7.19.0: + resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access/7.19.4: + resolution: {integrity: sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers/7.19.4: + resolution: {integrity: sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.4 + '@babel/types': 7.19.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser/7.19.4: + resolution: {integrity: sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.19.3: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.19.3: + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.3 + dev: true + + /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.19.3: + resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx-source/7.18.6_@babel+core@7.19.3: + resolution: {integrity: sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.19.3: + resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.19.3 + '@babel/types': 7.19.4 + dev: true + + /@babel/template/7.18.10: + resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.19.4 + '@babel/types': 7.19.4 + dev: true + + /@babel/traverse/7.19.4: + resolution: {integrity: sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.19.5 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.19.4 + '@babel/types': 7.19.4 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.19.4: + resolution: {integrity: sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: true + + /@esbuild/android-arm/0.15.11: + resolution: {integrity: sha512-PzMcQLazLBkwDEkrNPi9AbjFt6+3I7HKbiYF2XtWQ7wItrHvEOeO3T8Am434zAozWtVP7lrTue1bEfc2nYWeCA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.15.11: + resolution: {integrity: sha512-geWp637tUhNmhL3Xgy4Bj703yXB9dqiLJe05lCUfjSFDrQf9C/8pArusyPUbUbPwlC/EAUjBw32sxuIl/11dZw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@types/prop-types/15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: true + + /@types/react-dom/18.0.6: + resolution: {integrity: sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==} + dependencies: + '@types/react': 18.0.21 + dev: true + + /@types/react/18.0.21: + resolution: {integrity: sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.1.1 + dev: true + + /@types/scheduler/0.16.2: + resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + dev: true + + /@vitejs/plugin-react/2.1.0_vite@3.1.8: + resolution: {integrity: sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + dependencies: + '@babel/core': 7.19.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.3 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.19.3 + '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.19.3 + '@babel/plugin-transform-react-jsx-source': 7.18.6_@babel+core@7.19.3 + magic-string: 0.26.7 + react-refresh: 0.14.0 + vite: 3.1.8 + transitivePeerDependencies: + - supports-color + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /browserslist/4.21.4: + resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001421 + electron-to-chromium: 1.4.284 + node-releases: 2.0.6 + update-browserslist-db: 1.0.10_browserslist@4.21.4 + dev: true + + /caniuse-lite/1.0.30001421: + resolution: {integrity: sha512-Sw4eLbgUJAEhjLs1Fa+mk45sidp1wRn5y6GtDpHGBaNJ9OCDJaVh2tIaWWUnGfuXfKf1JCBaIarak3FkVAvEeA==} + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /csstype/3.1.1: + resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /electron-to-chromium/1.4.284: + resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} + dev: true + + /esbuild-android-64/0.15.11: + resolution: {integrity: sha512-rrwoXEiuI1kaw4k475NJpexs8GfJqQUKcD08VR8sKHmuW9RUuTR2VxcupVvHdiGh9ihxL9m3lpqB1kju92Ialw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64/0.15.11: + resolution: {integrity: sha512-/hDubOg7BHOhUUsT8KUIU7GfZm5bihqssvqK5PfO4apag7YuObZRZSzViyEKcFn2tPeHx7RKbSBXvAopSHDZJQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64/0.15.11: + resolution: {integrity: sha512-1DqHD0ms3AhiwkKnjRUzmiW7JnaJJr5FKrPiR7xuyMwnjDqvNWDdMq4rKSD9OC0piFNK6n0LghsglNMe2MwJtA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64/0.15.11: + resolution: {integrity: sha512-OMzhxSbS0lwwrW40HHjRCeVIJTURdXFA8c3GU30MlHKuPCcvWNUIKVucVBtNpJySXmbkQMDJdJNrXzNDyvoqvQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64/0.15.11: + resolution: {integrity: sha512-8dKP26r0/Qyez8nTCwpq60QbuYKOeBygdgOAWGCRalunyeqWRoSZj9TQjPDnTTI9joxd3QYw3UhVZTKxO9QdRg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64/0.15.11: + resolution: {integrity: sha512-aSGiODiukLGGnSg/O9+cGO2QxEacrdCtCawehkWYTt5VX1ni2b9KoxpHCT9h9Y6wGqNHmXFnB47RRJ8BIqZgmQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32/0.15.11: + resolution: {integrity: sha512-lsrAfdyJBGx+6aHIQmgqUonEzKYeBnyfJPkT6N2dOf1RoXYYV1BkWB6G02tjsrz1d5wZzaTc3cF+TKmuTo/ZwA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64/0.15.11: + resolution: {integrity: sha512-Y2Rh+PcyVhQqXKBTacPCltINN3uIw2xC+dsvLANJ1SpK5NJUtxv8+rqWpjmBgaNWKQT1/uGpMmA9olALy9PLVA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm/0.15.11: + resolution: {integrity: sha512-TJllTVk5aSyqPFvvcHTvf6Wu1ZKhWpJ/qNmZO8LL/XeB+LXCclm7HQHNEIz6MT7IX8PmlC1BZYrOiw2sXSB95A==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64/0.15.11: + resolution: {integrity: sha512-uhcXiTwTmD4OpxJu3xC5TzAAw6Wzf9O1XGWL448EE9bqGjgV1j+oK3lIHAfsHnuIn8K4nDW8yjX0Sv5S++oRuw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le/0.15.11: + resolution: {integrity: sha512-WD61y/R1M4BLe4gxXRypoQ0Ci+Vjf714QYzcPNkiYv5I8K8WDz2ZR8Bm6cqKxd6rD+e/rZgPDbhQ9PCf7TMHmA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le/0.15.11: + resolution: {integrity: sha512-JVleZS9oPVLTlBhPTWgOwxFWU/wMUdlBwTbGA4GF8c38sLbS13cupj+C8bLq929jU7EMWry4SaL+tKGIaTlqKg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64/0.15.11: + resolution: {integrity: sha512-9aLIalZ2HFHIOZpmVU11sEAS9F8TnHw49daEjcgMpBXHFF57VuT9f9/9LKJhw781Gda0P9jDkuCWJ0tFbErvJw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x/0.15.11: + resolution: {integrity: sha512-sZHtiXXOKsLI3XGBGoYO4qKBzJlb8xNsWmvFiwFMHFzA4AXgDP1KDp7Dawe9C2pavTRBDvl+Ok4n/DHQ59oaTg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64/0.15.11: + resolution: {integrity: sha512-hUC9yN06K9sg7ju4Vgu9ChAPdsEgtcrcLfyNT5IKwKyfpLvKUwCMZSdF+gRD3WpyZelgTQfJ+pDx5XFbXTlB0A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64/0.15.11: + resolution: {integrity: sha512-0bBo9SQR4t66Wd91LGMAqmWorzO0TTzVjYiifwoFtel8luFeXuPThQnEm5ztN4g0fnvcp7AnUPPzS/Depf17wQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64/0.15.11: + resolution: {integrity: sha512-EuBdTGlsMTjEl1sQnBX2jfygy7iR6CKfvOzi+gEOfhDqbHXsmY1dcpbVtcwHAg9/2yUZSfMJHMAgf1z8M4yyyw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32/0.15.11: + resolution: {integrity: sha512-O0/Wo1Wk6dc0rZSxkvGpmTNIycEznHmkObTFz2VHBhjPsO4ZpCgfGxNkCpz4AdAIeMczpTXt/8d5vdJNKEGC+Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64/0.15.11: + resolution: {integrity: sha512-x977Q4HhNjnHx00b4XLAnTtj5vfbdEvkxaQwC1Zh5AN8g5EX+izgZ6e5QgqJgpzyRNJqh4hkgIJF1pyy1be0mQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64/0.15.11: + resolution: {integrity: sha512-VwUHFACuBahrvntdcMKZteUZ9HaYrBRODoKe4tIWxguQRvvYoYb7iu5LrcRS/FQx8KPZNaa72zuqwVtHeXsITw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.15.11: + resolution: {integrity: sha512-OgHGuhlfZ//mToxjte1D5iiiQgWfJ2GByVMwEC/IuoXsBGkuyK1+KrjYu0laSpnN/L1UmLUCv0s25vObdc1bVg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.15.11 + '@esbuild/linux-loong64': 0.15.11 + esbuild-android-64: 0.15.11 + esbuild-android-arm64: 0.15.11 + esbuild-darwin-64: 0.15.11 + esbuild-darwin-arm64: 0.15.11 + esbuild-freebsd-64: 0.15.11 + esbuild-freebsd-arm64: 0.15.11 + esbuild-linux-32: 0.15.11 + esbuild-linux-64: 0.15.11 + esbuild-linux-arm: 0.15.11 + esbuild-linux-arm64: 0.15.11 + esbuild-linux-mips64le: 0.15.11 + esbuild-linux-ppc64le: 0.15.11 + esbuild-linux-riscv64: 0.15.11 + esbuild-linux-s390x: 0.15.11 + esbuild-netbsd-64: 0.15.11 + esbuild-openbsd-64: 0.15.11 + esbuild-sunos-64: 0.15.11 + esbuild-windows-32: 0.15.11 + esbuild-windows-64: 0.15.11 + esbuild-windows-arm64: 0.15.11 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /is-core-module/2.10.0: + resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} + dependencies: + has: 1.0.3 + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /magic-string/0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /mobx/6.6.2: + resolution: {integrity: sha512-IOpS0bf3+hXIhDIy+CmlNMBfFpAbHS0aVHcNC+xH/TFYEKIIVDKNYRh9eKlXuVfJ1iRKAp0cRVmO145CyJAMVQ==} + dev: false + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /postcss/8.4.18: + resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /react-dom/18.2.0_react@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-refresh/0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react/18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.10.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /rollup/2.78.1: + resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /scheduler/0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /update-browserslist-db/1.0.10_browserslist@4.21.4: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.4 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /vite/3.1.8: + resolution: {integrity: sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + less: '*' + sass: '*' + stylus: '*' + terser: ^5.4.0 + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.15.11 + postcss: 8.4.18 + resolve: 1.22.1 + rollup: 2.78.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/public/vite.svg b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/assets/index.css b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/assets/index.css new file mode 100644 index 0000000..917888c --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/assets/index.css @@ -0,0 +1,70 @@ +:root { + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/assets/react.svg b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/main.jsx b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/main.jsx new file mode 100644 index 0000000..d94e9ee --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/main.jsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from '@/pages/App' +import '@/assets/index.css' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + +) diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/pages/App/index.jsx b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/pages/App/index.jsx new file mode 100644 index 0000000..2f15155 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/pages/App/index.jsx @@ -0,0 +1,23 @@ + +import {userStore } from '@/store' +import {autorun} from 'mobx' +import {useEffect} from 'react' +export default function App(){ + useEffect(() => { + const a = autorun(() => { + console.log(userStore.name) + console.log(userStore.sex) + }) + setTimeout(() => { + userStore.setName('荷西') + }) + return () => { + console.log('卸载') + a() + } + },[0]) + + return( +
      APP
      + ) +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/store/index.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/store/index.js new file mode 100644 index 0000000..921e9ac --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/store/index.js @@ -0,0 +1,4 @@ +import UserStore from './userStore.js' + + +export const userStore = new UserStore() \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/store/userStore.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/store/userStore.js new file mode 100644 index 0000000..f21e4c9 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/src/store/userStore.js @@ -0,0 +1,41 @@ +import { observable, action, computed, makeObservable} from "mobx"; + + +class UserStore { + name = 'kangkang000'; + sex = '男'; + userObj = { + name: 'kangkang000', + age: 23, + token: '12345689' + } + + constructor() { + // mobx6 和以前版本这是最大的区别 + makeObservable(this, { + name: observable, + sex: observable, + userObj: observable, + setName: action, + titleName: computed + }); + + } + + setName(v) { + console.log('触发action'); + this.name = v; + } + setUserObj(obj) { + this.userObj = obj; + } + + get titleName(){ + return this.name+'___111'; + } + get userObject() { + return this.userObj; + } +} + +export default UserStore \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/vite.config.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/vite.config.js new file mode 100644 index 0000000..b24dc8d --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Mobx/demo-mobx/vite.config.js @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import path from 'path' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + } + }, +}) diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/React-Router-Dom 6.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/React-Router-Dom 6.md new file mode 100644 index 0000000..6dbf335 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/React-Router-Dom 6.md @@ -0,0 +1,120 @@ +# React-Router-Dom 6 + +* 安装 + +```bash +npm i react-router-dom@6 +``` + +* 导入 + +```jsx +import ReactDOM from "react-dom/client"; +import { BrowserRouter } from "react-router-dom"; +import App from "./App"; + +const root = ReactDOM.createRoot( + document.getElementById("root") +); +root.render( + + + +); +``` + +* 简单链接 + +```jsx +import { Link } from "react-router-dom"; + +export default function App() { + return ( +
      +

      Bookkeeper

      + +
      + ); +} +``` + +Link正在更改URL而不会导致整个页面重新加载。 + +* 链接点 + +```jsx +import ReactDOM from "react-dom/client"; +import { + BrowserRouter, + Routes, + Route, +} from "react-router-dom"; +import App from "./App"; +import Expenses from "./routes/expenses"; +import Invoices from "./routes/invoices"; + +const root = ReactDOM.createRoot( + document.getElementById("root") +); +root.render( + + + } /> + } /> + } /> + + +); +``` + +* 嵌套路由 + +```jsx +root.render( + + + }> + } /> + } /> + + + +); +``` + +* 找不到的页面 + +```jsx + + }> + } /> + } /> + +

      There's nothing here!

      + + } + /> +
      +
      +``` + +* 传参 + +``` + + +let params = useParams(); +let invoice = getInvoice(parseInt(params.invoiceId, 10)); +``` + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/React.dirname b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/React.dirname new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/React深入学习.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/React深入学习.md new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/.gitignore b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/index.html b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/index.html new file mode 100644 index 0000000..79c4701 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
      + + + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/package.json b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/package.json new file mode 100644 index 0000000..d5080f7 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/package.json @@ -0,0 +1,22 @@ +{ + "name": "demo-redux", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "start": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.0.17", + "@types/react-dom": "^18.0.6", + "@vitejs/plugin-react": "^2.1.0", + "vite": "^3.1.0" + } +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/pnpm-lock.yaml b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/pnpm-lock.yaml new file mode 100644 index 0000000..8d78dac --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/pnpm-lock.yaml @@ -0,0 +1,883 @@ +lockfileVersion: 5.4 + +specifiers: + '@types/react': ^18.0.17 + '@types/react-dom': ^18.0.6 + '@vitejs/plugin-react': ^2.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + vite: ^3.1.0 + +dependencies: + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + +devDependencies: + '@types/react': 18.0.21 + '@types/react-dom': 18.0.6 + '@vitejs/plugin-react': 2.1.0_vite@3.1.8 + vite: 3.1.8 + +packages: + + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/compat-data/7.19.4: + resolution: {integrity: sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.19.3: + resolution: {integrity: sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.19.5 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helpers': 7.19.4 + '@babel/parser': 7.19.4 + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.4 + '@babel/types': 7.19.4 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.19.5: + resolution: {integrity: sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure/7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-compilation-targets/7.19.3_@babel+core@7.19.3: + resolution: {integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.19.4 + '@babel/core': 7.19.3 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + semver: 6.3.0 + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name/7.19.0: + resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-module-transforms/7.19.0: + resolution: {integrity: sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.19.4 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.4 + '@babel/types': 7.19.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils/7.19.0: + resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access/7.19.4: + resolution: {integrity: sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers/7.19.4: + resolution: {integrity: sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.4 + '@babel/types': 7.19.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser/7.19.4: + resolution: {integrity: sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.19.3: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.19.3: + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.3 + dev: true + + /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.19.3: + resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx-source/7.18.6_@babel+core@7.19.3: + resolution: {integrity: sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.19.3: + resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.19.3 + '@babel/types': 7.19.4 + dev: true + + /@babel/template/7.18.10: + resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.19.4 + '@babel/types': 7.19.4 + dev: true + + /@babel/traverse/7.19.4: + resolution: {integrity: sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.19.5 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.19.4 + '@babel/types': 7.19.4 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.19.4: + resolution: {integrity: sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: true + + /@esbuild/android-arm/0.15.11: + resolution: {integrity: sha512-PzMcQLazLBkwDEkrNPi9AbjFt6+3I7HKbiYF2XtWQ7wItrHvEOeO3T8Am434zAozWtVP7lrTue1bEfc2nYWeCA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.15.11: + resolution: {integrity: sha512-geWp637tUhNmhL3Xgy4Bj703yXB9dqiLJe05lCUfjSFDrQf9C/8pArusyPUbUbPwlC/EAUjBw32sxuIl/11dZw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@types/prop-types/15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: true + + /@types/react-dom/18.0.6: + resolution: {integrity: sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==} + dependencies: + '@types/react': 18.0.21 + dev: true + + /@types/react/18.0.21: + resolution: {integrity: sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.1.1 + dev: true + + /@types/scheduler/0.16.2: + resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + dev: true + + /@vitejs/plugin-react/2.1.0_vite@3.1.8: + resolution: {integrity: sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + dependencies: + '@babel/core': 7.19.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.3 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.19.3 + '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.19.3 + '@babel/plugin-transform-react-jsx-source': 7.18.6_@babel+core@7.19.3 + magic-string: 0.26.7 + react-refresh: 0.14.0 + vite: 3.1.8 + transitivePeerDependencies: + - supports-color + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /browserslist/4.21.4: + resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001421 + electron-to-chromium: 1.4.284 + node-releases: 2.0.6 + update-browserslist-db: 1.0.10_browserslist@4.21.4 + dev: true + + /caniuse-lite/1.0.30001421: + resolution: {integrity: sha512-Sw4eLbgUJAEhjLs1Fa+mk45sidp1wRn5y6GtDpHGBaNJ9OCDJaVh2tIaWWUnGfuXfKf1JCBaIarak3FkVAvEeA==} + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /csstype/3.1.1: + resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /electron-to-chromium/1.4.284: + resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} + dev: true + + /esbuild-android-64/0.15.11: + resolution: {integrity: sha512-rrwoXEiuI1kaw4k475NJpexs8GfJqQUKcD08VR8sKHmuW9RUuTR2VxcupVvHdiGh9ihxL9m3lpqB1kju92Ialw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64/0.15.11: + resolution: {integrity: sha512-/hDubOg7BHOhUUsT8KUIU7GfZm5bihqssvqK5PfO4apag7YuObZRZSzViyEKcFn2tPeHx7RKbSBXvAopSHDZJQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64/0.15.11: + resolution: {integrity: sha512-1DqHD0ms3AhiwkKnjRUzmiW7JnaJJr5FKrPiR7xuyMwnjDqvNWDdMq4rKSD9OC0piFNK6n0LghsglNMe2MwJtA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64/0.15.11: + resolution: {integrity: sha512-OMzhxSbS0lwwrW40HHjRCeVIJTURdXFA8c3GU30MlHKuPCcvWNUIKVucVBtNpJySXmbkQMDJdJNrXzNDyvoqvQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64/0.15.11: + resolution: {integrity: sha512-8dKP26r0/Qyez8nTCwpq60QbuYKOeBygdgOAWGCRalunyeqWRoSZj9TQjPDnTTI9joxd3QYw3UhVZTKxO9QdRg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64/0.15.11: + resolution: {integrity: sha512-aSGiODiukLGGnSg/O9+cGO2QxEacrdCtCawehkWYTt5VX1ni2b9KoxpHCT9h9Y6wGqNHmXFnB47RRJ8BIqZgmQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32/0.15.11: + resolution: {integrity: sha512-lsrAfdyJBGx+6aHIQmgqUonEzKYeBnyfJPkT6N2dOf1RoXYYV1BkWB6G02tjsrz1d5wZzaTc3cF+TKmuTo/ZwA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64/0.15.11: + resolution: {integrity: sha512-Y2Rh+PcyVhQqXKBTacPCltINN3uIw2xC+dsvLANJ1SpK5NJUtxv8+rqWpjmBgaNWKQT1/uGpMmA9olALy9PLVA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm/0.15.11: + resolution: {integrity: sha512-TJllTVk5aSyqPFvvcHTvf6Wu1ZKhWpJ/qNmZO8LL/XeB+LXCclm7HQHNEIz6MT7IX8PmlC1BZYrOiw2sXSB95A==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64/0.15.11: + resolution: {integrity: sha512-uhcXiTwTmD4OpxJu3xC5TzAAw6Wzf9O1XGWL448EE9bqGjgV1j+oK3lIHAfsHnuIn8K4nDW8yjX0Sv5S++oRuw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le/0.15.11: + resolution: {integrity: sha512-WD61y/R1M4BLe4gxXRypoQ0Ci+Vjf714QYzcPNkiYv5I8K8WDz2ZR8Bm6cqKxd6rD+e/rZgPDbhQ9PCf7TMHmA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le/0.15.11: + resolution: {integrity: sha512-JVleZS9oPVLTlBhPTWgOwxFWU/wMUdlBwTbGA4GF8c38sLbS13cupj+C8bLq929jU7EMWry4SaL+tKGIaTlqKg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64/0.15.11: + resolution: {integrity: sha512-9aLIalZ2HFHIOZpmVU11sEAS9F8TnHw49daEjcgMpBXHFF57VuT9f9/9LKJhw781Gda0P9jDkuCWJ0tFbErvJw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x/0.15.11: + resolution: {integrity: sha512-sZHtiXXOKsLI3XGBGoYO4qKBzJlb8xNsWmvFiwFMHFzA4AXgDP1KDp7Dawe9C2pavTRBDvl+Ok4n/DHQ59oaTg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64/0.15.11: + resolution: {integrity: sha512-hUC9yN06K9sg7ju4Vgu9ChAPdsEgtcrcLfyNT5IKwKyfpLvKUwCMZSdF+gRD3WpyZelgTQfJ+pDx5XFbXTlB0A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64/0.15.11: + resolution: {integrity: sha512-0bBo9SQR4t66Wd91LGMAqmWorzO0TTzVjYiifwoFtel8luFeXuPThQnEm5ztN4g0fnvcp7AnUPPzS/Depf17wQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64/0.15.11: + resolution: {integrity: sha512-EuBdTGlsMTjEl1sQnBX2jfygy7iR6CKfvOzi+gEOfhDqbHXsmY1dcpbVtcwHAg9/2yUZSfMJHMAgf1z8M4yyyw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32/0.15.11: + resolution: {integrity: sha512-O0/Wo1Wk6dc0rZSxkvGpmTNIycEznHmkObTFz2VHBhjPsO4ZpCgfGxNkCpz4AdAIeMczpTXt/8d5vdJNKEGC+Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64/0.15.11: + resolution: {integrity: sha512-x977Q4HhNjnHx00b4XLAnTtj5vfbdEvkxaQwC1Zh5AN8g5EX+izgZ6e5QgqJgpzyRNJqh4hkgIJF1pyy1be0mQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64/0.15.11: + resolution: {integrity: sha512-VwUHFACuBahrvntdcMKZteUZ9HaYrBRODoKe4tIWxguQRvvYoYb7iu5LrcRS/FQx8KPZNaa72zuqwVtHeXsITw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.15.11: + resolution: {integrity: sha512-OgHGuhlfZ//mToxjte1D5iiiQgWfJ2GByVMwEC/IuoXsBGkuyK1+KrjYu0laSpnN/L1UmLUCv0s25vObdc1bVg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.15.11 + '@esbuild/linux-loong64': 0.15.11 + esbuild-android-64: 0.15.11 + esbuild-android-arm64: 0.15.11 + esbuild-darwin-64: 0.15.11 + esbuild-darwin-arm64: 0.15.11 + esbuild-freebsd-64: 0.15.11 + esbuild-freebsd-arm64: 0.15.11 + esbuild-linux-32: 0.15.11 + esbuild-linux-64: 0.15.11 + esbuild-linux-arm: 0.15.11 + esbuild-linux-arm64: 0.15.11 + esbuild-linux-mips64le: 0.15.11 + esbuild-linux-ppc64le: 0.15.11 + esbuild-linux-riscv64: 0.15.11 + esbuild-linux-s390x: 0.15.11 + esbuild-netbsd-64: 0.15.11 + esbuild-openbsd-64: 0.15.11 + esbuild-sunos-64: 0.15.11 + esbuild-windows-32: 0.15.11 + esbuild-windows-64: 0.15.11 + esbuild-windows-arm64: 0.15.11 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /is-core-module/2.10.0: + resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} + dependencies: + has: 1.0.3 + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /magic-string/0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /postcss/8.4.18: + resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /react-dom/18.2.0_react@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-refresh/0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react/18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.10.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /rollup/2.78.1: + resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /scheduler/0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /update-browserslist-db/1.0.10_browserslist@4.21.4: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.4 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /vite/3.1.8: + resolution: {integrity: sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + less: '*' + sass: '*' + stylus: '*' + terser: ^5.4.0 + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.15.11 + postcss: 8.4.18 + resolve: 1.22.1 + rollup: 2.78.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/public/vite.svg b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/api/index.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/api/index.js new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/assets/index.css b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/assets/index.css new file mode 100644 index 0000000..917888c --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/assets/index.css @@ -0,0 +1,70 @@ +:root { + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/assets/react.svg b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/components/index.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/components/index.js new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/main.jsx b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/main.jsx new file mode 100644 index 0000000..ff2783c --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/main.jsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from '@/pages/App' +import '@/assets/index.css' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + +) diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/pages/App/index.jsx b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/pages/App/index.jsx new file mode 100644 index 0000000..904f38f --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/pages/App/index.jsx @@ -0,0 +1,6 @@ + +export default function App(){ + return( +
      App
      + ) +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/routers/index.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/routers/index.js new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/store/constants.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/store/constants.js new file mode 100644 index 0000000..c78b88c --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/store/constants.js @@ -0,0 +1,6 @@ +/* + 该模块用于定义action对象中type类型的常量值 +*/ + +export const INCREMENT = 'increment' +export const DECREMENT = 'decrement' diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/store/index.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/store/index.js new file mode 100644 index 0000000..879a590 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/store/index.js @@ -0,0 +1,6 @@ +// 引入createStore方法,创建redux中最为核心的Store对象 +import {createStore} from 'redux' +// 引入reducer +import myReducer from './reducer' +// 暴露store +export default createStore(myReducer) diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/store/reducer.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/store/reducer.js new file mode 100644 index 0000000..ce9c1d9 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/store/reducer.js @@ -0,0 +1,19 @@ +/* + 1. 该文件用于创建一个为XXX组件服务的reducer,reducer的本质是一个函数 + 2. reducer函数会接收到俩个参数,分别是:之前的状态(preState),动作对象(action) +*/ +import { INCREMENT,DECREMENT } from "./constants" // 引入常量 +const initState = 0 // 初始化数据 +export default function Reducer(preStete = initState,action) { + // 从动作(action)对象里面取出要干嘛,以及这件事的数据 + const {type,data} = action + // 根据type决定如何加工数据 + switch(type){ + case INCREMENT: + return preStete + data + case DECREMENT: + return preStete - data + default: + return preStete + } +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/store/userStore.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/store/userStore.js new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/utils/index.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/src/utils/index.js new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/vite.config.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/vite.config.js new file mode 100644 index 0000000..fc3a945 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/Redux/demo-redux/vite.config.js @@ -0,0 +1,13 @@ +import {defineConfig} from 'vite' +import react from '@vitejs/plugin-react' +import path from 'path' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + } + }, +}) diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/.gitignore b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/index.html b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/index.html new file mode 100644 index 0000000..25e8fad --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
      + + + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/package.json b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/package.json new file mode 100644 index 0000000..16ea841 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/package.json @@ -0,0 +1,23 @@ +{ + "name": "components", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "start": "vite --port=3000", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.55.0" + }, + "devDependencies": { + "@types/react": "^18.0.17", + "@types/react-dom": "^18.0.6", + "@vitejs/plugin-react": "^2.1.0", + "vite": "^3.1.0" + } +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/pnpm-lock.yaml b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/pnpm-lock.yaml new file mode 100644 index 0000000..1c4b6f4 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/pnpm-lock.yaml @@ -0,0 +1,979 @@ +lockfileVersion: 5.4 + +specifiers: + '@types/react': ^18.0.17 + '@types/react-dom': ^18.0.6 + '@vitejs/plugin-react': ^2.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.55.0 + vite: ^3.1.0 + +dependencies: + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + sass: 1.55.0 + +devDependencies: + '@types/react': 18.0.21 + '@types/react-dom': 18.0.6 + '@vitejs/plugin-react': 2.1.0_vite@3.1.8 + vite: 3.1.8_sass@1.55.0 + +packages: + + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/compat-data/7.19.4: + resolution: {integrity: sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.19.3: + resolution: {integrity: sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.19.5 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helpers': 7.19.4 + '@babel/parser': 7.19.4 + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.4 + '@babel/types': 7.19.4 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.19.5: + resolution: {integrity: sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure/7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-compilation-targets/7.19.3_@babel+core@7.19.3: + resolution: {integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.19.4 + '@babel/core': 7.19.3 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + semver: 6.3.0 + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name/7.19.0: + resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-module-transforms/7.19.0: + resolution: {integrity: sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.19.4 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.4 + '@babel/types': 7.19.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils/7.19.0: + resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access/7.19.4: + resolution: {integrity: sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers/7.19.4: + resolution: {integrity: sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.4 + '@babel/types': 7.19.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser/7.19.4: + resolution: {integrity: sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.19.3: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.19.3: + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.3 + dev: true + + /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.19.3: + resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx-source/7.18.6_@babel+core@7.19.3: + resolution: {integrity: sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.19.3: + resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.19.3 + '@babel/types': 7.19.4 + dev: true + + /@babel/template/7.18.10: + resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.19.4 + '@babel/types': 7.19.4 + dev: true + + /@babel/traverse/7.19.4: + resolution: {integrity: sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.19.5 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.19.4 + '@babel/types': 7.19.4 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.19.4: + resolution: {integrity: sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: true + + /@esbuild/android-arm/0.15.11: + resolution: {integrity: sha512-PzMcQLazLBkwDEkrNPi9AbjFt6+3I7HKbiYF2XtWQ7wItrHvEOeO3T8Am434zAozWtVP7lrTue1bEfc2nYWeCA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.15.11: + resolution: {integrity: sha512-geWp637tUhNmhL3Xgy4Bj703yXB9dqiLJe05lCUfjSFDrQf9C/8pArusyPUbUbPwlC/EAUjBw32sxuIl/11dZw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@types/prop-types/15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: true + + /@types/react-dom/18.0.6: + resolution: {integrity: sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==} + dependencies: + '@types/react': 18.0.21 + dev: true + + /@types/react/18.0.21: + resolution: {integrity: sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.1.1 + dev: true + + /@types/scheduler/0.16.2: + resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + dev: true + + /@vitejs/plugin-react/2.1.0_vite@3.1.8: + resolution: {integrity: sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + dependencies: + '@babel/core': 7.19.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.3 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.19.3 + '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.19.3 + '@babel/plugin-transform-react-jsx-source': 7.18.6_@babel+core@7.19.3 + magic-string: 0.26.7 + react-refresh: 0.14.0 + vite: 3.1.8_sass@1.55.0 + transitivePeerDependencies: + - supports-color + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browserslist/4.21.4: + resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001421 + electron-to-chromium: 1.4.284 + node-releases: 2.0.6 + update-browserslist-db: 1.0.10_browserslist@4.21.4 + dev: true + + /caniuse-lite/1.0.30001421: + resolution: {integrity: sha512-Sw4eLbgUJAEhjLs1Fa+mk45sidp1wRn5y6GtDpHGBaNJ9OCDJaVh2tIaWWUnGfuXfKf1JCBaIarak3FkVAvEeA==} + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /csstype/3.1.1: + resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /electron-to-chromium/1.4.284: + resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} + dev: true + + /esbuild-android-64/0.15.11: + resolution: {integrity: sha512-rrwoXEiuI1kaw4k475NJpexs8GfJqQUKcD08VR8sKHmuW9RUuTR2VxcupVvHdiGh9ihxL9m3lpqB1kju92Ialw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64/0.15.11: + resolution: {integrity: sha512-/hDubOg7BHOhUUsT8KUIU7GfZm5bihqssvqK5PfO4apag7YuObZRZSzViyEKcFn2tPeHx7RKbSBXvAopSHDZJQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64/0.15.11: + resolution: {integrity: sha512-1DqHD0ms3AhiwkKnjRUzmiW7JnaJJr5FKrPiR7xuyMwnjDqvNWDdMq4rKSD9OC0piFNK6n0LghsglNMe2MwJtA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64/0.15.11: + resolution: {integrity: sha512-OMzhxSbS0lwwrW40HHjRCeVIJTURdXFA8c3GU30MlHKuPCcvWNUIKVucVBtNpJySXmbkQMDJdJNrXzNDyvoqvQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64/0.15.11: + resolution: {integrity: sha512-8dKP26r0/Qyez8nTCwpq60QbuYKOeBygdgOAWGCRalunyeqWRoSZj9TQjPDnTTI9joxd3QYw3UhVZTKxO9QdRg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64/0.15.11: + resolution: {integrity: sha512-aSGiODiukLGGnSg/O9+cGO2QxEacrdCtCawehkWYTt5VX1ni2b9KoxpHCT9h9Y6wGqNHmXFnB47RRJ8BIqZgmQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32/0.15.11: + resolution: {integrity: sha512-lsrAfdyJBGx+6aHIQmgqUonEzKYeBnyfJPkT6N2dOf1RoXYYV1BkWB6G02tjsrz1d5wZzaTc3cF+TKmuTo/ZwA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64/0.15.11: + resolution: {integrity: sha512-Y2Rh+PcyVhQqXKBTacPCltINN3uIw2xC+dsvLANJ1SpK5NJUtxv8+rqWpjmBgaNWKQT1/uGpMmA9olALy9PLVA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm/0.15.11: + resolution: {integrity: sha512-TJllTVk5aSyqPFvvcHTvf6Wu1ZKhWpJ/qNmZO8LL/XeB+LXCclm7HQHNEIz6MT7IX8PmlC1BZYrOiw2sXSB95A==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64/0.15.11: + resolution: {integrity: sha512-uhcXiTwTmD4OpxJu3xC5TzAAw6Wzf9O1XGWL448EE9bqGjgV1j+oK3lIHAfsHnuIn8K4nDW8yjX0Sv5S++oRuw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le/0.15.11: + resolution: {integrity: sha512-WD61y/R1M4BLe4gxXRypoQ0Ci+Vjf714QYzcPNkiYv5I8K8WDz2ZR8Bm6cqKxd6rD+e/rZgPDbhQ9PCf7TMHmA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le/0.15.11: + resolution: {integrity: sha512-JVleZS9oPVLTlBhPTWgOwxFWU/wMUdlBwTbGA4GF8c38sLbS13cupj+C8bLq929jU7EMWry4SaL+tKGIaTlqKg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64/0.15.11: + resolution: {integrity: sha512-9aLIalZ2HFHIOZpmVU11sEAS9F8TnHw49daEjcgMpBXHFF57VuT9f9/9LKJhw781Gda0P9jDkuCWJ0tFbErvJw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x/0.15.11: + resolution: {integrity: sha512-sZHtiXXOKsLI3XGBGoYO4qKBzJlb8xNsWmvFiwFMHFzA4AXgDP1KDp7Dawe9C2pavTRBDvl+Ok4n/DHQ59oaTg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64/0.15.11: + resolution: {integrity: sha512-hUC9yN06K9sg7ju4Vgu9ChAPdsEgtcrcLfyNT5IKwKyfpLvKUwCMZSdF+gRD3WpyZelgTQfJ+pDx5XFbXTlB0A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64/0.15.11: + resolution: {integrity: sha512-0bBo9SQR4t66Wd91LGMAqmWorzO0TTzVjYiifwoFtel8luFeXuPThQnEm5ztN4g0fnvcp7AnUPPzS/Depf17wQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64/0.15.11: + resolution: {integrity: sha512-EuBdTGlsMTjEl1sQnBX2jfygy7iR6CKfvOzi+gEOfhDqbHXsmY1dcpbVtcwHAg9/2yUZSfMJHMAgf1z8M4yyyw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32/0.15.11: + resolution: {integrity: sha512-O0/Wo1Wk6dc0rZSxkvGpmTNIycEznHmkObTFz2VHBhjPsO4ZpCgfGxNkCpz4AdAIeMczpTXt/8d5vdJNKEGC+Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64/0.15.11: + resolution: {integrity: sha512-x977Q4HhNjnHx00b4XLAnTtj5vfbdEvkxaQwC1Zh5AN8g5EX+izgZ6e5QgqJgpzyRNJqh4hkgIJF1pyy1be0mQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64/0.15.11: + resolution: {integrity: sha512-VwUHFACuBahrvntdcMKZteUZ9HaYrBRODoKe4tIWxguQRvvYoYb7iu5LrcRS/FQx8KPZNaa72zuqwVtHeXsITw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.15.11: + resolution: {integrity: sha512-OgHGuhlfZ//mToxjte1D5iiiQgWfJ2GByVMwEC/IuoXsBGkuyK1+KrjYu0laSpnN/L1UmLUCv0s25vObdc1bVg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.15.11 + '@esbuild/linux-loong64': 0.15.11 + esbuild-android-64: 0.15.11 + esbuild-android-arm64: 0.15.11 + esbuild-darwin-64: 0.15.11 + esbuild-darwin-arm64: 0.15.11 + esbuild-freebsd-64: 0.15.11 + esbuild-freebsd-arm64: 0.15.11 + esbuild-linux-32: 0.15.11 + esbuild-linux-64: 0.15.11 + esbuild-linux-arm: 0.15.11 + esbuild-linux-arm64: 0.15.11 + esbuild-linux-mips64le: 0.15.11 + esbuild-linux-ppc64le: 0.15.11 + esbuild-linux-riscv64: 0.15.11 + esbuild-linux-s390x: 0.15.11 + esbuild-netbsd-64: 0.15.11 + esbuild-openbsd-64: 0.15.11 + esbuild-sunos-64: 0.15.11 + esbuild-windows-32: 0.15.11 + esbuild-windows-64: 0.15.11 + esbuild-windows-arm64: 0.15.11 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /immutable/4.1.0: + resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-core-module/2.10.0: + resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /magic-string/0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /postcss/8.4.18: + resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /react-dom/18.2.0_react@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-refresh/0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react/18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.10.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /rollup/2.78.1: + resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /sass/1.55.0: + resolution: {integrity: sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.1.0 + source-map-js: 1.0.2 + + /scheduler/0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /update-browserslist-db/1.0.10_browserslist@4.21.4: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.4 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /vite/3.1.8_sass@1.55.0: + resolution: {integrity: sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + less: '*' + sass: '*' + stylus: '*' + terser: ^5.4.0 + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.15.11 + postcss: 8.4.18 + resolve: 1.22.1 + rollup: 2.78.1 + sass: 1.55.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/public/vite.svg b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/assets/index.css b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/assets/index.css new file mode 100644 index 0000000..0a0bbbb --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/assets/index.css @@ -0,0 +1,106 @@ +:root { + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +html,body{ + height: 100% !important; + width: 100% !important; + overflow: hidden; +} +#root{ + height: 100%; + width: 100%; + overflow: overlay; +} + +body { + margin: 0; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} +#modalRoot{ + position: absolute; + height: 100%; + width: 100%; + overflow: hidden; + top:0; + left: 0; + align-items: center; + justify-content: center; + display: none; + backdrop-filter: blur(50px); + animation: modalRootShow ease-in-out 500ms forwards; +} +@keyframes modalRootShow { + from{ + background: #33333300; + } + to{ + background: #66666633; + } +} +@keyframes modalRootHide { + from{ + background: #33333333; + } + to{ + background: #66666600; + } +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/assets/react.svg b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Button/index.jsx b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Button/index.jsx new file mode 100644 index 0000000..7c84ac8 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Button/index.jsx @@ -0,0 +1,56 @@ +import BPEMR from './index.module.scss' +import {useState, useEffect} from "react"; + +export default function Button(props) { + // console.log(props) + + const [size, setSize] = useState(props.size) + const [type, setType] = useState(props.type) + const [loading, setLoading] = useState(props.loading) + const [disable, setDisable] = useState(props.disable) + + useEffect(() => { + setSize(props.size ? props.size : 'default') + setType(props.type ? props.type : 'default') + setLoading(props.loading ? BPEMR.loading : '') + setDisable(props.disable ? BPEMR.disable : '') + }, [props.size, props.type]) + + const sizeOp = { + default: BPEMR.defaultsize, + undersize: BPEMR.undersize, + oversize: BPEMR.oversize, + } + const typeOp = { + default: BPEMR.defaultColor, + + error: BPEMR.eColor, + error2: BPEMR.e2Color, + error3: BPEMR.e3Color, + + success: BPEMR.sColor, + success2: BPEMR.s3Color, + success3: BPEMR.s2Color, + + warning: BPEMR.wColor, + warning1: BPEMR.w2Color, + warning3: BPEMR.w3Color, + } + + const classname = [BPEMR.BPEMR_button, loading, disable, sizeOp[size], typeOp[type]].join(' ') + // console.log(classname) + if (props.onClick && typeof props.onClick === 'function') { + + } else { + if (props.onClick) { + throw new Error('onClick必须位函数') + } + } + + return ( +
      +
      { + }}>{props.children}
      +
      + ) +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Button/index.module.scss b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Button/index.module.scss new file mode 100644 index 0000000..47ddf22 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Button/index.module.scss @@ -0,0 +1,162 @@ +.BPEMR_button_box{ + position: relative; + width: fit-content; + width: -webkit-fit-content; + width: -moz-fit-content; + padding: 5px 0; +} +.BPEMR_button { + position: relative; + width: fit-content; + width: -webkit-fit-content; + width: -moz-fit-content; + line-height: 2em; + padding: 0 1em; + margin: 0.5em 0; + user-select: none; + cursor: pointer; + border-radius: 5px; + transition: all ease-in-out 200ms; + color: #fefefe; +} +.BPEMR_button.loading{ + $jump : jump; + animation: jump .4s ease-in-out infinite alternate; + @keyframes jump { + 0%{top:0px} + 33%{top:-2px} + 66%{top:-8px} + 100%{top:-10px} + } + &{ + box-shadow: 0 5px 20px -10px #33333399; + } +} +.BPEMR_button.disable{ + cursor: no-drop; + &:hover{ + box-shadow: none !important; + } +} + +.BPEMR_button.defaultsize { + font-size: 1rem; + + &:hover { + box-shadow: 0px 0 5px 0px #33333399; + } +} + +.BPEMR_button.oversize { + font-size: 1.2rem; + + &:hover { + box-shadow: 0px 0 7px 0px #33333399; + } +} + +.BPEMR_button.undersize { + font-size: 0.8rem; + + &:hover { + box-shadow: 0px 0 3px 1px #99999999; + } +} + + +.BPEMR_button.defaultColor { + color: #222831; + background: #fefefe; + border: 1px solid #bcbcbc; + + &:active { + background: #fff !important; + } +} + +.BPEMR_button.eColor { + background: #E84545; + background: #ff4d4f; + border: 1px solid #ff4d4f; + + &:active { + background: #ff4d4fcc !important; + border: 1px solid #ff4d4fcc !important; + } +} + +.BPEMR_button.e2Color { + background: #F6416C; + border: 1px solid #F6416C; + &:active { + background: #F6416Ccc !important; + border: 1px solid #F6416Ccc !important; + } +} + +.BPEMR_button.e3Color { + background: #FF165D; + border: 1px solid #FF165D; + &:active { + background: #E84545ee !important; + border: 1px solid #E84545cc !important; + } +} + +.BPEMR_button.sColor { + background: #17B978; + border: 1px solid #17B978; + &:active { + background: #17B978cc !important; + border: 1px solid #17B978cc !important; + } +} + +.BPEMR_button.s2Color { + background: #3EC1D3; + border: 1px solid #3EC1D3; + &:active { + background: #3EC1D3cc !important; + border: 1px solid #3EC1D3cc !important; + } +} + +.BPEMR_button.s3Color { + background: #00ADB5; + border: 1px solid #00ADB5; + &:active { + background: #00ADB5cc !important; + border: 1px solid #00ADB5cc !important; + } +} + +.BPEMR_button.wColor { + background: #FF9A00; + border: 1px solid #FF9A00; + &:active { + background: #FF9A00cc !important; + border: 1px solid #FF9A00cc !important; + } +} + +.BPEMR_button.w2Color { + background: #FF6F3C; + border: 1px solid #FF6F3C; + &:active { + background: #FF6F3Ccc !important; + border: 1px solid #FF6F3Ccc !important; + } +} + +.BPEMR_button.w3Color { + background: #FFC93C; + border: 1px solid #FFC93C; + &:active { + background: #FFC93Ccc !important; + border: 1px solid #FFC93Ccc !important; + } +} + + + + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Modal/close.svg b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Modal/close.svg new file mode 100644 index 0000000..d2ebbf8 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Modal/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Modal/index.jsx b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Modal/index.jsx new file mode 100644 index 0000000..ad106b4 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Modal/index.jsx @@ -0,0 +1,68 @@ +import React, { useEffect, useState } from "react"; +import { createPortal } from "react-dom"; +import BPEMR from './index.module.scss'; +import closeSvg from './close.svg' + +export default function Dialog(props){ + const modalRoot = document.body.querySelector('#modalRoot') + let node = window.document.createElement("div"); + if(modalRoot){ + node = modalRoot; + }else{ + node.id='modalRoot' + window.document.body.appendChild(node) + } + + const [state, setState] = useState(props.state) + if(typeof props.width === 'number' || Number(props.width) != 'NaN'){ + + }else{ + throw new Error('width必须为数字') + } + const [width, setWidth] = useState(Number(props.width)) + + const [temCloseAnimation, settemCloseAnimation] = useState(BPEMR.temModalShow) + + useEffect(() => { + setState(props.state) + setWidth(props.width) + if(state){ + modalRoot.style.animation = '' + modalRoot.style.display = 'flex' + }else{ + modalRoot.style.display = 'none' + settemCloseAnimation(BPEMR.temModalShow) + } + }) + + useEffect(() => { + modalRoot.style.animation = 'modalRootHide ease-in-out 500ms forwards' + },[temCloseAnimation]) + + + + if(!props.close){ + throw new Error('缺少弹窗关闭参数。') + }else if(typeof props.close != 'function'){ + throw new Error('弹窗必须返回关闭程序。') + } + + + + function close(){ + settemCloseAnimation(BPEMR.temModalHide) + setTimeout(() => { + props.close(false) + }, 500) + } + + const className = [BPEMR.BPEMR_Dialog_Tem, temCloseAnimation].join(' ') + + return createPortal( +
      +
      +
      {props.children}
      +
      , + node + ); +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Modal/index.module.scss b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Modal/index.module.scss new file mode 100644 index 0000000..692e7a6 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/components/Modal/index.module.scss @@ -0,0 +1,64 @@ + +$modalShow:modalShow; +$modalHide:modalHide; + +.BPEMR_Dialog_Tem{ + position:relative; + background: #fefefe; + min-width: 10em !important; + max-width: 90vw !important; + border-radius: 5px; + padding: 1.5em; + box-sizing: border-box; + overflow: overlay; + & > .close{ + position: absolute; + top:0.5em; + right: 0.5em; + width: 1.5em; + height: 1.5em; + border-radius: 1.5em; + cursor: pointer; + box-shadow: 0px 1px 10px -1px #33333333; + transition: box-shadow ease-in-out 300ms; + & > img { + height: 1.5em; + } + &:hover{ + box-shadow: 1px 1px 10px -3px #333; + } + } +} +.temModalShow{ + animation: modalShow ease-in-out 300ms forwards; +} +.temModalHide{ + animation: modalHide ease-in-out 300ms forwards; +} + +@keyframes modalShow { + 0%{ + transform: scale(0.3); + box-shadow: 5px 10px 30px -10px #33333300; + } + 80%{ + transform: scale(1.1); + } + 100%{ + transform: scale(1); + box-shadow: 5px 10px 30px -10px #333333aa; + } +} +@keyframes modalHide { + 0%{ + transform: scale(1); + box-shadow: 5px 10px 30px -10px #333333aa; + } + 20%{ + transform: scale(1.1); + } + 100%{ + transform: scale(0); + box-shadow: 5px 10px 30px -10px #33333300; + } +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/main.jsx b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/main.jsx new file mode 100644 index 0000000..870ef4a --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/main.jsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './pages/App' +import './assets/index.css' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + +) diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/pages/App/index.jsx b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/pages/App/index.jsx new file mode 100644 index 0000000..8fa7525 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/src/pages/App/index.jsx @@ -0,0 +1,60 @@ +import Button from "../../components/Button"; +import Modal from "../../components/Modal"; +import {useState} from "react"; + +export default function App() { + const [dialog0, setDialog0] = useState(false) + return ( +
      +

      Button组件

      +
      +
      +

      大小

      + + + +
      +
      +

      颜色

      +

      错误

      + + +
      +
      +

      成功

      + + +
      +
      +

      警告

      + + +
      +

      事务

      +
      +

      正常

      + +

      失效

      + +

      加载

      + +
      + +
      +

      Dialog

      + +
      + + 你好 +
      + + +
      + ) +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/vite.config.js b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/vite.config.js new file mode 100644 index 0000000..b1b5f91 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A2-前端知识/React/components/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()] +}) diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A3-GoLang/Golang.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A3-GoLang/Golang.md new file mode 100644 index 0000000..b8d5974 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A3-GoLang/Golang.md @@ -0,0 +1,29 @@ +# 一、语言基础 + +## 1. 注释 + +### 1.1 单行注释 + +```go +// 单行注释 +``` + +### 1.2 多行注释 + +```go +/** +多行注释 +/ +``` + +## 2. 基本数据类型 + +## 3. 复和数据类型 + +## 4. 函数 + +## 5. 方法 + +## 6. 接口 + +## 7. 包和工具 \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A9-Databases/MongoDB/MongoDB官网版.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A9-Databases/MongoDB/MongoDB官网版.md new file mode 100644 index 0000000..8e9e0bd --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-A9-Databases/MongoDB/MongoDB官网版.md @@ -0,0 +1,224 @@ +> [Getting Started — MongoDB Manual](https://www.mongodb.com/docs/manual/tutorial/getting-started/) + +> 版本 6.0 + + +# 开始 + +## 1. 切换数据库 + +- 查看当前数据库 + +```bash +$ db +# 默认为test +``` + +- 切换创建数据库 + - 切换数据库如果不存在就创建,但是不会显示,除非给里面插入至少一条数据 + +```bash +$ use databaseName +``` + +## 2. 插入 + +- 在集合movies插入数据,会创建集合*movies* + - `db.movies.insertMany()` + +```bash +db.movies.insertMany([ + { + title: 'Titanic', + year: 1997, + genres: [ 'Drama', 'Romance' ], + rated: 'PG-13', + languages: [ 'English', 'French', 'German', 'Swedish', 'Italian', 'Russian' ], + released: ISODate("1997-12-19T00:00:00.000Z"), + awards: { + wins: 127, + nominations: 63, + text: 'Won 11 Oscars. Another 116 wins & 63 nominations.' + }, + cast: [ 'Leonardo DiCaprio', 'Kate Winslet', 'Billy Zane', 'Kathy Bates' ], + directors: [ 'James Cameron' ] + }, + { + title: 'The Dark Knight', + year: 2008, + genres: [ 'Action', 'Crime', 'Drama' ], + rated: 'PG-13', + languages: [ 'English', 'Mandarin' ], + released: ISODate("2008-07-18T00:00:00.000Z"), + awards: { + wins: 144, + nominations: 106, + text: 'Won 2 Oscars. Another 142 wins & 106 nominations.' + }, + cast: [ 'Christian Bale', 'Heath Ledger', 'Aaron Eckhart', 'Michael Caine' ], + directors: [ 'Christopher Nolan' ] + }, + { + title: 'Spirited Away', + year: 2001, + genres: [ 'Animation', 'Adventure', 'Family' ], + rated: 'PG', + languages: [ 'Japanese' ], + released: ISODate("2003-03-28T00:00:00.000Z"), + awards: { + wins: 52, + nominations: 22, + text: 'Won 1 Oscar. Another 51 wins & 22 nominations.' + }, + cast: [ 'Rumi Hiiragi', 'Miyu Irino', 'Mari Natsuki', 'Takashi Naitè' ], + directors: [ 'Hayao Miyazaki' ] + }, + { + title: 'Casablanca', + genres: [ 'Drama', 'Romance', 'War' ], + rated: 'PG', + cast: [ 'Humphrey Bogart', 'Ingrid Bergman', 'Paul Henreid', 'Claude Rains' ], + languages: [ 'English', 'French', 'German', 'Italian' ], + released: ISODate("1943-01-23T00:00:00.000Z"), + directors: [ 'Michael Curtiz' ], + awards: { + wins: 9, + nominations: 6, + text: 'Won 3 Oscars. Another 6 wins & 6 nominations.' + }, + lastupdated: '2015-09-04 00:22:54.600000000', + year: 1942 + } +]) + +{ + acknowledged: true, + insertedIds: { + '0': ObjectId("64059011a1367911c5f03839"), + '1': ObjectId("64059011a1367911c5f0383a"), + '2': ObjectId("64059011a1367911c5f0383b"), + '3': ObjectId("64059011a1367911c5f0383c") + } +} +``` + +## 3. 查找全部 + +- 在选择的数据库中进行某个集合的查询`db.movies.find( { } )` + +```bash +$ db.expressgy.find() + +{ + _id: ObjectId("64055bb6d44cd6e5278cc4c8"), + name: '何夕' +} +``` + +## 4. 过滤数据 + +- 条件查询 + +### 4.1 属性相等 + +```bash +db.movies.find( { "directors": "Christopher Nolan" } ); +{ + _id: ObjectId("64059011a1367911c5f0383a"), + title: 'The Dark Knight', + year: 2008, + genres: ['Action', 'Crime', 'Drama'], + rated: 'PG-13', + languages: ['English', 'Mandarin'], + released: 2008 - 07 - 18 T00: 00:00.000Z, + awards: + { + wins: 144, + nominations: 106, + text: 'Won 2 Oscars. Another 142 wins & 106 nominations.' + } + , + cast: ['Christian Bale', 'Heath Ledger', 'Aaron Eckhart', 'Michael Caine'], + directors: ['Christopher Nolan'] +} +``` + + +### 4.2 小于 + +```bash +db.movies.find( { "released": { $lt: ISODate("2000-01-01") } } ); +``` + +### 4.3 大于 + +```bash +db.movies.find( { "awards.wins": { $gt: 100 } } ); +``` + +### 4.4 属于 + +```bash +db.movies.find( { "languages": { $in: [ "Japanese", "Mandarin" ] } } ) +``` + +## 查询选择器 + +### 比较 + +有关不同 BSON 类型值的比较,请参阅[指定 BSON 比较顺序。](https://www.mongodb.com/docs/manual/reference/bson-type-comparison-order/#std-label-bson-types-comparison-order) + +`$eq` 匹配等于指定值的值。 + +`$gt` 匹配大于指定值的值。 + +`$gte` 匹配大于或等于指定值的值。 + +`$in` 匹配数组中指定的任何值。 + +`$lt` 匹配小于指定值的值。 + +`$lte` 匹配小于或等于指定值的值。 + +`$ne` 匹配所有不等于指定值的值。 + +`$nin` 与数组中指定的值均不匹配。 + +### 逻辑 + +`$and` 将查询子句与逻辑返回与这两个子句的条件匹配的所有文档联接在一起。`AND` + +`$not` 反转查询表达式的效果,并返回与查询_表达式不匹配的文档_。 + +`$nor` 将查询子句与逻辑联接,返回与这两个子句不匹配的所有文档。`NOR` + +`$or` 将查询子句与逻辑返回与任一子句的条件匹配的所有文档联接在一起。`OR` + +### 元素 + +`$exists` 匹配具有指定字段的文档。 + +`$type` 如果字段为指定类型,则选择文档。 + +### 评估 + +`$expr` 允许在查询语言中使用聚合表达式。 + +`$jsonSchema` 根据给定的 JSON 架构验证文档。 + +`$mod` 对字段的值执行模运算,并选择具有指定结果的文档。 + +`$regex` 选择值与指定正则表达式匹配的文档。 + +`$text`执行文本搜索。 + +`$where` 匹配满足 JavaScript 表达式的文档。 + +## 5. 项目字段 + +- 通过0,1控制查询的字段 + +```bash +db.movies.find( { }, { "title": 1, "directors": 1, "year": 1 } ); +db.movies.find( { }, { "_id": 0, "title": 1, "genres": 1 } ); +``` \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/C++_Primer.md b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/C++_Primer.md new file mode 100644 index 0000000..d9e2a76 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/C++_Primer.md @@ -0,0 +1,3570 @@ +# C++ Primer + +> C++ Primer + + + + + +# 第一部分 开始 + + + +## 第1章 开始 + + + +### 1.1 Hello World + +使用GCC编译器 + +```bash +g++ -o hello_world hello_world.cpp + +Mac上使用c++11标准 +g++ -std=c++11 name name.cpp + +//第一种,直接包含在源程序文件中,如第一行代码所示 +#pragma GCC diagnostic error "-std=c++11" +#include +using namespace std; +int main(int argc,char **argv) +{ + cout<<"hello world!"< + +using namespace std; + +int main(){ + cout << "Hello World!"; + + return 0; +} +``` + + + +编译运行CPP文件 + +```bash +g++ -o 新的可执行文件名 cpp文件名 +``` + + + +### 1.2 IO + +C++语言没有定义任何IO语句,全面的标准库(standard library)来提供这个机制(还有其他设施),--iostream库,分别表示输入流和输出流,一个流就是一个字符序列,随着时间推移,字符是顺序生成和消耗的。 + +##### 标准库的四个IO对象 + +1. cin 标准输入 +2. cout 标准输出 +3. cerr 警告,错误消息(标准错误) +4. clog 运行时的一般信息 + +一个包含输入输出的小函数 + +```c++ +#include + +int main(){ + std::cout << "请输入两个数字" << std::endl; + + int val1=0,val2=0; + std::cin >> val1 >> val2; + std::cout << "数字和为:" << val1+val2 << std::endl; + + return 0; +} + +``` + + + +程序第一行 `#include ` 告诉编辑器我们要用iostream库,尖括号里面指出了一个头文件,#include指令必须和头文件名在同一行中,一般情况下头文件在所有函数之外,所以我们将所有的#include放在文件开头位置。 + + + +* 表达式,语句;由运算对象和运算符组成。 + + + +##### 向流中写入数据 + +`<<` 左侧连接的一定要连接ostream 右边是需要打印的值 ***io.test.cpp验证*** + + + +* 操作符(manipulator):`endl` 意思是结束当前行,**并将设备的缓冲区(buffer)中的内容刷新到设备中。缓冲刷新可以保证目前为止程序所产生的所有输入输出都真正的写入到流中,而不是仅停留在内存中等待写入流。** +* 缓冲区(buffer):一个存储区域,用于保存数据。IO设施通常将输入(或输出)数据保存在一个缓冲区中,读写缓冲区的动作与程序中的动作是无关的。我们可以显式地刷新输出缓冲,以便强制将缓冲区中的数据写入输出设备。默认情况下,读cin会刷新cout;程序非正常终止时也会刷新cout。 + + + +##### 从流中获取数据 + +获取数据前需要先定义变量名 + +`>>` 同输出流一样 + + + +##### 使用标准库的名字 + +namespace :命名空间,避免名字冲突,以及使用库中的相同名字导致冲突。标准库定义的所有名字都在命名空间std中。 + + + +### 1.3 注释 + +主是可以帮助我们理解程序; + +通常用于概述算法,确定变量用途,解释比较难懂的代码段。解释器会忽略注释,因此不会对程序的性能和行为产生影响。 + +* C++的`//`单行注释 +* C 的 `/**/` 多行注释,但是不能嵌套 + + + + + +### 1.4 控制流 + +程序是按照从上倒下一次运行的,控制流语句可以实现复杂的执行路径。 + + + +#### 1.4.1 while语句 + +反复执行一段代码,知道给定条件为假时才停止。 + + + +* 语句块(block): `{}`之间的代码 +* 赋值(assignment): `=` 将右边的值复制到左边 + + + +* 前缀递增运算符`++x` :将运算对象加1 + + + +```c++ +include + +int main(){ + std::cout << "计算1到10的值" << std::endl; + int i=0,sum=0; + while(i<=10){ + sum=sum + i; + i++; + } + std::cout <<"和为:" << sum << std::endl; + + return 0; +} + +``` + + + +**一定要认真,以上代码错了4次** + +```c++ +#include + +int main(){ + std::cout << "请输入两个数,我们将计算他们之间的数字的和,包括他们。"; + int x=0,y=0; + + std::cin >> x >> y; + + int sum=0; +// while(x + +int main(){ + std::cout << "计算0到100的加法." << std::endl; + + int sum=0; + for(int i=0;i<=100;i++){ + sum=sum+i; + std::cout << i << std::endl; + } + std::cout << "和为:" << sum << std::endl; + + return 0; +} + +``` + + + +#### 1.4.3 读取数量不等的输入数据 + +```C++ +#include + +int main(){ + std::cout << "输入数字,求取他们的和" << std::endl; + + int sum=0,x=0; + while(std::cin >> x){ + sum=sum+x; + std::cout << sum << std::endl; + } + + return 0; +} + + +// 此程序会在输入中遇到非int字符时停止因为,循环头条件为假。 + +``` + + + +**编译器常见错误类型** + +* 语法错误(syntax error):出现非法语法,忘记加分号等 +* 类型错误(type error):向int传送字符串 +* 声明错误(declaration error):没有声明变量就使用,标准库名字没加std + +#### 1.4.4 if语句 + +```c++ +#include + +int main(){ + std::cout << "输入数字以运行" << std::endl; + + int val1=0; + + if(std::cin >> val1){ +// 如果输入的是数字将会继续 + int val2=0,ssc=1; + while(std::cin >> val2){ + if(val1==val2){ + ssc++; + std::cout << "这个数字连续出现第" << ssc << std::endl; + }else{ + val1=val2; + ssc=1; + std::cout << "这个数字第一次出现" << std::endl; + } + } + } + + return 0; +} + +``` + + + +### 1.5 类简介 + +使用类就像使用int一样 + + + +#### 1.5.1 Sales_item类 + +```c++ +#include +#include "Sales_item.h" +//导入Sales_item类/库 + +int main(){ + Sales_item book; + std::cin >> book; +// 格式为: xxx-xxx-xxx-xxx int int 即 ISBN 数量 单价 + std::cout << book << std::endl; +// 输出了书的isbn码 书的数量 总价 平均价 + return 0; +} + +``` + +#### 1.5.2 成员函数 + +```c++ +#include +#include "Sales_item.h" + +int main(){ + Sales_item book1,book2; + std::cout << "请输入两个数" << " 格式为 四位isbn号 书数量 书单价" << std::endl; + + std::cin >> book1 >> book2; + if(book1.isbn()==book2.isbn()){ + std::cout << book1+book2 << std::endl; + return 0; + }else{ + std::cout << "两个书的ISBN码不一样,无法相加!" << std::endl; + return -1; + } +} + +``` + + + +### 1.6 书店程序 + +```c++ +#include +#include "Sales_item.h" + +int main(){ + std::cout << "请输入书信息:" << std::endl; + + Sales_item book1,book2; + + if(std::cin >> book1){ + while(std::cin >> book2){ + if(book1.isbn()==book2.isbn()){ + book1 += book2; + }else{ + std::cout << book1 <**意义**以及我们能在数据上执行的操作。 + + + +### 2.1 基本的内置类型 + +* 算数类型:字符,整型,布尔值,浮点型 +* 空类型:空类型不对应具体的值,仅用于一些特殊的场合,例如最常见的是,当函数不返回任何值时使用空类型作为返回类型。 + + + +#### 2.1.1 算数类型 + +整型:字符、布尔值和整数 + +浮点型:有小数部分 + + + +```bash +int 4/Byte +bool 1 +char 1 +wchar_t 4 +char16_t 2 +char32_t 4 +short 2 +long 8 +long long 8 +float 4 +double 8 +long double 16 + +``` + + + +#### 2.1.2 类型转换 + +如果表达式里既有**带符号类型又有无符号**类型,当带符号类型取值为负时会出现异常结果,这是因为带符号数会自动地转换成无符号数。 + +数字转化为布尔值,非0都为true。 + +```c++ +#include + +int main(){ + std::cout << "类型转化" << std::endl; + + int a=-1; + unsigned int b=2; + + std::cout << "存在无符号数的表达式中如果有符号的数为负数可能会出错" << std::endl; + std::cout << "如: 有符号a=-1,无符号b=2,连个数字执行加法运算,值为:" << b+a < + +int main(){ +// 没有10进制转义字符,只有8进制 +// 2M + std::cout << "\062\115\12" << std::endl;//转义8进制 + + std::cout << "\x32\x09\x4d" << std::endl;//转义16进制 + return 0; +} + +``` + + + + + +### 2.2 变量 + + + +#### 2.2.1 变量定义 + +* **初始化不是赋值**,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。 + +* 列表初始化:作为C++11新标准的一部分,用**花括号来初始化**变量得到了全面应用,而在此之前,这种初始化的形式仅在某些受限的场合下才能使用。出于3.3.1节(第88页)将要介绍的原因,这种初始化的形式被称为**列表初始化**(list initialization)。现在,无论是初始化对象还是某些时候为对象赋新值,都可以使用这样一组由花括号括起来的初始值了。 + +```c++ +int x = 0; +int x = {0}; +int x{0}; +int x(0); +// 以上都可以进行初始化 +``` + +* 默认初始化:当变量定义时没有被初始化(如下),会默认初始化,一般是0,未被初始化的值在引用时会报错; + +* 定义于函数体内的内置类型的对象如果没有初始化,则其值未定义。类的对象如果没有显式地初始化,则其值由类确定。 + +```c++ +#include + +int main(){ +// std::cin >> int x;//不能在这里定义 +// std::cout << x << std::endl; +// int i={3.14};//初始化不能丢失数据,浮点型不能初始化整型 +// double n=p=99.99;//p未定义 + int x=3.14; + std::cout << x << std::endl; + return 0; +} + +``` + + + +**未初始化变量引发运行时故障** + + + +```c++ +#include +#include + +std::string str; +int x; + +int main(){ + int y; + std::string str2; + + std::cout << str <变量声明规定了变量的类型和名字,在这一点上定义与之相同。但是除此之外,定义还申请存储空间,也可能会为变量赋一个初始值。 + + + +如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量: + +```C++ +extern int x;//声明不定义 +int x;//声明并定义 +``` + +任何包含了显式初始化的声明即成为定义。我们能给由extern关键字标记的变量赋一个初始值,但是这么做也就抵消了extern的作用。extern语句如果包含初始值就不再是声明,而变成定义了: + +```c++ +extern int x=0;//定义 +``` + +***变量能且只能被定义一次,但是可以被多次声明。*** + + + +#### ※※※※ 声明 + +1. 声明:是指出存储类型,并给存储单元指定名称。 + +2. 定义:是分配内存空间,还可为变量指定初始值。 + +3. extern关键字:通过使用extern关键字声明变量名,而不是定义它。 + +```c++ +extern int x=1024;//错误,不能在这里对其初始化 +int x;//声明定义 +extern int x;//仅声明 +``` + +生命之前,标识符已经定义,我们只是再次声明 + +* 静态类型:C++是一种静态类型(statically typed)语言,其含义是在编译阶段检查类型。其中,检查类型的过程称为类型检查(type checking)。 + + + +#### 2.2.3 标识符 + +* C++的标识符(identifier)由字母、数字和下画线组成,其中必须以字母或下画线开头。标识符的长度没有限制,但是对大小写字母敏感 + +* 标识符由数字,字母,下划线构成,不能以数字开头 + + + +#### 2.2.4 标识符作用域 + +* 作用域(scope):是程序的一部分,在其中名字有其特定的含义。C++语言中大多数作用域都以花括号分隔。同一个名字在不同的作用域中可能指向不同的实体。名字的有效区域始于名字的声明语句,以声明语句所在的作用域末端为结束。 + +* 建议:当你第一次使用变量时再定义它,尽量避免使用全局变量 + +* 作用域中一旦声明了某个名字,它所嵌套着的所有作用域中都能访问该名字。同时,允许在内层作用域中重新定义外层作用域已有的名字: + +``` +int x=0; +int main(){ + int x=1; +} +``` + +* 嵌套作用域 + +```c++ +#include + +int x=42; + +int main(){ + int y=0; +// 显示全局变量 + + std::cout << x << " " << y << std::endl; + int x=0; +// 显示局部变量 + + std::cout << x << " " << y << std::endl; +// 显式的访问全局变量 + + std::cout << ::x << " " << y << std::endl; + + return 0; +} + +``` + +**如果函数有可能用到某全局变量,则不宜再定义一个同名的局部变量。** + + + +```C++ +int main(){ + int i=100,sum=0; + + for(int i=0;i<10;i++){ + sum=sum+i; + } + + std::cout << i << " " << sum << std::endl; + + return 0; +} + + +输出100 45 +``` + + + + + +### 2.3 复合类型 + +* 复合类型(compound type)是指**基于其他类型定义的类型**。C++语言有几种复合类型,本章将介绍其中的两种:**引用和指针**。 + + + +#### 2.3.1 引用 + +**引用**(reference)为对象起了另外一个名字,引用类型引用(refers to)另外一种类型。通过将声明符写成**&d的形式**来定义引用类型,其中d是声明的变量名: + +```c++ +int x=15; +int &xs = x;//xs指向x(xs是x的另一个名字) +int &xs2;//这里会报错,因为没有指向,'''应用必须被初始化''' +``` + +一般在初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值**绑定(bind)**在一起,而不是将初始值拷贝给引用。 + +```c++ +int x=0;//把0 拷贝到x里 +int &xs=x;//把xs指向x; +``` + +* **引用就是别名**:引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字。 +* 定义了一个引用之后,对其进行的所有操作都是在与之绑定的对象上进行的: + +```c++ +int x=0; +int &xs=x; + +xs=100;//把值赋给了x +int y=xs;//y=x +``` + +因为引用本身不是一个对象,所以不能定义引用的引用。 + +引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起 + +```c++ +int &x=100;//错误,100不是对象 + +int x=100;//正确 + +int &xs;//错误,必须指定引用 +``` + + + + + +#### 2.3.2 指针 + +* **指针(pointer)**是“指向(point to)”另外一种类型的复合类型。与引用类似,指针也实现了对其他对象的间接访问。然而指针与引用相比又有很多不同点。其一,**指针本身就是一个对象,允许对指针赋值和拷贝,**而且**在指针的生命周期内它可以先后指向几个不同的对象**。其二,**指针无须在定义时赋初值**。和其他内置类型一样,**在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值**。 + +定义指针 + +```c++ +int *x,*y; +double dx,*dy; +``` + +* 指针存放某个对象的地址,要想获取该地址,需要使用取地址符(操作符&): + +```c++ +int x=12; + +int *ptr=&x;//这里的&是取地址符 +``` + +第二条语句把p定义为一个指向int的指针,随后初始化p令其指向名为ival的int对象。因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。 + +```c++ +***测试错误 +#include + +int main(){ + int x=24; + + int *ptrx=&x; + + int &xs=x; + + int *ptrxs=&xs; + + std::cout << ptrx << std::endl; + std::cout << ptrxs < + +int main(){ + int x,*ptr=&x; + + std::cout << ptr << std::endl; + std::cout << *ptr << std::endl;//由于x值未定,所以这里也未定,不会报错 + + return 0; +} +``` + +``` +int* x,*y;//定义了两个指针 +int* x,y;//定义了一个指针,一个整数 +``` + +```c++ +#include + +int main(){ + int x=10,*ptr=&x,*pts=ptr; + + std::cout << x << std::endl; + std::cout << *ptr << "->" << ptr << std::endl; + std::cout << "ptr的地址" << &ptr << std::endl; + std::cout << *pts << "->" << pts << std::endl; + std::cout << "以上为指向同一个空间的指针" << std::endl; + + + + int y=20,*ptr2=&y,**pts2=&ptr2; + std::cout << y << std::endl; + std::cout << *ptr2 << "->" << ptr2 << std::endl; + std::cout << "ptr2的地址" << &ptr2 << std::endl; + std::cout << *pts2 << "->" << pts2 << std::endl; + + std::cout << "解引用" << **pts2 << std::endl; + + return 0; + +``` + + + +### 2.4 const限定符 + + + +* 创建一个不改变的值,一定要初始化 +* 默认状态下,const对象仅在文件内有效 + +```c++ +extern const int x; +``` + + + +* 如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字。 + +#### 2.4.1 const的引用 + +```c++ +const int x=13; +const int &y=x;//正确 +y=3;//不正确,不能对不可变引用修改值 +int &z=x;//不正确,z是可变引用,不能作用于不可变数据 +``` + + + +const可以引用常量 + + + +```c++ +const int &x=12;//正常情况下引用是不可以引用常量的。 +int &y=22121;//错误,不可以引用常量 + +double d=12.2; +const int &c1=d;//实际上和上面一样,塌陷转化成了一个临时的常量对象 +{ + const int temp=d; + const int &c1=temp +} +``` + + + +常量引用可以引用变量,但是引用常量的一定是常量 + +``` +const int &x1=10; +int b1=2121; +const int &x2=b1;//正确 + +int &x3=x2;//错误 x2是一个常量 +``` + +* 解惑: + +``` +int main(){ + int x=10; + const int &y=x; + + std::cout << &x << std::endl; + std::cout << &y << std::endl; + + + x=12; + std::cout << x << std::endl; + std::cout << &x << std::endl; + + std::cout << y << std::endl; + std::cout << &y << std::endl; + return 0; +} + +``` + +引用实际上是引用了他的地址,他的地址没有变。。。 + +可以通过x(非常量)修改值,但是不能通过y(const)修改。 + + + +#### 2.4.2 指针和const + +同const引用,指针常量可以指向一个普通标识符,但是常量指针只能有常量指针指向, + +```c++ +#include + +int main(){ + const int xs=10; +// int *pts=&xs;//必须添加底层常量 + const int *pts=&xs; + + int x=1,y=2; + const int *ptr1; + std::cout << "普通指针指向一个常量,无法通过指针修改常量,同时不可以可以指向一个字面值?,跟引用不一样,不会有(temp)" << std::endl; +// ptr1=10;//错误,无法像引用一样 + const int &z=21; + + ptr1=&x;//可以赋值 +// *ptr1=11;//但不能修改值 + + + int *const ptr2=&y;//这是一个常量指针,必须初始化 +// ptr2=&x//不能再指向其他量; + *ptr2=3;//但可以修改 + std::cout << "通过指针修改值" << *ptr2 << "-> y" << y << std::endl; + + const int *const ptr3=&x;//必须赋值,因为这是一个常量指针(*const ptr3),并且他指向一个常量(const int); + std::cout << "尝试修改常量:失败" << std::endl; +// *ptr3=10;//错误无法通过指针修改指向的常量(因为指向的是一个常量) +// ptr3=&y; + std::cout << "尝试修改常量指针:肯定失败" << std::endl; + std::cout << "得出结论,常量指针指向了一个常量,无法通过常量指针修改常量,也无法修改常量指针(即无法重新指向另一个对象)" << std::endl; + + return 0; +} + + +``` + + + +#### 2.4.3 底层常量和顶层常量 + +```c++ +const int x=10;//const是顶层 +int y=2; +int *const ptr1=&y;//这里也是顶层常量 + +const int *ptr2=&x;//这是底层常量 +``` + + + +#### 2.4.4 constexpr和常量表达式 + +* 常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。 + +```c++ +const int x=10;//是常量表达式 +const int y=x+2;//是常量表达式 +int z=12;//不是,类型不是 +const int a=z;//不是,值不是 + +constexpr n=x;//正确,x是常量表达式 +constexpr p=a;//错误,a值不可用,因为int z不是常量表达式 +``` + +* **constexpr只能作用于常量表达式**,也就是说,constexpr只能初始化**字面值** + +```c++ +#include + +int main(){ + int x=10; +// constexpr int y=x;//int x不是常量,所以这里报错 + + const int y=x;//这里也不是常量表达式 +// constexpr y;//这里才是常量表达式 + + const int z=y; + constexpr int n=z;//这里错误 + + constexpr int a=1; + constexpr int b=a+1; + + return 0; +} + +``` + +* **其他一些字面值类型**将在7.5.6节(第267页)和19.3节(第736页)介绍。 + +* 一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。**目前只能等于0或nullptr** + +```c++ +#include + +int main(){ + int x=10; +// const int y=x;//y不是一个常量表达式 + const int y=11; +// constexpr const int *const ptr=&y;//&y不是一个常量表达式,因为内存地址不确定 + + constexpr int *ptr=0; + + return 0; +} + +``` + + + +* 6.1.1节(第184页)将要提到,函数体内定义的变量一般来说并非存放在固定地址中,因此constexpr指针不能指向这样的变量。相反的,定义于所有函数体之外的对象其地址固定不变,能用来初始化constexpr指针。同样是在6.1.1节(第185页)中还将提到,允许函数定义一类有效范围超出函数本身的变量,这类变量和定义在函数体之外的变量一样也有固定地址。因此,constexpr引用能绑定到这样的变量上,constexpr指针也能指向这样的变量。 + +***这段话的意思是全局变量作用于main函数之前,他们的地址已经固定了;*** + +```c++ +#include + +int x=10; +constexpr x=10; +//以上两个都可以,只要在函数以外 + +int main(){ + constexpr int *y=&x; + + return 0; +} +``` + +##### 指针和constexpr + +在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关,即constexpr把指针变成了一个顶级常量 + +``` +constexpr int *p=nullptr; +``` + + + +题 + +```c++ +int null=0,*p=null;//错误,指针只能赋值地址,并不是因为null +``` + + + +### 2.5 处理类型 + + + +#### 2.5.1 类型别名 + + + +* 类型别名(type alias)是一个名字,它是某种类型的同义词。它让复杂的类型名字变得简单明了、易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的。 + +两种方法定义类型别名 + +* 传统形式的别名定义 + +```c++ +typedef double dub;//dub是double的别名 +typedef dub dbu2,*ptr;//dub2是dub的别名,也就是double的别名,ptr是double*的别名; +``` + +* 新形式的别名定义 + +```c++ +using ci = const int; +ci x=12;//ci是整型常量,顾x定以后不可修改 +x=11;//会报错 + +using iptr = int*;//整形指针 +iptr ptr1,*ptr2//ptr1是整型指针,ptr2是指向整型指针的整形指针 +``` + +```c++ +#include + +int main(){ + using iptr1 =const int *const;//底层和顶层 + using iptr2 =const int*;//底层 + using iptr3 =int *const; + + int x=1; + const int y =2; + iptr1 x1=&x;//正确 + iptr1 y1=&y;//正确, + +// x1和y1都不能再改变,也不能通过指针改变指向的值 + + iptr2 x2=&x;//正确 + iptr2 y2=&y;//正确 + +// 自己本身可以再指向其他的也就是可以改变自己,但是不能改变指向值,这是一个底层常量 + + iptr3 x3=&x;//自己是一个常量不能再改变,只能指向非常量,并且可以改变指向的值 +// iptr3 y3=&y;//报错 + +// 自身不能再改变,只能指向非常量,可以改变指向值 + + return 0; +} + +``` + + + +#### 2.5.2 auto类型说明符 + + + +* auto后面定义的值必须有初始值,因为auto是通过判断初始值推断变量类型的 + +```C++ +//自适应类型 +auto x=12.1//x是浮点型 +auto x=12//整型 +auto x='A'//char型 +``` + +* auto会**忽略顶层const** + +```c++ +int x=0; +const y=x; + +auto ace1=y;//这里的ace1是整数,而不是整型常量,因为auto忽略了const顶层 +auto ace2=&y;//这里没有顶层const,对于指针来说 ,const int是底层常量 + +如果需要顶层,需要单独设置 +const auto ace3=&y;//这是一个指向整型常量的常量指针 + +//也可以设置引用类型 +auto &end1=y;//此时end1是一个引用类型,他不会改变引用对象的属性,即这里的end1引指整型常量y + +//*和&是声明符号,而不是数据类型,而非基本数据类型的一部分 +auto ace4=y,*ace5=&y;//y是整型常量,ace4是整型常量,ace5是一个整形指针,auto会忽略掉顶层常量,所以这里报错 + +//auto后面只能跟相同的数据类型 +``` + +* auto会忽略顶层常量(引用除外) + +```c++ +const int x=12; +auto a=x;//a是 +``` + +* 对于指针 + +```c++ +int x=111; +auto b=x,*ptr=&x;//正确,是int* +auto b=x,ptr=&x;//错误,前面是int,后面是int* +auto ptr=&x;//正确是int* +``` + +```c++ +#include + +int main(){ + int a=0; + const int b=a; + + auto ace1=b;//auto会忽略顶层常量,因此ace1不是常量 + ace1=12;//这里是合法的 + const auto ace2=b;//auto面对顶层常量需要在语句前面声明 +// ace2=12;//这里是非法的 + + std::cout << ace1 << " " << ace2 << std::endl; + std::cout << "面对引用" << std::endl; + +// auto &end1=32;//这里不能直接饮用字面值,因为auto忽略了顶层常量,因此end1是一个普通引用,普通引用不能引用字面值,常量引用才可以 + const auto &end1=32; + auto &end2=b;//尝试修改,无法修改 +// end2=11; + const int c=10; + const auto &end3=c; + + + std::cout << "面对指针" << std::endl; + + auto ptr1=&b; +// auto p=b,*ptr2=&b;//对于p来说,忽略了const是int形式,对于指针来说,const int b是底层常量,因此不同类型不能在一起 + + auto p2=a,*ptr3=&a; + + const int x1=12; + auto xp1=&x1; + auto *xp2=&x1; + std::cout << typeid(xp1).name() << std::endl; + std::cout << typeid(xp2).name() << std::endl; + +// *xp1=12; +// *xp2=12; + std::cout << *xp1 << " " << *xp2 << std::endl; + + return 0; +} + +``` + + + +#### 2.5.3 decltype类型提示符 + +利用decltype去定义一个未知数据类型的类型 + +加入不知道x什么类型 + +```c++ +decltype(x) y;//y和x的类型一样//引用x的类型去定义y + +decltype((x)) y=x;//双层括号或者多层括号会把类型变成一个引用,因此这里必须给引用初始化 +``` + + + +```c++ +#include + +int main(){ + int x=12; + decltype(x) y; + decltype((x)) z=x;//这里是引用,必须初始化 + + std::cout << typeid(x).name() << std::endl; + std::cout << typeid(y).name() << std::endl; + std::cout << typeid(z).name() << std::endl; + + return 0; +} + +``` + +* 赋值是会产生引用的一类典型表达式,引用的类型就是左值的类型 + +```c++ +#include + +int main(){ + int a=1,b=2; + decltype(a=b) x=a; + + std::cout << typeid(x).name() << std::endl; + std::cout << &a << std::endl; + std::cout << &x << std::endl;//地址一样说明是引用 + return 0; +} + +``` + + + +* 区别 + * auto是赋值,将对象的值直接付给新的,免去声明,自动适配类型,有个特点是,顶层常量无效 + * decltype是获得对象的类型后声明一个新的量不赋值,然后特点是双层括号直接变成引用 + + + +### 2.6自定义数据结构 + +* 数据结构是把一组相关的数据元素组织起来然后使用它们的策略和方法。(C++语言允许用户以类的形式自定义数据类型) + + + +#### 2.6.1 定义Sales——data类型 + +* 我们的类以**关键字struct**开始,紧跟着类名和类体(其中类体部分可以为空)。类体由花括号包围形成了一个新的作用域(参见2.2.4节,第43页)。类内部定义的名字必须唯一,但是可以与类外部定义的名字重复。 +* 类体右侧的**表示结束的花括号后必须写一个分号**,这是因为类体后面可以紧跟变量名以示对该类型对象的定义,所以分号必不可少: + +```c++ +sturct Sales_data{ + std::string bookNo; + unsigned units_sold=0; + double revenue=0.0; +};//这里必须有一个分号 +``` + +* C++11新标准规定,可以为数据成员提供一个类内初始值(in-class initializer)。创建对象时,类内初始值将用于初始化数据成员。没有初始值的成员将被默认初始化。 + + + +#### 2.6.2 使用类Sales_data + +```c++ +#include +#include + +struct Sales_data{ + std::string bookNo; + unsigned unit_sold=0; + double revenue=0.0; +}; + +int main(){ + Sales_data data1,data2; + std::cout << "请输入ISBN,数量,单价" << std::endl; + std::cin >> data1.bookNo >> data1.unit_sold >> data1.revenue; + std::cout << std::endl << "请再次输入" << std::endl; + std::cin >> data2.bookNo >> data1.unit_sold >> data1.revenue; + + if(data1.bookNo==data2.bookNo){ + std::cout << "两次输入的书号一样" << std::endl; + std::cout << data1.bookNo << " " << data1.unit_sold+data2.unit_sold << " " << data1.revenue+data2.revenue << std::endl; + }else{ + std::cout << "两次输入的书号不一样" << std::endl; + } + + return 0; +} +``` + + + +#### 2.6.3 编写自己的头文件 + +* 类一般不定义在函数体内。 +* 类名应该是头文件名。 +* 头文件**通常包含只能被定义一次**的实体,如类,const,constexpr变量等。 +* 头文件一旦改变,相关的源文件必须重新编译以获取更新过的声明。 + + + +* **确保头文件多次包含仍能安全工作的常用技术是预处理器**(preprocessor),它由C++语言从C语言继承而来。**预处理器是在编译之前执行的一段程序**,可以部分地改变我们所写的程序。之前已经用到了一项预处理功能#include,当预处理器看到#include标记时就会用指定的头文件的内容代替#include。 + + + +##### 头文件保护 + +`#ifdef` 判断是否定义 + +`#ifndef` + +`#define` 开始执行 + +`#endif` 结束执行 + + + +```c++ +//my.h + +#ifndef MY_H +#define MY_H//头文件保护 +#include + +struct my{ + std::string name; +}; +#endif +``` + + + +```c++ +//2.6.3编写自己的touwenjian.cpp +#include +#include "my.h"//注意这里 + +int main(){ + my a; + a.name="何小龙"; + std::cout << a.name << std::endl; + + return 0; +} +``` + + + + + + + +## 第3章 字符串、向量和数组 + + + +* string:可变长字符串 + +* vector:可变长集合 + + 以上是对内置数组的抽象 + + + +### 3.1 命名空间的using声明 + +头文件不要using声明,如果头文件里有某个using声明,那么每个使用了该头文件的文件就都会有这个声明。 + +```c++ +#include + +using std::cin; +using std::cout; +using std::endl; + +int main(){ + return 0; +} +``` + + + + + +### 3.2 标准库类型string + +* 标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件。 +* 他是std成员,需要是哟`using std::string` + +#### 3.2.1 定义 和初始化string对象 + +方法: + +``` +string s1;//空字符串 +string s2(s1);//s1的副本 +string s2=s1;//同上 +string s3("xsxs");//s3是字面值"xsxs"的副本,除了字面值最后的两个空字符外 +string s3="xsxs";//同上 +string s4(4,'s');//ssss +``` + +* 拷贝初始化:= +* 直接初始化:() + +* 一般都可以,除了s4,一般只能直接初始化,否则需要显式初始化 **`string s4=string(4,'s')`** + +```c++ +#include + +using std::cin; +using std::cout; +using std::endl; +using std::string; + +int main(){ + string name="何小龙"; + + cout << name << endl; + + string name1; + string name2(name1); + + string name3("何夕"); + string name4="Nie"; + + string name5(4,'A'); +// string name6(4,"张旭东");//只能一个字符 + string name7=string(4,'龙');//只能用单引号,多字节字符常量好像无法显示 + + cout << name1 << endl; + cout << name2 << endl; + cout << name3 << endl; + cout << name4 << endl; + cout << name5 << endl; + //cout << name6 << endl; + cout << name7 << endl; + + return 0; +} + +//输出 +//何小龙 +// +// +//何夕 +//Nie +//AAAA +//���� + +``` + + + +#### 3.2.2 string对象的操作 + +方法: + +| | | +| ----------------- | --------------------------- | +| `os<>str` | 从输入流中读取字符串赋给str | +| `getline(is,str)` | 从输出流中读取一行给str | +| `str.empty()` | str是空的,返回true | +| `str.size()` | 返回str中的字符个数 | +| `str[n]` | 返回第n+1个字符的引用 | +| `str1+str2` | 返回他们的拼接 | +| `str1=str2` | 将str2的副本替换str1 | +| `str1==str2` | 完全相等,大小写敏感 | +| `str1!=str2` | 不相等 | +| <,<=,>,>= | 字典中顺序比较,大小写敏感 | + + + +```c++ +#include +#include + +using std::string; +using std::cout; +using std::cin; +using std::endl; + +int main(){ + string name="何琋"; + string love="Ying"; +// string aa="nihao"+"你好"+name;//两个单独的字面值无法相加 + + string message=name+" love "+love; + cout << message << endl; + cout << "message的字符个数是:" << message.size() << endl; + cout << message[0]; + + string str; + cout << "输入1结束" << endl; + while(cin>>str){//不读到数据不会停止。。。 + cout << endl << str.size() << "个字符" << endl; + if(str=="1"){//回车符不算空 + cout << "空字符" << endl; + break; + }else{ + cout << str << endl; + } + } + cout << str << endl; + while(getline(cin,str)){//这里会首先启动一次 + if(str.empty()){ +// break; + cout << "?" << endl; + }else{ + cout << "-----" << str << endl; + } + } + return 0; +} +``` + +* string读取输入流时最后的换行符被丢弃了 + +##### string::size_type类型 + +是取字符串中的字符的类型,它是一个新类型 + +```c++ +auto x=str.size();//x类型是string::size_type +``` + +!!! `string x="xsxs"+"xsxs";//非法`两个运算符都不是string类型,两个字面值无法相加 + + + +#### 3.2.3 处理string对象中的字符 + +* 建议:使用C++版本的C标准库头文件C++标准库中除了定义C++语言特有的功能外,也兼容了C语言的标准库。C语言的头文件形如name.h,C++则将这些文件命名为**cname**。也就是去掉了.h后缀,而在文件名name之前添加了字母c,这里的c表示这是一个属于C语言标准库的头文件。 + +**cctype头文件中的函数**: + +| | | +| ----------- | -------------------- | +| isalnum(c) | 判断是否是字母或数字 | +| isalpha(c) | 字母 | +| iscntrl(c) | 控制字符 | +| isdigit(c) | 数字 | +| isgraph(c) | 不是空格但可以打印 | +| islower(c) | 小写字母 | +| isprint(c) | 可打印 | +| ispunct(c) | 标点 | +| isspace(c) | 空白 | +| isupper(c) | 大写字母 | +| isxdigit(c) | 16进制数 | +| tolower(c) | 变小写 | +| toupper(c) | 变大写 | + + + +**处理每个字符:** + +```c++ +string x="xsaxasxaxaxcweciuwydckxaiojcnidvksuxijOnkjuykschijxoknjcruveiaxsk"; +for (auto i:x){ + cout << "打印每个字符" << i; +} +for (auto &i:x){ + //这里是引用,可以修改原来的值 + touppper(i);//变大写 +} +``` + + + +* 使用下标访问string中的单个字符,访问超出范围会出错,因此下标大于等于0小鱼s.isze() + + + +下表的值称为下标或者“索引”。 + + + +```c++ +#include +#include + +using std::string; +using std::cout; +using std::cin; +using std::endl; + +int main(){ + string str="xasxasxasxcsdklvhsabjvksanvhsluv"; + getline(cin,str); + for (auto &i:str){ + i='X';//字符替换必须用'' + } + cout << str << endl; + + return 0; +} +``` + + + +### 3.3 标准库类型vector + +* 标准库类型vector表示对象的集合,其中所有对象的类型都相同。因为vector“容纳着”其他对象,所以它也常被称作**容器(container)**。 + +* 使用vector,他是一个**类模板**,模板本身不是类和函数,编译器根据模板创建类或函数的过程称为**实例化(instantiation)**,当使用模板时,需要指出编译器应把类或函数实例化成何种类型。 + +```c++ +#include +std::vector; + +int main(){ + vector a;//保存为int形式 + vector b;//保存为Sales_item形式 + vector> file;//保存为vector对象 +} + +``` + +* vector不能保存引用,其他可以容纳绝大多数对象 +* 定义格式和老版本有些不一样 + + + +#### 3.3.1 定义和初始化vector对象 + +初始化: + +| | | +| ----------------------- | ------------------------------------------------ | +| vector v1 | 空对象,潜在元素类型是T,执行默认初始化 | +| vector v2(v1) | v2中包含v1的所有副本 | +| vector v2=v1 | 同上 | +| vector v3(n,val) | 包含了n个val | +| vector v4(n) | v4包含了n个重复执行了值初始化的对象 | +| vector v5{a,b,c,...} | 包含了初始值个数的元素,每个元素被赋相应的初始值 | +| vector v5{a,b,c,...} | 同上 | + +```c++ +vector art={"a","an","the"}; +vector art=()"a","an","the");//错误,不能使用圆括号初始化 +``` + +* 值初始化 + +```c++ +vector a(10);//10个元素,每个初始化为0 +vector b(10);//10个元素,每个都是空的string + +``` + +**使用以上方式,其对象类型必须支持默认初始化** + + + +```c++ +vector a=(10,10);//10个10元素 +vector b={10,10};//两个元素,为10和10 + +vector c=(10);//初始化10个空元素 +vector d={10};//初始化一个10元素 + +//如果在花括号里使用了数字,但是不是初始化类型,就会变成和圆括号一样 +vector e=("hi");//不能使用字面值 +vector f={"hi"};//初始化后包含一个“hi”元素 + +vector g={10};//由于10不能用来初始化string,索引变成了初始化10个空元素 +vector h={10,"10"};//初始化10个“10”元素 +``` + +**以上内容说明,初始化中花括号和圆括号的实际意义需要根据环境判断** + + + +```c++ +#include +#include +#include + +using std::string; +using std::vector; +using std::cout; +using std::cin; +using std::endl; + +int main(){ + vector a{1,2,3,4,5}; + for (auto i:a)cout << i << endl; +// cout << a << endl;//不能直接输出 + + cout << "以上为尝试输出vector对象中的元素" << typeid(a).name() << endl; + + vector b=a; + for (auto i:b)cout << i << ","; + cout << endl; + vector c(10); + vector d(10,12); + for (auto i:c)cout << i << ","; + cout << endl; + for (auto i:d)cout << i << ","; + cout << endl; + + vector e{10,"GY"};//这里花括号就适应了环境,因为这里不能初始化字面值 + for(auto i:e)cout << i << " "; + cout << endl; + + vector> f{a,b,c,d}; + for(auto i:f){ + for(auto j:i)cout << j << " "; + cout << endl; + } + + return 0; +} + +``` + + + +#### 3.3.2 向vector中添加元素 + +```c++ +vector a; +a.push_back(1); +``` + +`obj.push_back(obj_type)` + +```c++ +#include +#include + +using std::vector; +using std::cout; +using std::endl; + +int main(){ + vector a; + a.push_back(1024); + + for(int i=0; i<=512; i++){ + a.push_back(i); + } + + for(auto i:a)cout << i << endl; + return 0; +} +``` + + + +#### 3.3.3 其他vector操作 + +| | | +| ---------------- | ---------------------------- | +| v.empty() | 叛空 | +| v.size() | 元素个数 | +| v.push_back(x) | 向v的末尾添加一个值为x的元素 | +| v[n] | 返回v第n位置上的元素**引用** | +| v1=v2 | v2替换v1中的元素 | +| v1={a,b,c,d,...} | 列表替换v1 | +| v1==v2 | 判相等 | +| v1!=v2 | 不相等 | +| <,<=,>,>= | 字典顺序比较 | + + + +##### **? size_type** + +要使用size_type,需首先指定它是由哪种类型定义的。vector对象的类型总是包含着元素的类型。 + +```c++ +vector::size_type; +vector::size_type;//错误,没有指明类型 +``` + +* 不能用下表添加元素 +* 只能对已知元素进行下标操作 +* **用下标访问不存在的元素:所谓的缓冲区溢出(buffer overflow)指的就是这类错误,这也是导致PC及其他设备上应用程序出现安全问题的一个重要原因。** + + + + + +### 3.4 迭代器 + + + +#### 3.4.1 使用迭代器 + +v.begin()//第一个元素 + +v.end()//**最后一个元素的后一个(不存在的元素,容器之外)**,当容器为空时,begin=end + +v.cbegin()//常量 + +v.cend()//常量 + +```c++ +using std::vector; + +vector x{}; +auto a=x.begin(),b=x.end(); +``` + + + +| | | +| --------------- | ------------------------------------------------ | +| *iter | 返回迭代器iter所指的元素 | +| iter->mem | 解引用iter并获取名为mem的成员,等价于(*iter).mem | +| ++iter | 指向容器的下一个元素 | +| --iter | 指向容器的上一个元素 | +| iter1==iter2 | 判断两个是不是同一个 | +| iter1!=iter2 | | +| (*iter).empty() | 判空 | + + + +```C++ +//3.3.4使用迭代器 +#include + +using std::cout; +using std::string; +using std::endl; + +int main(){ + string a="Hello World!"; + + if(a.begin()!=a.end()){//判断对象非空 + auto x1=a.begin(); + *x1='h'; + cout << *x1; + ++x1; + cout << *x1; + } + cout << a; + return 0; +} +``` + + + +* 在迭代器里面不能给容器添加元素,push_back() + + + +#### 3.4.2 迭代器运算 + +++iter每次只移动1个元素 + +string和vector支持多位移动 + +| | | +| ----------- | --------------------- | +| Iter + n | iter后第n位元素 | +| Iter - n | iter前第n位元素 | +| iter += n | iter=iter+n | +| iter -= n | | +| Iter1-iter2 | **他们之间的距离** ? | +| >,<,<=,>= | 比较位置 | + +算术运算: + +```c++ +auto mid=v.begin()+v.size()/2;//得到的是v的中间元素,v.size()是一个整数,相当于上面的移位 + +auto it=v.begin; +++it; +if(it + +using namespace std; + +int main(){ + string a="GY i missing you!"; + + for(auto i=a.begin();i + +using namespace std; + +int main(){ + string str[]={"abc","你在做什么"}; + cout << str[0] << endl; + cout << str[1] << endl; + + int a[3]; + int b[]={1,2,3,4}; + int c[2]={2,4}; +// int d[2]={1,2,3};//错误,初始值超出容器 + int e[5]={1,2,3};//相当于{1,2,3,0,0} + +//不能赋值 +// int f[]=e;//这里报错,不能使用数组初始化数组 +// int g[5]; +// g=e;//不能把数组赋值给另一个数组 + + + + char cha[]="master";//字符数组可以使用字面值 + char chb[]={'a','b','c'};//最后有一个空字符 + char chc[3]="ab";//这里chc已经装满了,还有一个位置要留给空字符 + +//指针数组和数组指针 + int *pa[23];//含有23个整形指针的数组, + int (*pb)[3]=&a;//pb是指针,指向一个数组,这里维度需要和被指对象维度相同 + int *(*pc)[23]=&pa;//pc是一个指针,他指向一个包含23位整形指针的数组 + +//引用 +// int &ma[10];//引用不是对象,一次不能成为数组; + int (&mb)[5]=e;//引用一个数组,而且需要初始化 + + return 0; +} + +``` + + + +#### 3.5.2 访问数组中的元素 + +* 下标访问,注意不能访问数组之外的元素,否则会报错 + + + +#### 3.5.3 指针和数组 + +使用数组时,编译器一般会把他转换为指针 + +数组元素也是对象,因此可以对其使用取址符 + +对于很多用到数组名的地方,编译器会把它替换成数组第一个元素的地址 + +```c++ +string num[2]; +string *ps=num;//等价于ps=&num[0] +``` + +* ¥¥ **数组名代表数组的首地址**,是一个指针,所以不用加&符号。如果是引用数组的元素,就必须得加&符。 +* 因此,auto数组对象,实际上是一个指针 +* 但是decltype初始化得到的依然是一个数组 +* 指针也是迭代器,所以可以对指针进行迭代器操作 + +* 下标运算和指针运算类似 + +```c++ +//3.5.3指针和数组 + +#include +using namespace std; +int main(){ + string num[2]; + string *ps=num; + string *ps0=&num[0]; + string *ps1=&num[1]; + cout << ps << endl << ps0 << endl << ps1 << endl; + num[0]="xasxasxasxassvasuyijovibfhdmxjvbcsnly"; + cout << ps << endl << ps0 << endl << ps1 << endl; + int num2[2]; + +// for (int i=0;i<100;i++){ + cout << &num[0][0]; +// } + +// cout << num[0] << endl; + cout << &num2[0] << endl << &num2[1] << endl; +// cout << string.max_size() << endl; + +//指针式迭代器,所以可以进行迭代器操作 + int a[]={1,2,3,4,5,6,7,8,9,0}; + int *pa=a;//这里数组名其实就是数组的地址,因此不需要取址符 + int *e=&a[10];//这里取不存在的数组元素的意义在于,得到尾后地址 +//妈的原来学过的begin()和end()就可以 + for(pa=a;pa + +using namespace std; + +int main(){ + int arr[3][3]={1,2,3,4,5,6,7,8,9}; + + int (*ptr)[3]=arr;//ptr指向包含三个元素的数组 + + for (int i=0;i<3;i++){ + cout << *ptr << " " << ptr << endl; + int *pts=(*ptr);//这里代指第一维数组 + for (int j=0;j<3;j++){ + cout << *pts; + ++pts; + } + cout << endl; + ++ptr; + } + for(auto a=begin(arr);a + +using namespace std; + +int main(){ + int a=12,b=5; + double c=12.333,d=2.71828; + + cout << "a/b: " << a/b << endl; + cout << "a%b: " << a%b << endl; + + cout << "c/d: " << c/d << endl; +// cout << "c%d: " << c%d << endl;//这里面对两个浮点型,%(取余)只能存在于两个整数之间 + + return 0; +} +``` + + + +### 4.3 逻辑和关系运算符 + +* 关系运算符作用于指针或算数类型 +* 逻辑运算符可以作用于任何能够转换为布尔型的类型 + +逻辑运算符和关系运算符: + +| 运算符 | 功能 | +| ------ | ------ | +| ! | 逻辑非 | +| < | | +| <= | | +| > | | +| >= | | +| == | 相等 | +| != | | +| && | 逻辑与 | +| \|\| | 逻辑或 | + +优先级:逻辑非>大小比较>逻辑与和逻辑或 + +* 对于逻辑与运算符来说,当且仅当**左侧运算对象为真**时才对右侧运算**对象求值**。 +* 对于逻辑或运算符来说,当且仅当**左侧运算对象为假**时才对右侧运算对象求值。 + + + +* 因为关系运算符的求值结果是布尔值,所以将几个关系运算符连写在一起会产生意想不到的结果: + +```c++ +a + +using namespace std; + +int main(){ + int a=32,b=0; + + string c,d="xsx";//string无法直接转化为布尔型 + + if(a)cout << "a不等于0" << endl; + if(!b)cout << "b等于零" << endl; + +// if(c)cout << "c是空字符" << endl; +// if(!c)cout << "c是空字符" << endl; +// if(d)cout << "d含有字符" << endl; + + return 0; +} +``` + + + +### 4.4 赋值运算符 + +* 赋值运算左侧必须是变量(可修改的值),不能给常量 赋值 +* 赋值左右两侧的数据类型应该是相同的(右侧结果的类型),如果不相同,在规则允许范围内会自动转化为左值得类型,非法例如不能把指针赋值给整数,这是无法转换的 +* 赋值运算优先级较低,当右侧运算完了,赋值符号才会把右值赋给左值 + +* c++允许赋值符号作为条件,但是会发生不可预测的结果如if(a=b)把b的值赋给了a,再判断a + +```c++ +//4.4 赋值运算符 +#include +#include +using namespace std; + +int main(){ +// int a={1.2};//查看编译器结果,不能讲浮点型赋值给整型 + + vector b; + b={1,2,3,4,5}; + + return 0; +} +``` + + + +### 4.5 递增和递减运算符 + +前置和后置 + +```c++ +//4.5 递增和递减运算符 +#include + +using namespace std; + +int main(){ + int a=1; + int b=a++; + cout << a << " " << b << endl;//先赋值后进行加法 + int c=++a; + cout << a << " " << c << endl;//先进行递增然后再赋值 + + int arr[]={1,2,3,4,5,6,7,8,9}; + auto d=begin(arr); + d++; +// *d++;//递增运算不可以解引用 + cout << *++d << endl; + cout << d++ << endl; + return 0; +} +``` + + + +* 建议不要用后置版本(for 循环除外除非自己想在开始就加1) + + + +### 4.6 成员访问运算符 + +```c++ +//4.6 成员访问运算符.cpp +#include +#include + +using namespace std; + +int main(){ + string a="i missing gy",*b=&a; + cout << (*b).size() << endl; + cout << b->size() << endl;//这俩等价 +// cout << *b.size() << endl;//这里b是指针,没有size成员 + + return 0; +} +``` + + + +### 4.7 条件运算符 + +```c++ +a ? b : c; +//判断a正确否,正确输出b,否则输出c,可以赋值 +``` + + + +### 4.8 位运算符 + +? + + + +### 4.9 sizeof运算符 + +返回一个表达式或者类型名字所占的**字节数** + +sizeof() + + + +### 4.10 逗号运算符 + +```c++ +int x,y,z; +``` + + + +### 4.11 类型转换 + +隐式转换 + +```c++ +//4.11.test.cpp +#include + +using namespace std; + +int main(){ + int a=1.22+5;//发生了隐式转换,这里先把5转化为浮点型,在进行计算,最后把值赋给整数类型 + + cout << a << endl; + + return 0; +} +``` + + + +* 计算中把比int小的整数先转化为int +* 在条件中先把非布尔值转化为布尔值 +* 初始化时,初始值转化为变量类型,赋值时把右侧类型转化为左侧类型 +* 关系式中有很多类型,需要转换成一样的 +* 函数调用时也会发生关系转换 + + + +#### 4.11.1算数转换 + +**整型提升**:将小整型转换为较大的整型,如bool,signed char,char,unsigned char,short和unsigned short只要他们能放在int里面,都会提升为int,否则提升为unsigned int,像bool中false提升为0,较大的char会提升为更高类型 + +无符号类型和有符号类型相加,可能会出现溢出 + + + +#### 4.11.2 其他隐式类型转换 + +**数组名转换成指针**:数组再遇到指针时会主动转换为指针形式 + +```C++ +int a[10]; +int *b=a;//这就是这里为什么不用取址符的原因 +``` + +但是数组遇到decltype,sizeof,typeid时不会发生上述转换 + +**指针的转换**:整数0和nullptr能转化成任意类型的指针,void\*可以应对任何非常量类型,const void\*可以面对所有,后面还会讲到关于继承 + +**转化成布尔类型**:如果指针或算数类型的值为0,转换为false,否则为true + +**转换为常量**:允许指向非常量的指针转换成指向常量的指针 + +**类类型定义的转换**:编译器自动转换,不过一次只能执行一种类型转换,string会将字面值转换成str型 + +**条件**:之前cin输入判断,将输入类型转化为条件类型 + + + +#### 4.11.3 显式转换 + +* 强制转换非常危险 + +**命名的强制转换**:`cast-name(expression)`,其中type是要转换的类型,expression是需要转换的值,cast-name是static_cast,dynamic_cast,const_cast,reinterpret_cast的一种,dynamic_cast支持类型识别 + +任何具有明确定义的类型转换,只要不包含底层const都可以使用 **static_cast** + +```c++ +int a=1,b=2; +double c=static_cast(a)/2;//这样子就可以得到浮点结果 +``` + +```c++ +//4.11.3.1显式转换.cpp +#include + +using namespace std; + +int main(){ + int a=1,b=2; + double c=1/2; + cout << c << endl;//这里依然是整型,因为右边线进行计算,得到的是整数 + double d=static_cast(a)/b; + cout << d << endl;//这里先将a转化为双精度,此时隐式转换发生b为了和双精度的a进行计算,会先转化为双精度,然后将值赋给左边 + cout << static_cast(a)/b << endl;//此处不能讲这个值赋给c再输出。。。 + return 0; +} +``` + +当把一个比较大的类型值赋给较小的类型时static_cast非常有用,会避免警告 + +static_cast对编译器无法执行的类型转换也很有用 + +const_cast只会转化底层const + +* 旧式强制转换格式 + +`(type)expression` c形式 + +`type(expression)` 函数式 + +```c++ +#include + +using namespace std; + +int main(){ + int a=12; + void *b=&a; + double *c=static_cast(b); + cout << &a << endl; + cout << c << endl; + cout << b << endl; + + cout << a << endl; +// cout << *b << endl; + cout << *c << endl; +//虽然指向了同一个位置,取值时发生了错误 + return 0; +} +``` + + + + + +### 4.12 **运算符优先级表** + + + + + +## 第5章 语句 + +C++提供了条件执行语句、重复执行相同代码的循环语句和用于中断当前控制流的跳转语句。 + + + +### 5.1 简单语句 + +* 以分号结束就构成了一个语句 + +* 空语句直接用;结束,使用空语句最好用注释说明 + +* 多余的空语句并非都是无害的 + +```c++ +while(1);//这里会一直循环下去 +``` + +* 复合语句(块)用花括号括起来的语句,一个块就是一个作用域,块不用以分号结束 + +### 5.2 语句作用域 + +可以在if、switch、while和for语句的控制结构内定义变量。定义在控制结构当中的变量只在相应语句的内部可见,一旦语句结束,变量也就超出其作用范围了: + +```c++ +while(int i=1)cout << i << endl; +i=2;//错误,超出作用域,解析器会提示未定义的量 +``` + +### 5.3 条件语句 + +#### 5.3.1 if语句 + +if的作用是,判断语句是否为真,真直接执行后面的花括号块,否则执行else的块 + +```c++ +if (condition){ + statement +}else if(condition){ + statement +}else{ + statement +} +``` + +#### 5.3.2 switch语句 + +类似于选择题 + +```c++ +//计算元音字母在字符串中的出现次数 +int a=0,e=0,i=0,o=0,u=0; +char s; +while(cin >> s){ + switch(s){ + case 'a': + ++a; + break; + case 'e': + ++e; + break + case 'i': + ++i; + break + case 'o': + ++o; + break + case 'u': + ++u; + break + } +} +``` + +* **如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支**,除非程序显式地中断了这一过程,否则直到switch的结尾处才会停下来。要想避免执行后续case分支的代码,我们必须显式地告诉编译器终止执行过程。大多数情况下,在下一个case标签之前应该有一条**break语句**。 + +也就是说执行case后不会主动结束,他会继续执行后面的所有语句,所以执行完我们要使用break语句显式结束switch。 + +当然也可以利用这个特性,但是做好加上注释 + +* default,如果case都没有匹配,则默认执行这个,他和case一样,得家伙少年宫break语句结束。 + +* 内部变量的定义,不能跨case使用定义的变量,如果要使用,做好在块内,case之前 + +```c++ +#include + +using namespace std; + +int main(){ + int i=1; + switch(i){ + case 1://数字不用加引号,char单引号,字符串双引号 + cout << 1 << endl; + break; + case '2': + cout << 2 << endl; + break; + } + + return 0; +} +``` + + + +### 5.4 迭代语句 + +迭代语句通常称为循环 + +* while和for语句在执行循环体之前检查条件,**do while语句先执行循环体**,然后再检查条件。 + +#### 5.4.1 while语句 + +只要条件为真,while就会执行下去 + +```c++ +while(true)执行; +``` + +while的条件部分可以是表达式,也可以是一个初始化的变量。 + +#### 5.4.2 传统的for语句 + +```c++ +for(initializer,condition,express){ + statement +} +``` + +一般情况下,initializer是一个初始化的值,C++支持在这里初始化,condition是运行条件,满足才可以执行for中的块,expressgy是执行的语句,一般负责修改条件语句中的值。 + +* for循环内定义的值只在for循环内部可用 + +initializer可以定义过个值 + +省略condition等于true,for循环会一直进行下去,除非内部有退出循环的语句 + +expression也可以省略 + + + +#### 5.4.3 范围for循环 + +C++11新标准引入了一种更简单的for语句,**这种语句可以遍历容器或其他序列的所有元素**。范围for语句(range for statement)的语法形式是: + +```c++ +for(declaration : expression)statement; +``` + +expression必须是一个序列,比如花括号括起来的初始值列表,数组,vector,string都可以。 + +declaration定义变量,这里坐哈使用auto类型说明符,如果需要对序列中的元素执行操作,则使用引用类型。 + + + +#### 5.4.4 do while语句 + +do while和while基本一样,只是do while会先执行循环体再检查 + +```c++ +do + statement +while(condition);//注意这里的分号 +``` + +```c++ +do{ + cout << "Hello World!" +}while(0);//及时条件为假,也会先执行do一次 +``` + + + + + +### 5.5 跳转语句 + +* 跳转语句中断当前的执行过程。C++语言提供了4种跳转语句:**break、continue、goto和return。** + +#### 5.5.1 break语句 + +* break语句(break statement)负责**终止 *离它最近* 的while、do while、for或switch语句**,并从这些语句之后的第一条语句开始继续执行。 + +* break只能出现在循环语句中(迭代语句) + +#### 5.5.2 continue语句 + +* continue语句(continue statement)终止最近的循环中的**当前迭代 **并立即开始下一次迭代。 + +#### 5.5.3 goto语句 + +goto语句(goto statement)的作用是从goto语句**无条件跳转到同一函数内**的另一条语句。 + +```c++ +goto label; + +... +label: +... +``` + +```c++ +goto xxx; + +int a=0; + +xxx: + +cout << a << endl;//错误,goto跳转忽略了定义关键字a +``` + +* 尽量不要使用 goto + +### 5.6 try语句块和异常处理 + +异常是指运行时的反常行为,这些行为超出了函数的正常工作范围,典型的异常有数据库连接失败,遇到意外输入。 + +c++异常处理 + +* throw表达式 +* try语句块:以一个或者多个catch结束 + +* 一套异常类:用于在throw表达式和相关的catch子句之间传递异常的具体信息 + +#### 5.6.1 throw表达式 + +抛出异常,将终止当前函数,并把控制权交给能处理该异常的代码 + +```c++ +if (0){ + throw runtime_error("错误信息"); +} +``` + +* 类型runtime_error是标准库异常类型的一种,定义在stdexcept头文件中。关于标准库异常类型更多的知识将在5.6.3节(第176页)介绍。我们必须初始化runtime_error的对象,方式是给它提供一个string对象或者一个C风格的字符串(参见3.5.4节,第109页),这个字符串中有一些关于异常的辅助信息。 + + + +#### 5.6.2 try语句块 + +语法格式 + +```c++ +try { + //尝试运行 +}catch(exception-declaration){ + //异常处理 +}catch(exception-declaration){ + //异常处理 +}//..... +``` + +```c++ +try{ + //尝试运行 +}catch(runtime_error err){ + cout << "出现错误" << endl; +} +``` + +#### 5.6.3 标准异常 + +C++标准库定义了一组类,用于**报告标准库函数遇到的问题**。这些异常类也可以在用户编写的程序中使用,它们分别定义在**4个头文件**中: + +* exception头文件:定义了最通用的异常类,只报告异常发生,不提供任何额外信息 +* stdexcept头文件:定义了几种常用的异常类,表5.1 +* new头文件:定义了bad_alloc异常类型 +* type_info头文件:定义了bad_cast + +| | | +| ---------------- | ------------------------------ | +| exception | 最常见错误 | +| Runtime_error | 运行时才能检测的错误 | +| Range_error | 运行时错误,超出有意义的值范围 | +| Overflow_error | 运行时错误,计算上溢出 | +| Underflow_error | 运行时错误,计算下溢出 | +| Logic_error | 逻辑错误 | +| Domain_error | 逻辑错误,参数对应结果值不存在 | +| Invalid_argument | 逻辑错误,无效参数 | +| Length_error | 逻辑错误,超出类型最大长度 | +| Out_of_range | 逻辑错误,使用超出范围的值 | + + + + + +## 第6章 函数 + +* 函数是一个命名了的代码块,我们通过调用函数执行相应的代码。函数可以有0个或多个参数,而且(通常)会产生一个结果。可以重载函数,也就是说,同一个名字可以对应几个不同的函数。 + +### 6.1 函数基础 + +一个典型函数,包括:返回类型,函数名字,由0或多个形参组成的列表以及函数体。其中形参用逗号隔开。 + +* 大多数类型都能用作函数的返回类型。一种特殊的返回类型是void,它表示函数不返回任何值。**函数的返回类型不能是数组类型或函数类型,但可以是指向数组或函数的指针。**我们将在6.3.3节(第205页)介绍如何定义一种特殊的函数,它的返回值是数组的指针(或引用),在6.7节(第221页)将介绍如何返回指向函数的指针。 +* 在调用函数时,实参也可以被转换如形参是int时,实参是一个浮点型,将会被整形化。 +* 为了与c语言兼容无形参的函数可以这样写 `int x(void){};`这里`void`可以省略 + +```c++ +//6.1.test.cpp +#include + +using namespace std; + +int fact(int x);//如果函数出现在调用之后,需要声明 + +int main(){ + cout << "请输入一个数,将计算它的阶乘" << endl; + + int x; + cin >> x; + cout << "阶乘为:"; + cout << fact(x) << endl; + + return 0; +} + +int fact(int x){ + int i,j; + for(i=1;i<=x;i++){ + j =i*j; + } + + return j; +} +``` + + + +#### 6.1.1 局部对象 + +C++语言中,名字有作用域,对象有生命周期。 + + + +* 名字的作用域是程序文本的一部分,名字只在其作用域内可见 +* 对象的生命周期是程序执行过程中该对象存在的一段时间 + +**自动对象**:函数控制语句经过定义变量时创建该对象,当这个块结束时自动销毁,块中自动创建的对象称为自动对象,形参也是自动对象 + +**局部静态对象**:变量从定义开始贯穿全局,知道整个程序结束。 + +```c++ +//函数调用计数 +int a(){ + static int i=0;//调用结束后,这个值依然有效 + return ++i; +} + +int main(){ + for (int a=0;a<10;a++){ + cout << a() << endl; + } +} +``` + + + +#### 6.1.2 函数声明 + +函数在使用前需要声明 + + + +### 6.1.3 分离式编译 + +分割文件 + + + +### 6.2 参数传递 + +#### 6.2.1 传值参数 + +通过指针,可以通过调用函数修改函数外的值 + +```C++ +//6.2.1传值参数.cpp +#include + +using namespace std; + +void x(int *i); + +int main(){ + int i=12; + x(&i); + cout << i << endl; + + return 0; +} + +void x(int *i){ + *i=0;//这里修改了i所指的对象的值; + i=0;//这里只是修改了i所指的对象; +} +``` + +#### 6.2.2 传引用参数 + +```c++ +void a(int &i){ + i=111; +} + +int main(){ + int x=2; + a(x); + + return; +} +``` + +* 一个函数只能返回一个值,然而有时函数需要同时返回多个值,**引用形参为我们一次返回多个结果提供了有效的途径。** + + + +#### 6.2.3 const形参和实参 + +* 当用实参初始化形参时会忽**略掉顶层const**。换句话说,形参的顶层const被忽略掉了。 + +因此,可以这样子。 + +```c++ +//6.2.3const形参和实参.cpp +#include + +using namespace std; + +void fa(const int as); +void fb(int as); + +int main(){ + int x=1,y=2; + const int a=1,b=2; + + fa(x); + fa(a); + + fb(y); + fb(b); + + return 0; +} + +void fa(const int as){ +// 无法修改值 +} + +void fb(int as){ +// 可修改值 + as=12; + +} +``` + + + +#### 6.2.4 数组形参 + + + +形参传递数组,实际上是引用数组的指针 + +```c++ +void a(int *a); +void a(int a[]); +void a(int a[10]);//注意这里的维度限定 + +//以上实际上效果一样 +``` + +* 如果我们传给函数的是一个数组,则**实参自动地转换成指向数组首元素的指针**,数组的大小对函数的调用没有影响。 +* 和其他使用数组的代码一样,以数组作为形参的函数也必须确保使用数组时不会越界。 + +**使用标准库规范判断数组长度** + +**传递一个表示数组大小的形参** + +* 数组形参和const + + 一般不改变数组内容时,可以使用const + +* 数组引用形参 + + ```c++ + f(int (&a)[10]); + ``` + + + +***引用不是对象,没有指针*** + +```c++ +//6.2.4.2数组参数.cpp +#include + +using namespace std; + +void showarr(int *&a); +void showptr(int *&a); + +int main(){ + int arr[]={1,4,7},*p=arr;//使用这个例子中的做法需要先把数组显式转化为指针 + showarr(p); + int a=12,*ptr=&a; + showptr(ptr); + cout << a << endl; + return 0; +} + + +void showarr(int *&a){ + cout << *a << endl; + a++; + cout << *a << endl; +} + +void showptr(int *&a){//这里是对数组的引用 + cout << *a << endl; + *a=11; +} +``` + +* 引用不能用指针,只能使用*& +* 对数组进行引用使用指针的方式时,必须显式的转化数组为指针 + +```c++ +//6.2.4.3数组参数.cpp +#include + +using namespace std; + +void ass(int (&a)[4]); + +int main(){ + int a[]={12,222,3,44}; + ass(a); + return 0; +} + +void ass(int (&a)[4]){//这里必须指明维度 + cout << a[0] << endl; +} +``` + +* 使用这种方式,必须指明维度 + + + +#### 6.2.5 main:处理命令行选项 + +```c++ +#include +using namespace std; +int main(int argc,char *argv[]) +//第一个参数是命令行键入的参数个数 +//第二个参数是命令行参数的尸体,以空格分开,还可以写成char ** argv +{ + cout << "argc= " << argc << endl; + for (int i = 0; i + +using namespace std; + +string read(); + +int mian(){ + bool read =false;//这里隐藏掉了外部的read()函数 + string s=read();//错误,上一个语句造成外部的read()函数呗 +} +``` + +**使用过后再定义** + +```c++ +#include + +using namespace std; + +int a(); + +int main(){ + cout << a() << endl; + + string a="xsaxa";//使用过后再重新定义也是可行的 + + cout << a << endl; + + return 0; +} + +int a(){ + return 2; +} +``` + + + +### 6.5 特殊用途语言特性 + +#### 6.5.1默认实参 + +定义函数时可以定义默认的参数 + +**一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。** + +```c++ +#include + +using namespace std; + +//void a(int i1=1,int i2);//有默认值的后面的参数都必须有默认值 +void a(int i1,int i2=2); + +int main(){ + a(1,2); + return 0; +} + +void a(int i1,int i2){ + cout << i1 << i2 << endl; +} +``` + +使用默认实参函数,尽量吧不需要修改的放在后面,因为前面的不能空 + +#### 6.5.2 内联函数和constexpr函数 + +调用函数一般比求等价表达式的值要慢一些。 + +**内联函数可避免函数调用的开销** + +> 吧函数表达式直接放在普通表达式中间,就相当于在普通表达式中执行了函数的内容,这样会避免函数的调用开销(对寄存器的操作) + +```c++ +cout << a(s1,s2) << endl; +// 相当于 +cout << s1 + +using namespace std; + +void f(int); +//void f(int,int=2); + +int main(){ + f(2);//call to 'f' is ambiguous,函数调用不明确 + + return 0; +} + +void f(int x){ + cout << x << endl; +} + +void f(int x,int y){ + cout << x << endl; +} +``` + +#### 6.6.1 实参类型转换 + +为了确定最佳匹配,编译器将实参类型到形参类型的转换划分成几个等级: + +1. 精确匹配 +2. 通过const转换实现的匹配 +3. 通过类型提升实现的匹配 +4. 通过算术类型转换 +5. 通过类类型转换实现的匹配 + + + +### *6.7 函数指针 + +指针函数 + +```c++ +int *a();//本身是一个指针,返回的是int +``` + +函数指针 + +```c++ +int (*a)();//返回的事一个指针 +``` + +函数指针的调用可以不需要解引用 + +```c++ +int (*a)(int); + +int i1=a(2); +int i2=(*a)(2);//这俩等价 +``` + + + +**重载函数的指针** + +指针类型必须精确匹配 + + + + + +## 第7章 类 + +使用类定义自己的数据类型 + +基本思想:数据抽象和封装,数据抽象以来接口和实现分离的程式设计技术 + +### 7.1 定义抽象数据类型 + + + +## 第7章 类<皮德常> + +过程化程序设计的缺陷: + +1 大量的全局变量 + +2 陈旭复杂,成千上万的函数 + +3 程序难以进行修改和扩充 + +4 以过程为中心(函数) + +5 OOP以对象为中心,数据和对数据的操作封装起来 + + + +### 7.1 类的基本概念 + +用户自定义的**类型** + +#### 7.1.1 类的定义 + +```c++ +class FirstClass{ + private://默认 + float width; + float length; + float area; + // 以上在类中称为 属性 + + public: + void setData(float,float); + void calcArea(); + // 以上在类中称为方法 + + // 下面还可以再写私有成员,但是不建议 +};//注意这里的分号 +``` + +默认情况下,类的成员是私有的,struct(结构体)是公有的 + +#### 7.1.2 成员函数的定义 + +1 成员函数定义与普通函数定义相似 + +2 成员函数一般在外部定义: + +```c++ +<返回值类型> <类名>::<函数名>(参数列表){ + ... +} +void FirstClass::setData(float a,float b){ + width=a;//这里是上面类中的属性 + height=b; +} +``` + +#### 7.1.3 定义对象(类的调用) + +```c++ +FirstClass box; +box.setData(1,2); +FirstClass *boxPtr; +boxPtr=&box; +``` + +### 7.2 类的多文件组织方式 + +组织方式: + +1 类定义.h + +2 成员函数.cpp(内联函数必须和类定义在同一个文件中) + +3 应用程序通过#include包含头文件 + +文件组成 + +a.h + +a.cpp//#include "a.h" + +s.cpp//#include "a.h" + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/hello_world b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/hello_world new file mode 100644 index 0000000..c68c3f4 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/hello_world differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/hello_world.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/hello_world.cpp new file mode 100644 index 0000000..2f57c0b --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/hello_world.cpp @@ -0,0 +1,9 @@ +#include + +using namespace std; + +int main(){ + cout << "Hello World!" << endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/io b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/io new file mode 100644 index 0000000..c3392c9 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/io differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/io.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/io.cpp new file mode 100644 index 0000000..9de04b8 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/io.cpp @@ -0,0 +1,11 @@ +#include + +int main(){ + std::cout << "请输入两个数字" << std::endl; + + int val1=0,val2=0; + std::cin >> val1 >> val2; + std::cout << "数字和为:" << val1+val2 << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/io.test.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/io.test.cpp new file mode 100644 index 0000000..8406b02 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.1-1.2/io.test.cpp @@ -0,0 +1,9 @@ +#include + +int main(){ + std::cout << "正在测试输出流的~??"; + << "这样子可以吗" << std::endl; + return 0; +} + + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.1while b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.1while new file mode 100644 index 0000000..946a383 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.1while differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.1while.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.1while.cpp new file mode 100644 index 0000000..270fd9e --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.1while.cpp @@ -0,0 +1,13 @@ +#include + +int main(){ + std::cout << "计算1到10的值" << std::endl; + int i=0,sum=0; + while(i<=10){ + sum=sum + i; + i++; + } + std::cout <<"和为:" << sum << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.1while.test.1 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.1while.test.1 new file mode 100644 index 0000000..c4280e0 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.1while.test.1 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.1while.test.1.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.1while.test.1.cpp new file mode 100644 index 0000000..ab2bf8e --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.1while.test.1.cpp @@ -0,0 +1,21 @@ +#include + +int main(){ + std::cout << "请输入两个数,我们将计算他们之间的数字的和,包括他们。"; + int x=0,y=0; + + std::cin >> x >> y; + + int sum=0; +// while(x + +int main(){ + std::cout << "计算0到100的加法." << std::endl; + + int sum=0; + for(int i=0;i<=100;i++){ + sum=sum+i; + std::cout << i << std::endl; + } + std::cout << "和为:" << sum << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.3读取数量不等的输入数据 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.3读取数量不等的输入数据 new file mode 100644 index 0000000..0ea9c24 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.3读取数量不等的输入数据 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.3读取数量不等的输入数据.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.3读取数量不等的输入数据.cpp new file mode 100644 index 0000000..5c5d6a5 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.3读取数量不等的输入数据.cpp @@ -0,0 +1,16 @@ +#include + +int main(){ + std::cout << "输入数字,求取他们的和" << std::endl; + + int sum=0,x=0; + while(std::cin >> x){ + sum=sum+x; + std::cout << sum << std::endl; + } + + return 0; +} + + +// 此程序会在输入中遇到非int字符时停止因为,循环头条件为假。 diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.4if b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.4if new file mode 100644 index 0000000..5772935 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.4if differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.4if.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.4if.cpp new file mode 100644 index 0000000..f251859 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.4/1.4.4if.cpp @@ -0,0 +1,24 @@ +#include + +int main(){ + std::cout << "输入数字以运行" << std::endl; + + int val1=0; + + if(std::cin >> val1){ +// 如果输入的是数字将会继续 + int val2=0,ssc=1; + while(std::cin >> val2){ + if(val1==val2){ + ssc++; + std::cout << "这个数字连续出现第" << ssc << std::endl; + }else{ + val1=val2; + ssc=1; + std::cout << "这个数字第一次出现" << std::endl; + } + } + } + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.5.1Sales_item类 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.5.1Sales_item类 new file mode 100644 index 0000000..6c2d331 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.5.1Sales_item类 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.5.1Sales_item类.2 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.5.1Sales_item类.2 new file mode 100644 index 0000000..8ddd2df Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.5.1Sales_item类.2 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.5.1Sales_item类.2.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.5.1Sales_item类.2.cpp new file mode 100644 index 0000000..55ab377 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.5.1Sales_item类.2.cpp @@ -0,0 +1,16 @@ +#include +#include "Sales_item.h" + +int main(){ + Sales_item book1,book2; + std::cout << "请输入两个数" << " 格式为 四位isbn号 书数量 书单价" << std::endl; + + std::cin >> book1 >> book2; + if(book1.isbn()==book2.isbn()){ + std::cout << book1+book2 << std::endl; + return 0; + }else{ + std::cout << "两个书的ISBN码不一样,无法相加!" << std::endl; + return -1; + } +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.5.1Sales_item类.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.5.1Sales_item类.cpp new file mode 100644 index 0000000..f3a05d1 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.5.1Sales_item类.cpp @@ -0,0 +1,12 @@ +#include +#include "Sales_item.h"//导入Sales_item类/库 + +int main(){ + Sales_item book; + std::cin >> book; +// 格式为: xxx-xxx-xxx-xxx int int 即 ISBN 数量 单价 + std::cout << book << std::endl; +// 输出了书的isbn码 书的数量 总价 平均价 + return 0; +} + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.6书店程序 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.6书店程序 new file mode 100644 index 0000000..85ec00e Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.6书店程序 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.6书店程序.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.6书店程序.cpp new file mode 100644 index 0000000..09083ae --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/1/1.5/1.6书店程序.cpp @@ -0,0 +1,24 @@ +#include +#include "Sales_item.h" + +int main(){ + std::cout << "请输入书信息:" << std::endl; + + Sales_item book1,book2; + + if(std::cin >> book1){ + while(std::cin >> book2){ + if(book1.isbn()==book2.isbn()){ + book1 += book2; + }else{ + std::cout << book1 < +#include + +class Sales_item { +// these declarations are explained section 7.2.1, p. 270 +// and in chapter 14, pages 557, 558, 561 +friend std::istream& operator>>(std::istream&, Sales_item&); +friend std::ostream& operator<<(std::ostream&, const Sales_item&); +friend bool operator<(const Sales_item&, const Sales_item&); +friend bool +operator==(const Sales_item&, const Sales_item&); +public: + // constructors are explained in section 7.1.4, pages 262 - 265 + // default constructor needed to initialize members of built-in type + Sales_item() = default; + Sales_item(const std::string &book): bookNo(book) { } + Sales_item(std::istream &is) { is >> *this; } +public: + // operations on Sales_item objects + // member binary operator: left-hand operand bound to implicit this pointer + Sales_item& operator+=(const Sales_item&); + + // operations on Sales_item objects + std::string isbn() const { return bookNo; } + double avg_price() const; +// private members as before +private: + std::string bookNo; // implicitly initialized to the empty string + unsigned units_sold = 0; // explicitly initialized + double revenue = 0.0; +}; + +// used in chapter 10 +inline +bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs) +{ return lhs.isbn() == rhs.isbn(); } + +// nonmember binary operator: must declare a parameter for each operand +Sales_item operator+(const Sales_item&, const Sales_item&); + +inline bool +operator==(const Sales_item &lhs, const Sales_item &rhs) +{ + // must be made a friend of Sales_item + return lhs.units_sold == rhs.units_sold && + lhs.revenue == rhs.revenue && + lhs.isbn() == rhs.isbn(); +} + +inline bool +operator!=(const Sales_item &lhs, const Sales_item &rhs) +{ + return !(lhs == rhs); // != defined in terms of operator== +} + +// assumes that both objects refer to the same ISBN +Sales_item& Sales_item::operator+=(const Sales_item& rhs) +{ + units_sold += rhs.units_sold; + revenue += rhs.revenue; + return *this; +} + +// assumes that both objects refer to the same ISBN +Sales_item +operator+(const Sales_item& lhs, const Sales_item& rhs) +{ + Sales_item ret(lhs); // copy (|lhs|) into a local object that we'll return + ret += rhs; // add in the contents of (|rhs|) + return ret; // return (|ret|) by value +} + +std::istream& +operator>>(std::istream& in, Sales_item& s) +{ + double price; + in >> s.bookNo >> s.units_sold >> price; + // check that the inputs succeeded + if (in) + s.revenue = s.units_sold * price; + else + s = Sales_item(); // input failed: reset object to default state + return in; +} + +std::ostream& +operator<<(std::ostream& out, const Sales_item& s) +{ + out << s.isbn() << " " << s.units_sold << " " + << s.revenue << " " << s.avg_price(); + return out; +} + +double Sales_item::avg_price() const +{ + if (units_sold) + return revenue/units_sold; + else + return 0; +} +#endif diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.1算数类型和 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.1算数类型和 new file mode 100644 index 0000000..2e34473 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.1算数类型和 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.1算数类型和.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.1算数类型和.cpp new file mode 100644 index 0000000..5bf3bdb --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.1算数类型和.cpp @@ -0,0 +1,9 @@ +#include + +int main(){ + std::cout << "将显示字符的所占空间大小和最值" << std::endl; + + std::cout << sizeof(int) << "Byte" << std::endl; + std::cout << "最大值:" << max(int) << std::endl; + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.2类型转换 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.2类型转换 new file mode 100644 index 0000000..97be5dc Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.2类型转换 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.2类型转换.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.2类型转换.cpp new file mode 100644 index 0000000..01ed7ce --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.2类型转换.cpp @@ -0,0 +1,16 @@ +#include + +int main(){ + std::cout << "类型转化" << std::endl; + + int a=-1; + unsigned int b=2; + + std::cout << "存在无符号数的表达式中如果有符号的数为负数可能会出错" << std::endl; + std::cout << "如: 有符号a=-1,无符号b=2,连个数字执行加法运算,值为:" << b+a < +#include + +int main(){ + std::cout << "Who goes with F\145rgus?\012" << typeid("Who goes with F\145rgus?\012").name() << std::endl; + + std::cout << "3.14e1L" << typeid(3.14e1L).name() << std::endl; + + std::cout << "1024f" << typeid("1024f").name() << std::endl; + + std::cout << "3.14L" << typeid("3.14L").name() << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.3字面值常量.3 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.3字面值常量.3 new file mode 100644 index 0000000..4437fa3 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.3字面值常量.3 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.3字面值常量.3.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.3字面值常量.3.cpp new file mode 100644 index 0000000..a7fc033 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.3字面值常量.3.cpp @@ -0,0 +1,10 @@ +#include + +int main(){ +// 没有10进制转义字符,只有8进制 + std::cout << "\062\115\12" << std::endl;//转义8进制 + + std::cout << "\x32\x09\x4d" << std::endl;//转义16进制 + return 0; +} + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.3字面值常量.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.3字面值常量.cpp new file mode 100644 index 0000000..49eac05 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1.3字面值常量.cpp @@ -0,0 +1,8 @@ +#include + +int main(){ + std::cout << "'a'" << 'a' << std::endl; + + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1字符大小和类型测试 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1字符大小和类型测试 new file mode 100644 index 0000000..cd42f12 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1字符大小和类型测试 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1字符大小和类型测试.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1字符大小和类型测试.cpp new file mode 100644 index 0000000..743e89c --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.1/2.1字符大小和类型测试.cpp @@ -0,0 +1,25 @@ +#include +#include + +using namespace std; + +int main(){ + int a; + cout << "a的数据类型为:" << typeid(a).name() << endl; + + + cout << "int " << sizeof(int) << endl; + cout << "bool " << sizeof(bool) << endl; + cout << "char " << sizeof(char) << endl; + cout << "wchar_t " << sizeof(wchar_t) << endl; + cout << "char16_t " << sizeof(char16_t) << endl; + cout << "char32_t " << sizeof(char32_t) << endl; + cout << "short " << sizeof(short) << endl; + cout << "long " << sizeof(long) << endl; + cout << "long long " << sizeof(long long) << endl; + cout << "float " << sizeof(float) << endl; + cout << "double " << sizeof(double) << endl; + cout << "long double" << sizeof(long double) << endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.1.1初始化变量 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.1.1初始化变量 new file mode 100644 index 0000000..378cbfe Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.1.1初始化变量 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.1.1初始化变量.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.1.1初始化变量.cpp new file mode 100644 index 0000000..1cc3893 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.1.1初始化变量.cpp @@ -0,0 +1,11 @@ +#include + +int main(){ +// std::cin >> int x;//不能在这里定义 +// std::cout << x << std::endl; +// int i={3.14};//初始化不能丢失数据,浮点型不能初始化整型 +// double n=p=99.99;//p未定义 + int x=3.14; + std::cout << x << std::endl; + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.1.2初始化变量 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.1.2初始化变量 new file mode 100644 index 0000000..bfdeb20 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.1.2初始化变量 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.1.2初始化变量.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.1.2初始化变量.cpp new file mode 100644 index 0000000..0390333 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.1.2初始化变量.cpp @@ -0,0 +1,18 @@ +#include +#include + +std::string str; +int x; + +int main(){ + int y; + std::string str2; + + std::cout << str < + +int main(){ + extern const int x; +// std::cout << &x << std::endl; + +// x=21; + + std::cout << &x << "---" << x << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.4作用域 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.4作用域 new file mode 100644 index 0000000..fa93dde Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.4作用域 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.4作用域.2 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.4作用域.2 new file mode 100644 index 0000000..37f4b9c Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.4作用域.2 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.4作用域.2.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.4作用域.2.cpp new file mode 100644 index 0000000..a2c246f --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.4作用域.2.cpp @@ -0,0 +1,13 @@ +#include + +int main(){ + int i=100,sum=0; + + for(int i=0;i<10;i++){ + sum=sum+i; + } + + std::cout << i << " " << sum << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.4作用域.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.4作用域.cpp new file mode 100644 index 0000000..1d98aee --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.2/2.2.4作用域.cpp @@ -0,0 +1,19 @@ +#include + +int x=42; + +int main(){ + int y=0; +// 显示全局变量 + + std::cout << x << " " << y << std::endl; + int x=0; +// 显示局部变量 + + std::cout << x << " " << y << std::endl; +// 显式的访问全局变量 + + std::cout << ::x << " " << y << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.1引用 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.1引用 new file mode 100644 index 0000000..5059797 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.1引用 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.1引用.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.1引用.cpp new file mode 100644 index 0000000..c016e9b --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.1引用.cpp @@ -0,0 +1,12 @@ +#include + +int main(){ + int x=123; + int &xs=x;//引用x + + xs=124;//实际上改变了x; + + std::cout << "x" << x << "&xs=x" << xs << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.2.1指针测试-指向引用 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.2.1指针测试-指向引用 new file mode 100644 index 0000000..ba8772e Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.2.1指针测试-指向引用 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.2.1指针测试-指向引用.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.2.1指针测试-指向引用.cpp new file mode 100644 index 0000000..068e905 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.2.1指针测试-指向引用.cpp @@ -0,0 +1,15 @@ +#include + +int main(){ + int x=24; + + int *ptrx=&x; + + int &xs=x; + + int *ptrxs=&xs; + + std::cout << ptrx << std::endl; + std::cout << ptrxs < + +int main(){ + + void *ptr0 = nullptr; + + int x=136; + + ptr0=&x;//取x的地址赋给ptr指针 + + std::cout << "ptr指向的地址" << ptr0 << std::endl; + std::cout << "void指针无法访问其对象" << std::endl; + + double y=123.32; + + ptr0 = &y; + std::cout << "void指针可以指向任何值,并且可以修改" << ptr0 < + +int main(){ + int x=12,*ptr=&x; + + std::cout << "指向的地址ptr" << ptr << "指向的对象值" << *ptr << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.2.4指针赋值合法性 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.2.4指针赋值合法性 new file mode 100644 index 0000000..ea9de57 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.2.4指针赋值合法性 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.2.4指针赋值合法性.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.2.4指针赋值合法性.cpp new file mode 100644 index 0000000..930a962 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.2.4指针赋值合法性.cpp @@ -0,0 +1,8 @@ +#include + +int main(){ + int x=13; + int* ptr=&x; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.3.1指针指向未赋值的数 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.3.1指针指向未赋值的数 new file mode 100644 index 0000000..4331b16 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.3.1指针指向未赋值的数 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.3.1指针指向未赋值的数.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.3.1指针指向未赋值的数.cpp new file mode 100644 index 0000000..e335b66 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.3.1指针指向未赋值的数.cpp @@ -0,0 +1,10 @@ +#include + +int main(){ + int x,*ptr=&x; + + std::cout << ptr << std::endl; + std::cout << *ptr << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.3.2复合指针 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.3.2复合指针 new file mode 100644 index 0000000..5eedb24 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.3.2复合指针 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.3.2复合指针.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.3.2复合指针.cpp new file mode 100644 index 0000000..89a5370 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.3/2.3.3.2复合指针.cpp @@ -0,0 +1,24 @@ +#include + +int main(){ + int x=10,*ptr=&x,*pts=ptr; + + std::cout << x << std::endl; + std::cout << *ptr << "->" << ptr << std::endl; + std::cout << "ptr的地址" << &ptr << std::endl; + std::cout << *pts << "->" << pts << std::endl; + std::cout << "以上为指向同一个空间的指针" << std::endl; + + + + int y=20,*ptr2=&y,**pts2=&ptr2; + std::cout << y << std::endl; + std::cout << *ptr2 << "->" << ptr2 << std::endl; + std::cout << "ptr2的地址" << &ptr2 << std::endl; + std::cout << *pts2 << "->" << pts2 << std::endl; + + std::cout << "解引用" << **pts2 << std::endl; + + return 0; +} + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.1常量引用 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.1常量引用 new file mode 100644 index 0000000..e636bcd Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.1常量引用 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.1常量引用.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.1常量引用.cpp new file mode 100644 index 0000000..c597548 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.1常量引用.cpp @@ -0,0 +1,18 @@ +#include + +int main(){ + int x=10; + const int &y=x; + + std::cout << &x << std::endl; + std::cout << &y << std::endl; + + + x=12; + std::cout << x << std::endl; + std::cout << &x << std::endl; + + std::cout << y << std::endl; + std::cout << &y << std::endl; + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.2.2双层常量指针 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.2.2双层常量指针 new file mode 100644 index 0000000..804037c Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.2.2双层常量指针 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.2.2双层常量指针.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.2.2双层常量指针.cpp new file mode 100644 index 0000000..1ddcff4 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.2.2双层常量指针.cpp @@ -0,0 +1,34 @@ +#include + +int main(){ + const int xs=10; +// int *pts=&xs;//必须添加底层常量 + const int *pts=&xs; + + + + + int x=1,y=2; + const int *ptr1; + std::cout << "普通指针指向一个常量,无法通过指针修改常量,同时不可以可以指向一个字面值?,跟引用不一样,不会有(temp)" << std::endl; +// ptr1=10;//错误,无法像引用一样 + const int &z=21; + + ptr1=&x;//可以赋值 +// *ptr1=11;//但不能修改值 + + + int *const ptr2=&y;//这是一个常量指针,必须初始化 +// ptr2=&x//不能再指向其他量; + *ptr2=3;//但可以修改 + std::cout << "通过指针修改值" << *ptr2 << "-> y" << y << std::endl; + + const int *const ptr3=&x;//必须赋值,因为这是一个常量指针(*const ptr3),并且他指向一个常量(const int); + std::cout << "尝试修改常量:失败" << std::endl; +// *ptr3=10;//错误无法通过指针修改指向的常量(因为指向的是一个常量) +// ptr3=&y; + std::cout << "尝试修改常量指针:肯定失败" << std::endl; + std::cout << "得出结论,常量指针指向了一个常量,无法通过常量指针修改常量,也无法修改常量指针(即无法重新指向另一个对象)" << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.2指针和const b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.2指针和const new file mode 100644 index 0000000..5ce7a14 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.2指针和const differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.2指针和const.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.2指针和const.cpp new file mode 100644 index 0000000..267c1d3 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.2指针和const.cpp @@ -0,0 +1,24 @@ +#include + +int main(){ + std::cout << "定义一个变量x=10,一个常量指针ptr1指向这个x。" << std::endl; + + int x=10; + const int *ptr1=&x; + std::cout << "x: " << x << " &x: " << &x << std::endl; + std::cout << "ptr1: " << ptr1 << " *ptr1: " << *ptr1 << " &ptr1: " << &ptr1 << std::endl; + + const int y =13; +// int *ptr2=&y;//错误,常量不能由普通指针指向 + const int *ptr2=&y; + const int **ptrs1=&ptr2; + + std::cout << "y: " << y << " &y: " << &y << std::endl; + std::cout << "ptr2: " << ptr2 << " *ptr2: " << *ptr2 << " &ptr2: " << &ptr2 << std::endl; + std::cout << "ptrs1: " << ptrs1 << " *ptrs1: " << *ptrs1 << " &ptrs1: " << &ptrs1 << std::endl; + + + + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.1常量表达式 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.1常量表达式 new file mode 100644 index 0000000..c6653f1 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.1常量表达式 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.1常量表达式.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.1常量表达式.cpp new file mode 100644 index 0000000..fc53421 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.1常量表达式.cpp @@ -0,0 +1,16 @@ +#include + +int main(){ + int x=10; +// constexpr int y=x;//int x不是常量,所以这里报错 + + const int y=x;//这里也不是常量表达式 +// constexpr y;//这里才是常量表达式 + + const int z=y; + + constexpr int a=1; + constexpr int b=a+1; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.2指针常量表达式 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.2指针常量表达式 new file mode 100644 index 0000000..e7beab0 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.2指针常量表达式 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.2指针常量表达式.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.2指针常量表达式.cpp new file mode 100644 index 0000000..6a9256a --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.2指针常量表达式.cpp @@ -0,0 +1,12 @@ +#include + +int main(){ + int x=10; +// const int y=x;//y不是一个常量表达式 + const int y=11; +// constexpr const int *const ptr=&y;//&y不是一个常量表达式,因为内存地址不确定 + + constexpr int *ptr=0; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.3全局变量指针常量表达式 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.3全局变量指针常量表达式 new file mode 100644 index 0000000..8a53154 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.3全局变量指针常量表达式 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.3全局变量指针常量表达式.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.3全局变量指针常量表达式.cpp new file mode 100644 index 0000000..fca4a16 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.4/2.4.4.3全局变量指针常量表达式.cpp @@ -0,0 +1,9 @@ +#include + +int x=10; + +int main(){ + constexpr int *y=&x; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.1类型别名测试 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.1类型别名测试 new file mode 100644 index 0000000..35a6fee Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.1类型别名测试 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.1类型别名测试.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.1类型别名测试.cpp new file mode 100644 index 0000000..550e708 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.1类型别名测试.cpp @@ -0,0 +1,13 @@ +#include + +int main(){ + typedef double dub; + dub x=12.2; + std::cout << x << std::endl; + + typedef dub *dubptr; + dubptr ptr1=&x,ptr2=0; + std::cout << ptr1 << ptr2 << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.2类型别名测试 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.2类型别名测试 new file mode 100644 index 0000000..bbaa829 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.2类型别名测试 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.2类型别名测试.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.2类型别名测试.cpp new file mode 100644 index 0000000..823e597 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.2类型别名测试.cpp @@ -0,0 +1,14 @@ +#include + +int main(){ + using zs = int; + zs x=12; + std::cout << x << std::endl; + + using zsptr =int*; + zsptr xptr=&x; + std::cout << xptr << " " << *xptr << std::endl; + + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.3指针类型别名测试 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.3指针类型别名测试 new file mode 100644 index 0000000..43a894b Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.3指针类型别名测试 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.3指针类型别名测试.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.3指针类型别名测试.cpp new file mode 100644 index 0000000..cc64b26 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.3指针类型别名测试.cpp @@ -0,0 +1,15 @@ +#include + +int main(){ + using iptr = int*;//iptr是一个声明整型指针的标识符 + + int x=12; + iptr xptr = &x; + iptr *xptrs = &xptr;//指向指针的指针 + + std::cout << x << std::endl; + std::cout << "指针:" << xptr << " " << &xptr << " " << *xptr << std::endl; + std::cout << "指针的指针 :" << xptrs << " " << &xptrs << " " << *xptrs << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.4常量类型别名 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.4常量类型别名 new file mode 100644 index 0000000..b7df511 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.4常量类型别名 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.4常量类型别名.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.4常量类型别名.cpp new file mode 100644 index 0000000..f4128a3 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.4常量类型别名.cpp @@ -0,0 +1,11 @@ +#include + +int main(){ + using ci = const int; + ci x = 10; + std::cout << x << std::endl; + +// 尝试修改这个x +// x=11;//无法修改 + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.5常量指针和纸箱厂量的指针别名 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.5常量指针和纸箱厂量的指针别名 new file mode 100644 index 0000000..590629a Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.5常量指针和纸箱厂量的指针别名 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.5常量指针和纸箱厂量的指针别名.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.5常量指针和纸箱厂量的指针别名.cpp new file mode 100644 index 0000000..7ed1ed0 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.1.5常量指针和纸箱厂量的指针别名.cpp @@ -0,0 +1,28 @@ +#include + +int main(){ + using iptr1 =const int *const;//底层和顶层 + using iptr2 =const int*;//底层 + using iptr3 =int *const; + + int x=1; + const int y =2; + iptr1 x1=&x;//正确 + iptr1 y1=&y;//正确, + +// x1和y1都不能再改变,也不能通过指针改变指向的值 + + iptr2 x2=&x;//正确 + iptr2 y2=&y;//正确 + +// 自己本身可以再指向其他的也就是可以改变自己,但是不能改变指向值,这是一个底层常量 + + iptr3 x3=&x;//自己是一个常量不能再改变,只能指向非常量,并且可以改变指向的值 +// iptr3 y3=&y;//报错 + +// 自身不能再改变,只能指向非常量,可以改变指向值 + + + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.2.1auto说明符 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.2.1auto说明符 new file mode 100644 index 0000000..27260cf Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.2.1auto说明符 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.2.1auto说明符.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.2.1auto说明符.cpp new file mode 100644 index 0000000..66df359 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.2.1auto说明符.cpp @@ -0,0 +1,12 @@ +#include +#include +int main(){ + double x=12.0; + auto y=x; + auto z=&x; + + std::cout << typeid(y).name() < + +int main(){ + int x=10; + auto y=11,*z=&x; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.2.3不同类型auto b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.2.3不同类型auto new file mode 100644 index 0000000..1f3f5f2 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.2.3不同类型auto differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.2.3不同类型auto.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.2.3不同类型auto.cpp new file mode 100644 index 0000000..82ac565 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.2.3不同类型auto.cpp @@ -0,0 +1,41 @@ +#include + +int main(){ + int a=0; + const int b=a; + + auto ace1=b;//auto会忽略顶层常量,因此ace1不是常量 + ace1=12;//这里是合法的 + const auto ace2=b;//auto面对顶层常量需要在语句前面声明 +// ace2=12;//这里是非法的 + + std::cout << ace1 << " " << ace2 << std::endl; + std::cout << "面对引用" << std::endl; + +// auto &end1=32;//这里不能直接饮用字面值,因为auto忽略了顶层常量,因此end1是一个普通引用,普通引用不能引用字面值,常量引用才可以 + const auto &end1=32; + auto &end2=b;//尝试修改,无法修改 +// end2=11; + const int c=10; + const auto &end3=c; + + + std::cout << "面对指针" << std::endl; + + auto ptr1=&b; +// auto p=b,*ptr2=&b;//对于p来说,忽略了const是int形式,对于指针来说,const int b是底层常量,因此不同类型不能在一起 + + auto p2=a,*ptr3=&a; + + const int x1=12; + auto xp1=&x1; + auto *xp2=&x1; + std::cout << typeid(xp1).name() << std::endl; + std::cout << typeid(xp2).name() << std::endl; + +// *xp1=12; +// *xp2=12; + std::cout << *xp1 << " " << *xp2 << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.3.1decltype类型说明符 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.3.1decltype类型说明符 new file mode 100644 index 0000000..5124590 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.3.1decltype类型说明符 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.3.1decltype类型说明符.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.3.1decltype类型说明符.cpp new file mode 100644 index 0000000..76de786 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.3.1decltype类型说明符.cpp @@ -0,0 +1,13 @@ +#include + +int main(){ + int x=12; + decltype(x) y; + decltype((x)) z=x;//这里是引用,必须初始化 + + std::cout << typeid(x).name() << std::endl; + std::cout << typeid(y).name() << std::endl; + std::cout << typeid(z).name() << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.3.2decltype类型说明符 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.3.2decltype类型说明符 new file mode 100644 index 0000000..c704b48 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.3.2decltype类型说明符 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.3.2decltype类型说明符.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.3.2decltype类型说明符.cpp new file mode 100644 index 0000000..564f3d2 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.5/2.5.3.2decltype类型说明符.cpp @@ -0,0 +1,11 @@ +#include + +int main(){ + int a=1,b=2; + decltype(a=b) x=a; + + std::cout << typeid(x).name() << std::endl; + std::cout << &a << std::endl; + std::cout << &x << std::endl;//地址一样说明是引用 + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.1.1定义类Sales_data b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.1.1定义类Sales_data new file mode 100644 index 0000000..b4f4919 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.1.1定义类Sales_data differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.1.1定义类Sales_data.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.1.1定义类Sales_data.cpp new file mode 100644 index 0000000..365a878 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.1.1定义类Sales_data.cpp @@ -0,0 +1,12 @@ +#include +#include + +struct Sales_data{ + std::string bookNo; + unsigned units_sold=0; + double revenue=0.0; +}; + +int main(){ + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.2.1使用类 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.2.1使用类 new file mode 100644 index 0000000..0633d7e Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.2.1使用类 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.2.1使用类.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.2.1使用类.cpp new file mode 100644 index 0000000..7dc08c8 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.2.1使用类.cpp @@ -0,0 +1,25 @@ +#include +#include + +struct Sales_data{ + std::string bookNo; + unsigned unit_sold=0; + double revenue=0.0; +}; + +int main(){ + Sales_data data1,data2; + std::cout << "请输入ISBN,数量,单价" << std::endl; + std::cin >> data1.bookNo >> data1.unit_sold >> data1.revenue; + std::cout << std::endl << "请再次输入" << std::endl; + std::cin >> data2.bookNo >> data1.unit_sold >> data1.revenue; + + if(data1.bookNo==data2.bookNo){ + std::cout << "两次输入的书号一样" << std::endl; + std::cout << data1.bookNo << " " << data1.unit_sold+data2.unit_sold << " " << data1.revenue+data2.revenue << std::endl; + }else{ + std::cout << "两次输入的书号不一样" << std::endl; + } + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.3.1编写自己的头文 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.3.1编写自己的头文 new file mode 100644 index 0000000..2eecbce Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.3.1编写自己的头文 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.3.1编写自己的头文件.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.3.1编写自己的头文件.cpp new file mode 100644 index 0000000..fd2464c --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/2.6.3.1编写自己的头文件.cpp @@ -0,0 +1,10 @@ +#include +#include "my.h" + +int main(){ + my a; + a.name="何小龙"; + std::cout << a.name << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/my.h b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/my.h new file mode 100644 index 0000000..26df886 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/2.6/my.h @@ -0,0 +1,8 @@ +#ifndef MY_H +#define MY_H +#include + +struct my{ + std::string name; +}; +#endif diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/test/test1通过指针修改值? b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/test/test1通过指针修改值? new file mode 100644 index 0000000..c683a9d Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/test/test1通过指针修改值? differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/test/test1通过指针修改值?.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/test/test1通过指针修改值?.cpp new file mode 100644 index 0000000..e0860b9 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/2/test/test1通过指针修改值?.cpp @@ -0,0 +1,15 @@ +#include + +int main(){ + int x=100; + + int *y=&x; + + std::cout << "x:" << x << ";&x:" << &x << ";y:" << y << ";&y:" << &y << ";*y:" << *y << std::endl; + + *y=12; + + std::cout << "x:" << x << std::endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.1定义初始化string对象 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.1定义初始化string对象 new file mode 100644 index 0000000..e485053 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.1定义初始化string对象 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.1定义初始化string对象.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.1定义初始化string对象.cpp new file mode 100644 index 0000000..408dab3 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.1定义初始化string对象.cpp @@ -0,0 +1,32 @@ +#include + +using std::cin; +using std::cout; +using std::endl; +using std::string; + +int main(){ + string name="何小龙"; + + cout << name << endl; + + string name1; + string name2(name1); + + string name3("何夕"); + string name4="Nie"; + + string name5(4,'A'); +// string name6(4,"张旭东");//只能一个字符 + string name7=string(4,'龙');//只能用单引号,多字节字符常量好像无法显示 + + cout << name1 << endl; + cout << name2 << endl; + cout << name3 << endl; + cout << name4 << endl; + cout << name5 << endl; + //cout << name6 << endl; + cout << name7 << endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.2操作string b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.2操作string new file mode 100644 index 0000000..48c2ffe Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.2操作string differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.2操作string.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.2操作string.cpp new file mode 100644 index 0000000..fcc8c1a --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.2操作string.cpp @@ -0,0 +1,40 @@ +#include +#include + +using std::string; +using std::cout; +using std::cin; +using std::endl; + +int main(){ + string name="何琋"; + string love="Ying"; +// string aa="nihao"+"你好"+name;//两个单独的字面值无法相加 + + string message=name+" love "+love; + cout << message << endl; + cout << "message的字符个数是:" << message.size() << endl; + cout << message[0]; + + string str; + cout << "输入1结束" << endl; + while(cin>>str){//不读到数据不会停止。。。 + cout << endl << str.size() << "个字符" << endl; + if(str=="1"){//回车符不算空 + cout << "空字符" << endl; + break; + }else{ + cout << str << endl; + } + } + cout << str << endl; + while(getline(cin,str)){//这里会首先启动一次 + if(str.empty()){ +// break; + cout << "?" << endl; + }else{ + cout << "-----" << str << endl; + } + } + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.3.1string对象处理 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.3.1string对象处理 new file mode 100644 index 0000000..263bef2 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.3.1string对象处理 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.3.1string对象处理.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.3.1string对象处理.cpp new file mode 100644 index 0000000..3d416cf --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.3.1string对象处理.cpp @@ -0,0 +1,19 @@ +#include +#include +#include + +using std::string; +using std::cout; +using std::cin; +using std::endl; + +int main(){ + string name="何琋"; + if(isalnum(name[0])){ + cout << "这是数字" << endl; + }else{ + cout << name << endl; + } + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.3.2综合操作 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.3.2综合操作 new file mode 100644 index 0000000..32f08e2 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.3.2综合操作 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.3.2综合操作.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.3.2综合操作.cpp new file mode 100644 index 0000000..bea3010 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.2标准库类型string/3.2.3.2综合操作.cpp @@ -0,0 +1,18 @@ +#include +#include + +using std::string; +using std::cout; +using std::cin; +using std::endl; + +int main(){ + string str="xasxasxasxcsdklvhsabjvksanvhsluv"; + getline(cin,str); + for (auto &i:str){ + i='X';//字符替换必须用'' + } + cout << str << endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.1初始化vector b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.1初始化vector new file mode 100644 index 0000000..5e1906b Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.1初始化vector differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.1初始化vector.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.1初始化vector.cpp new file mode 100644 index 0000000..cc6147d --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.1初始化vector.cpp @@ -0,0 +1,39 @@ +#include +#include +#include + +using std::string; +using std::vector; +using std::cout; +using std::cin; +using std::endl; + +int main(){ + vector a{1,2,3,4,5}; + for (auto i:a)cout << i << endl; +// cout << a << endl;//不能直接输出 + + cout << "以上为尝试输出vector对象中的元素" << typeid(a).name() << endl; + + vector b=a; + for (auto i:b)cout << i << ","; + cout << endl; + vector c(10); + vector d(10,12); + for (auto i:c)cout << i << ","; + cout << endl; + for (auto i:d)cout << i << ","; + cout << endl; + + vector e{10,"GY"};//这里花括号就适应了环境,因为这里不能初始化字面值 + for(auto i:e)cout << i << " "; + cout << endl; + + vector> f{a,b,c,d}; + for(auto i:f){ + for(auto j:i)cout << j << " "; + cout << endl; + } + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.1初始化vector.m1 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.1初始化vector.m1 new file mode 100644 index 0000000..3607f77 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.1初始化vector.m1 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.2在vector末尾添加元素 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.2在vector末尾添加元素 new file mode 100644 index 0000000..fc5d485 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.2在vector末尾添加元素 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.2在vector末尾添加元素.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.2在vector末尾添加元素.cpp new file mode 100644 index 0000000..ffb6878 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.2在vector末尾添加元素.cpp @@ -0,0 +1,18 @@ +#include +#include + +using std::vector; +using std::cout; +using std::endl; + +int main(){ + vector a; + a.push_back(1024); + + for(int i=0; i<=512; i++){ + a.push_back(i); + } + + for(auto i:a)cout << i << endl; + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.3其他vector操作 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.3其他vector操作 new file mode 100644 index 0000000..44cf9d3 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.3其他vector操作 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.3其他vector操作.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.3其他vector操作.cpp new file mode 100644 index 0000000..754a8f4 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.3标准库类型vector/3.3.3其他vector操作.cpp @@ -0,0 +1,18 @@ +#include +#include +#include +using std::vector; +using std::cout; +using std::endl; +using std::string; + +int main(){ + vector a; + for(int i=0;i<20;i++){ + a.push_back(i); + } + + cout <::size_type) << endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.4迭代器/3.4.1迭代器的使用 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.4迭代器/3.4.1迭代器的使用 new file mode 100644 index 0000000..d98c5e1 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.4迭代器/3.4.1迭代器的使用 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.4迭代器/3.4.1迭代器的使用.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.4迭代器/3.4.1迭代器的使用.cpp new file mode 100644 index 0000000..1685aee --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.4迭代器/3.4.1迭代器的使用.cpp @@ -0,0 +1,19 @@ +#include + +using std::cout; +using std::string; +using std::endl; + +int main(){ + string a="Hello World!"; + + if(a.begin()!=a.end()){//判断队形非空 + auto x1=a.begin(); + *x1='h'; + cout << *x1; + ++x1; + cout << *x1; + } + cout << a; + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.4迭代器/3.4.2迭代器的运算 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.4迭代器/3.4.2迭代器的运算 new file mode 100644 index 0000000..b8836a9 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.4迭代器/3.4.2迭代器的运算 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.4迭代器/3.4.2迭代器的运算.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.4迭代器/3.4.2迭代器的运算.cpp new file mode 100644 index 0000000..212700f --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.4迭代器/3.4.2迭代器的运算.cpp @@ -0,0 +1,14 @@ +#include + +using namespace std; + +int main(){ + string a="GY i missing you!"; + + for(auto i=a.begin();i + +using namespace std; + +int main(){ + string str[]={"abc","你在做什么"}; + cout << str[0] << endl; + cout << str[1] << endl; + + int a[3]; + int b[]={1,2,3,4}; + int c[2]={2,4}; +// int d[2]={1,2,3};//错误,初始值超出容器 + int e[5]={1,2,3};//相当于{1,2,3,0,0} + +//不能赋值 +// int f[]=e;//这里报错,不能使用数组初始化数组 +// int g[5]; +// g=e;//不能把数组赋值给另一个数组 + + + + char cha[]="master";//字符数组可以使用字面值 + char chb[]={'a','b','c'};//最后有一个空字符 + char chc[3]="ab";//这里chc已经装满了,还有一个位置要留给空字符 + +//指针数组和数组指针 + int *pa[23];//含有23个整形指针的数组, + int (*pb)[3]=&a;//pb是指针,指向一个数组,这里维度需要和被指对象维度相同 + int *(*pc)[23]=&pa;//pc是一个指针,他指向一个包含23位整形指针的数组 + +//引用 +// int &ma[10];//引用不是对象,一次不能成为数组; + int (&mb)[5]=e;//引用一个数组,而且需要初始化 + + int *((&cc1)[23])=pa;//从对象名字向外看 + int (*&cc2)[3]=pb;//只是一个引用,引用一个数组指针(包含素组的指针对象) + + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.5数组/3.5.3.1数组和指针 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.5数组/3.5.3.1数组和指针 new file mode 100644 index 0000000..efa9415 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.5数组/3.5.3.1数组和指针 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.5数组/3.5.3.1数组和指针.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.5数组/3.5.3.1数组和指针.cpp new file mode 100644 index 0000000..55ae9b8 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/3/3.5数组/3.5.3.1数组和指针.cpp @@ -0,0 +1,39 @@ +#include +using namespace std; +int main(){ + string num[2]; + string *ps=num; + string *ps0=&num[0]; + string *ps1=&num[1]; + cout << ps << endl << ps0 << endl << ps1 << endl; + num[0]="xasxasxasxassvasuyijovibfhdmxjvbcsnly"; + cout << ps << endl << ps0 << endl << ps1 << endl; + int num2[2]; + +// for (int i=0;i<100;i++){ + cout << &num[0][0]; +// } + +// cout << num[0] << endl; + cout << &num2[0] << endl << &num2[1] << endl; +// cout << string.max_size() << endl; + +//指针式迭代器,所以可以进行迭代器操作 + int a[]={1,2,3,4,5,6,7,8,9,0}; + int *pa=a;//这里数组名其实就是数组的地址,因此不需要取址符 + int *e=&a[10];//这里取不存在的数组元素的意义在于,得到尾后地址 +//妈的原来学过的begin()和end()就可以 + for(pa=a;pa + + +using namespace std; + +int main(){ + int arr[3][3]={1,2,3,4,5,6,7,8,9}; + + int (*ptr)[3]=arr;//ptr指向包含三个元素的数组 + + for (int i=0;i<3;i++){ + cout << *ptr << " " << ptr << endl; + int *pts=(*ptr);//这里代指第一维数组 + for (int j=0;j<3;j++){ + cout << *pts; + ++pts; + } + cout << endl; + ++ptr; + } + for(auto a=begin(arr);a + +using namespace std; + +int main(){ + int a=1.22+5;//发生了隐式转换 + + cout << a << endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.11类型转换/4.11.3.1显式转换 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.11类型转换/4.11.3.1显式转换 new file mode 100644 index 0000000..5120b8c Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.11类型转换/4.11.3.1显式转换 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.11类型转换/4.11.3.1显式转换.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.11类型转换/4.11.3.1显式转换.cpp new file mode 100644 index 0000000..e45817b --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.11类型转换/4.11.3.1显式转换.cpp @@ -0,0 +1,14 @@ +//4.11.3.1显式转换.cpp +#include + +using namespace std; + +int main(){ + int a=1,b=2; + double c=1/2; + cout << c << endl;//这里依然是整型,因为右边线进行计算,得到的是整数 + double d=static_cast(a)/b; + cout << d << endl;//这里先将a转化为双精度,此时隐式转换发生b为了和双精度的a进行计算,会先转化为双精度,然后将值赋给左边 + cout << static_cast(a)/b << endl;//此处不能讲这个值赋给c再输出。。。 + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.11类型转换/4.11.3.2显式转换对编译器不能自行转换的转换 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.11类型转换/4.11.3.2显式转换对编译器不能自行转换的转换 new file mode 100644 index 0000000..130011f Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.11类型转换/4.11.3.2显式转换对编译器不能自行转换的转换 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.11类型转换/4.11.3.2显式转换对编译器不能自行转换的转换.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.11类型转换/4.11.3.2显式转换对编译器不能自行转换的转换.cpp new file mode 100644 index 0000000..8f94f47 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.11类型转换/4.11.3.2显式转换对编译器不能自行转换的转换.cpp @@ -0,0 +1,18 @@ +#include + +using namespace std; + +int main(){ + int a=12; + void *b=&a; + double *c=static_cast(b); + cout << &a << endl; + cout << c << endl; + cout << b << endl; + + cout << a << endl; +// cout << *b << endl; + cout << *c << endl; +//虽然指向了同一个位置,取值时发生了错误 + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.2算术运算符/4.2算数运算符 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.2算术运算符/4.2算数运算符 new file mode 100644 index 0000000..4b44691 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.2算术运算符/4.2算数运算符 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.2算术运算符/4.2算数运算符.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.2算术运算符/4.2算数运算符.cpp new file mode 100644 index 0000000..7954159 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.2算术运算符/4.2算数运算符.cpp @@ -0,0 +1,17 @@ +//4.2 算术运算符 +#include + +using namespace std; + +int main(){ + int a=12,b=5; + double c=12.333,d=2.71828; + + cout << "a/b: " << a/b << endl; + cout << "a%b: " << a%b << endl; + + cout << "c/d: " << c/d << endl; +// cout << "c%d: " << c%d << endl;//这里面对两个浮点型,%(取余)只能存在于两个整数之间 + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.3逻辑和关系运算符/4.3逻辑和关系运算符 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.3逻辑和关系运算符/4.3逻辑和关系运算符 new file mode 100644 index 0000000..567150f Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.3逻辑和关系运算符/4.3逻辑和关系运算符 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.3逻辑和关系运算符/4.3逻辑和关系运算符.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.3逻辑和关系运算符/4.3逻辑和关系运算符.cpp new file mode 100644 index 0000000..9ceca82 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.3逻辑和关系运算符/4.3逻辑和关系运算符.cpp @@ -0,0 +1,19 @@ +//4.3 逻辑和关系运算符 +#include + +using namespace std; + +int main(){ + int a=32,b=0; + + string c,d="xsx";//string无法直接转化为布尔型 + + if(a)cout << "a不等于0" << endl; + if(!b)cout << "b等于零" << endl; + +// if(c)cout << "c是空字符" << endl; +// if(!c)cout << "c是空字符" << endl; +// if(d)cout << "d含有字符" << endl; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.4赋值运算符/4.4赋值运算符 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.4赋值运算符/4.4赋值运算符 new file mode 100644 index 0000000..caee643 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.4赋值运算符/4.4赋值运算符 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.4赋值运算符/4.4赋值运算符.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.4赋值运算符/4.4赋值运算符.cpp new file mode 100644 index 0000000..3c0bf8b --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.4赋值运算符/4.4赋值运算符.cpp @@ -0,0 +1,13 @@ +//4.4 赋值运算符 +#include +#include +using namespace std; + +int main(){ +// int a={1.2};//查看编译器结果,不能讲浮点型赋值给整型 + + vector b; + b={1,2,3,4,5}; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.5递增和递减运算符/4.5递增和递减运算符 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.5递增和递减运算符/4.5递增和递减运算符 new file mode 100644 index 0000000..14366c7 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.5递增和递减运算符/4.5递增和递减运算符 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.5递增和递减运算符/4.5递增和递减运算符.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.5递增和递减运算符/4.5递增和递减运算符.cpp new file mode 100644 index 0000000..ed77544 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.5递增和递减运算符/4.5递增和递减运算符.cpp @@ -0,0 +1,20 @@ +//4.5 递增和递减运算符 +#include + +using namespace std; + +int main(){ + int a=1; + int b=a++; + cout << a << " " << b << endl;//先赋值后进行加法 + int c=++a; + cout << a << " " << c << endl;//先进行递增然后再赋值 + + int arr[]={1,2,3,4,5,6,7,8,9}; + auto d=begin(arr); + d++; +// *d++;//递增运算不可以解引用 + cout << *++d << endl; + cout << d++ << endl; + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.6成员访问运算符/4.6成员访问运算符 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.6成员访问运算符/4.6成员访问运算符 new file mode 100644 index 0000000..30b56e7 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.6成员访问运算符/4.6成员访问运算符 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.6成员访问运算符/4.6成员访问运算符.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.6成员访问运算符/4.6成员访问运算符.cpp new file mode 100644 index 0000000..4768f33 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/4/4.6成员访问运算符/4.6成员访问运算符.cpp @@ -0,0 +1,14 @@ +//4.6 成员访问运算符.cpp +#include +#include + +using namespace std; + +int main(){ + string a="i missing gy",*b=&a; + cout << (*b).size() << endl; + cout << b->size() << endl; +// cout << *b.size() << endl;//这里b是指针,没有size成员 + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/5语句/5.3.2switch语句 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/5语句/5.3.2switch语句 new file mode 100644 index 0000000..5eaae63 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/5语句/5.3.2switch语句 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/5语句/5.3.2switch语句.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/5语句/5.3.2switch语句.cpp new file mode 100644 index 0000000..9d999cb --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/5语句/5.3.2switch语句.cpp @@ -0,0 +1,17 @@ +#include + +using namespace std; + +int main(){ + int i=1; + switch(i){ + case 1://数字不用加引号,char单引号,字符串双引号 + cout << 1 << endl; + break; + case '2': + cout << 2 << endl; + break; + } + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.1.1局部对象 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.1.1局部对象 new file mode 100644 index 0000000..6faab74 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.1.1局部对象 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.1.1局部对象.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.1.1局部对象.cpp new file mode 100644 index 0000000..5abccb6 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.1.1局部对象.cpp @@ -0,0 +1,20 @@ +//6.1.1局部对象.cpp +#include + +using namespace std; + +int a(); + +int main(){ + for(int i=0;i<20;i++){ + cout << a() << endl; + } + + return 0; +} + +int a(){ + static int i=0; + + return ++i; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.1.test b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.1.test new file mode 100644 index 0000000..fbed0f3 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.1.test differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.1.test.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.1.test.cpp new file mode 100644 index 0000000..5dc0ffa --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.1.test.cpp @@ -0,0 +1,26 @@ +//6.1.test.cpp +#include + +using namespace std; + +int fact(int x);//如果函数出现在调用之后,需要声明 + +int main(){ + cout << "请输入一个数,将计算它的阶乘" << endl; + + int x; + cin >> x; + cout << "阶乘为:"; + cout << fact(x) << endl; + + return 0; +} + +int fact(int x){ + int i,j; + for(i=1;i<=x;i++){ + j =i*j; + } + + return j; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.1传值参数 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.1传值参数 new file mode 100644 index 0000000..992f0b7 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.1传值参数 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.1传值参数.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.1传值参数.cpp new file mode 100644 index 0000000..b9665c1 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.1传值参数.cpp @@ -0,0 +1,19 @@ +//6.2.1传值参数.cpp +#include + +using namespace std; + +void x(int *i); + +int main(){ + int i=12; + x(&i); + cout << i << endl; + + return 0; +} + +void x(int *i){ + *i=0;//这里修改了i所指的对象的值; + i=0;//这里只是修改了i所指的对象; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.2传引用参数 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.2传引用参数 new file mode 100644 index 0000000..ddb7acc Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.2传引用参数 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.2传引用参数.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.2传引用参数.cpp new file mode 100644 index 0000000..cf3aff7 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.2传引用参数.cpp @@ -0,0 +1,20 @@ +//6.2.2传引用参数 + +#include + +using namespace std; + +void a(int &i); + +int main(){ + int x=12; + + a(x); + cout << x << endl; + + return 0; +} + +void a(int &i){ + i=111; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.3const形参和实参 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.3const形参和实参 new file mode 100644 index 0000000..4a6a8a1 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.3const形参和实参 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.3const形参和实参.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.3const形参和实参.cpp new file mode 100644 index 0000000..731bc6c --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.3const形参和实参.cpp @@ -0,0 +1,30 @@ +//6.2.3const形参和实参.cpp +#include + +using namespace std; + +void fa(const int as); +void fb(int as); + +int main(){ + int x=1,y=2; + const int a=1,b=2; + + fa(x); + fa(a); + + fb(y); + fb(b); + + return 0; +} + +void fa(const int as){ +// 无法修改值 +} + +void fb(int as){ +// 可修改值 + as=12; + +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.2数组参数 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.2数组参数 new file mode 100644 index 0000000..70218c6 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.2数组参数 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.2数组参数.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.2数组参数.cpp new file mode 100644 index 0000000..ff6c29e --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.2数组参数.cpp @@ -0,0 +1,28 @@ +//6.2.4.2数组参数.cpp +#include + +using namespace std; + +void showarr(int *&a); +void showptr(int *&a); + +int main(){ + int arr[]={1,4,7},*p=arr;//使用这个例子中的做法需要先把数组显式转化为指针 + showarr(p); + int a=12,*ptr=&a; + showptr(ptr); + cout << a << endl; + return 0; +} + + +void showarr(int *&a){ + cout << *a << endl; + a++; + cout << *a << endl; +} + +void showptr(int *&a){ + cout << *a << endl; + *a=11; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.2数组参数.cppy b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.2数组参数.cppy new file mode 100644 index 0000000..40a1a41 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.2数组参数.cppy @@ -0,0 +1,28 @@ +//6.2.4.2数组参数.cpp +#include + +using namespace std; + +void showarr(int *&a); +void showptr(int *&a); + +int main(){ + int arr[]={1,4,7}; + showarr(&arr[0]); + int a=12,*ptr=&a; + showptr(ptr); + cout << a << endl; + return 0; +} + + +void showarr(int *&a){ + cout << *a << endl; + a++; + cout << *a << endl; +} + +void showptr(int *&a){ + cout << *a << endl; + *a=11; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.3数组参数 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.3数组参数 new file mode 100644 index 0000000..ab0484f Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.3数组参数 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.3数组参数.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.3数组参数.cpp new file mode 100644 index 0000000..9617035 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4.3数组参数.cpp @@ -0,0 +1,16 @@ +//6.2.4.3数组参数.cpp +#include + +using namespace std; + +void ass(int (&a)[4]); + +int main(){ + int a[]={12,222,3,44}; + ass(a); + return 0; +} + +void ass(int (&a)[4]){//这里必须指明维度 + cout << a[0] << endl; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4数组形参 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4数组形参 new file mode 100644 index 0000000..4c8fbe0 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4数组形参 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4数组形参.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4数组形参.cpp new file mode 100644 index 0000000..cfde349 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.2.4数组形参.cpp @@ -0,0 +1,27 @@ +//6.2.4数组形参.cpp +#include + +using namespace std; + +void ra(const int *a); +void rb(int *(&a)); + +int main(){ + int a[]={1,2,3,45,6,7,8,9,5,15,21,11}; + for (auto i=begin(a);i!=end(a);i++)cout << i < +using namespace std; +int main(int argc, char *argv[])//第一个参数是命令行键入的参数个数,第二个参数是命令行参数的尸体,以空格分开,还可以写成char ** argv +{ + cout << "argc= " << argc << endl; + for (int i = 0; i +#include + +using namespace std; + +vector a(); + +int main(){ + a(); + + return 0; +} + +vector a(){ + return {"xsxxsxsx","xcgyubajsks","HelloWorld"}; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.4.1重载作用域 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.4.1重载作用域 new file mode 100644 index 0000000..0733b49 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.4.1重载作用域 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.4.1重载作用域.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.4.1重载作用域.cpp new file mode 100644 index 0000000..fde5112 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.4.1重载作用域.cpp @@ -0,0 +1,21 @@ +#include + +using namespace std; + +int a(); + +int main(){ + cout << a() << endl; + + string a="xsaxa";//使用过后再重新定义也是可行的 + + cout << a << endl; + + return 0; +} + +int a(){ + return 2; +} + + diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.5.1默认实参 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.5.1默认实参 new file mode 100644 index 0000000..9ce69f5 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.5.1默认实参 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.5.1默认实参.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.5.1默认实参.cpp new file mode 100644 index 0000000..3fa72ea --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.5.1默认实参.cpp @@ -0,0 +1,15 @@ +#include + +using namespace std; + +//void a(int i1=1,int i2);//有默认值的后面的参数都必须有默认值 +void a(int i1,int i2=2); + +int main(){ + a(1,2); + return 0; +} + +void a(int i1,int i2){ + cout << i1 << i2 << endl; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.6.1函数匹配 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.6.1函数匹配 new file mode 100644 index 0000000..7b5d5f2 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.6.1函数匹配 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.6.1函数匹配.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.6.1函数匹配.cpp new file mode 100644 index 0000000..7baf213 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/6函数/6.6.1函数匹配.cpp @@ -0,0 +1,20 @@ +#include + +using namespace std; + +void f(int); +//void f(int,int=2); + +int main(){ + f(2); + + return 0; +} + +void f(int x){ + cout << x << endl; +} + +void f(int x,int y){ + cout << x << endl; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/Hello_world.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/Hello_world.cpp new file mode 100644 index 0000000..168d4ba --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/Hello_world.cpp @@ -0,0 +1,9 @@ +#include + +using std::cout; + +int main(){ + cout << "Hello World!"; + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/a.out b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/a.out new file mode 100644 index 0000000..5cbd415 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/a.out differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/s我的算法/复杂运算 b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/s我的算法/复杂运算 new file mode 100644 index 0000000..5ab621a Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/s我的算法/复杂运算 differ diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/s我的算法/复杂运算.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/s我的算法/复杂运算.cpp new file mode 100644 index 0000000..11ce28f --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/code/s我的算法/复杂运算.cpp @@ -0,0 +1,28 @@ +#include +#include + +using namespace std; + +int main(){ + cout << "请输入一个算式,包含加减乘除乘方括号:" << endl; + string s; + cin >> s; + vector num; + vector symbol; + + for (auto x:s){ + if((x>47)&&(x<58)){ + if(symbol.begin()==symbol.end()){//判断字符栈是否为空 + num.push_back(x-'0'); + }elif(*(symbol.end()-1)=='46'){ + *(num.end()-1)=atof((to_string(*num.end()-1)).c_str()+x); + } + } + } + + for (double a:num){ + cout << a << endl; + } + + return 0; +} diff --git a/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/复杂运算.cpp b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/复杂运算.cpp new file mode 100644 index 0000000..b7439b7 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-A-Program/Xi-XX-C++/大三/复杂运算.cpp @@ -0,0 +1,140 @@ +#include +#include + +using namespace std; + +void compares(vector &a,vector &b,int nowsym); +void calculations(vector &a,vector &b,int nowsym); + +int main(){ + cout << "请输入一个算式,包含加减乘除乘方括号:" << endl; + string s; + cin >> s; + vector num={"x"}; + vector symbol; + //1+2- -11*12/ -21^ -31( -32) -40. + cout << "--------------------------------" << endl; + + for (auto x:s){ + if(x>47&&x<58){ + // 数字 + if(*(num.end()-1)=="x"){ + // 可以输入数字 + *(num.end()-1)=to_string(x-'0'); + }else{ + if(symbol.end()!=symbol.begin()){ + if(*(symbol.end()-1)==40){ + // 有小数点 + symbol.pop_back(); + *(num.end()-1)=*(num.end()-1)+"."+to_string(x-'0'); + }else{ + *(num.end()-1)=*(num.end()-1)+to_string(x-'0'); + } + }else{ + // 多位数字 + *(num.end()-1)=*(num.end()-1)+to_string(x-'0'); + } + } + }else{ + // 符号 + int sym=0; + if(x=='.')sym=40; + if(x=='+')sym=1; + if(x=='-')sym=2; + if(x=='*')sym=11; + if(x=='/')sym=12; + if(x=='^')sym=21; + if(x=='(')sym=31; + if(x==')')sym=32; + + if(sym==40){ + // 小数点 + symbol.push_back(sym); + }else{ + // 其他运算符 + compares(num,symbol,sym); + } + } + + } + // 最后一次计算 + compares(num,symbol,0); + + cout << "计算结果为:" << *num.begin() << endl; + + return 0; +} + +void compares(vector &a,vector &b,int nowsym){ + // cout << "运算符" << nowsym << endl; + if(b.end()==b.begin()){ + // 运算符为空直接添加 + b.push_back(nowsym); + if(*(a.end()-1)!="x")a.push_back("x"); + return; + }else{ + if(((*(b.end()-1)+5)(nowsym+5)){ + // 新量级比较小 + if(*(b.end()-1)==31){//遇到左括号( + b.push_back(nowsym); + a.push_back("x"); + return; + } + calculations(a,b,nowsym); + compares(a,b,nowsym); + // 进行计算 + }else{ + if(nowsym==32){ + if(*(b.end()-1)==31){ + cout << "括号相遇" << endl; + b.pop_back(); + // a.push_back("x"); + return; + }else{ + calculations(a,b,nowsym); + compares(a,b,nowsym); + } + //进行计算后,不添加符号直接返回 + }else{ + // 同级进行计算 + calculations(a,b,nowsym); + compares(a,b,nowsym); + } + + } + } +} + +void calculations(vector &a,vector &b,int nowsym){ + double c1=atof((*(a.end()-1)).c_str()); + double c2=atof((*(a.end()-2)).c_str()); + int operation=*(b.end()-1); + double value; + a.pop_back(); + a.pop_back(); + b.pop_back(); + if(operation==1){ + // + + value=c2+c1; + }else if(operation==2){ + // - + value=c2-c1; + }else if(operation==11){ + // * + value=c2*c1; + }else if(operation==12){ + // / + value=c2/c1; + }else if(operation==21){ + // ^ + value=pow(c2,c1); + } + a.push_back(to_string(value)); +} diff --git a/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/ARP协议.pptx b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/ARP协议.pptx new file mode 100644 index 0000000..26eee45 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/ARP协议.pptx differ diff --git a/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/ICMP协议.pptx b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/ICMP协议.pptx new file mode 100644 index 0000000..e29452d Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/ICMP协议.pptx differ diff --git a/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/IP编址.pptx b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/IP编址.pptx new file mode 100644 index 0000000..cdd26f8 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/IP编址.pptx differ diff --git a/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/以太网帧结构.pptx b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/以太网帧结构.pptx new file mode 100644 index 0000000..d1c0787 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/以太网帧结构.pptx differ diff --git a/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/企业网络架构介绍.pptx b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/企业网络架构介绍.pptx new file mode 100644 index 0000000..e08b9b1 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/企业网络架构介绍.pptx differ diff --git a/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/传输介质简介.pptx b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/传输介质简介.pptx new file mode 100644 index 0000000..0a38fa0 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/传输介质简介.pptx differ diff --git a/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/传输层协议.pptx b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/传输层协议.pptx new file mode 100644 index 0000000..411a13f Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/传输层协议.pptx differ diff --git a/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/数据转发过程.pptx b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/数据转发过程.pptx new file mode 100644 index 0000000..403afa7 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-B-计算机专业知识/网络基础ppt/数据转发过程.pptx differ diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/ArchLinux.svg b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/ArchLinux.svg new file mode 100644 index 0000000..1d5febc --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/ArchLinux.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker.md b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker.md new file mode 100644 index 0000000..903a081 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker.md @@ -0,0 +1,463 @@ +![[Docker.svg]] + +> 说明 + +- 学习来源 + - [学习 Docker 看完哪篇超详细的教程就足够了? - 知乎 (zhihu.com)](https://www.zhihu.com/question/485967221) + - [【docker教程】2022新完整版docker容器教程,入门到精通3天光速搞定_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1AZ4y1b7ev/) + + +------ + + + +[toc] + +# 📙一、 系统介绍 + +## 1 概括性介绍 + +### 1.1 Docker Run做了什么 + +- 查找本地镜像 +- 查找网络镜像 + +### 1.2 Docker工作机制 + +> 作者:步尔斯特 +> 链接:https://www.zhihu.com/question/485967221/answer/2556644950 +> 来源:知乎 +> 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 + +Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket从客户端访问,DockerServer(守护进程)接受到DockerClient(客户端)的指令,就会执行这个命令。 + +守护进程管理运行在主机上的容器 。 + +容器,是一个运行时环境,就是我们前面说到的集装箱。 + +### 1.3 Docker比VMware快的原因 + +> 作者:步尔斯特 +> 链接:https://www.zhihu.com/question/485967221/answer/2556644950 +> 来源:知乎 +> 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 + +- `docker有着比虚拟机更少的抽象层`。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。 +- `docker利用的是宿主机的内核,而不需要Guest OS`。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。 +- **Docker底层共用物理机的实际资源,而虚拟机需要模拟物理机的操作系统资源,所以Docker加载得更快,而虚拟机更慢。** + + + +![[Docker和VMware区别.png]] + + + +> Docker是一个解决了运行环境和配置问题,并且方便做持续集成以及有助于整体发布的容器虚拟化技术。 + +- 镜像 +- 容器 +- 仓库 + +----- + + + +# 📦二、 安装 + +## 1 脚本安装 + +```bash +$ curl -fsSL https://get.docker.com -o get-docker.sh +$ DRY_RUN=1 sh ./get-docker.sh # 了解脚本在安装过程中将执行哪些步骤 +$ sudo sh test-docker.sh # 直接执行 +``` + +## 2 package包 + +- 转到 [`https://download.docker.com/linux/debian/dists/`](https://download.docker.com/linux/debian/dists/),选择您的 Debian 版本,然后浏览到 、选择 、 或 ,然后下载您要安装的 Docker 引擎版本的文件。`pool/stable/``amd64``armhf``arm64``.deb` + +- 安装 + +```bash +$ sudo dpkg -i package.deb +``` + +- 运行 + +```bash +$ sudo docker run hello-world +``` + +## 3 软件源 + +参考: + +> [在 Debian | 上安装 Docker 引擎泊坞窗文档](https://docs.docker.com/engine/install/debian/) +> +> [Debian安装Docker(国内源) - 简书 (jianshu.com)](https://www.jianshu.com/p/e9873d92ebbd) +> +> [容器镜像服务 (aliyun.com)](https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors) + +### 3.1 卸载 + +#### 3.1.1 普通卸载 + +卸载内容:`docker` `docker.io` `docker-engine` + +```bash +$ sudo apt-get remove docker docker-engine docker.io containerd runc +``` + +将保留 的内容,包括映像、容器、卷和网络。 + +#### 3.1.2 完全卸载 + +- 卸载泊坞引擎、CLI、容器化和泊坞窗撰写包: + + ```bash + $ sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin + $ # purge不保留配置文件 + ``` + +- 主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有映像、容器和卷: + + ```bash + $ sudo rm -rf /var/lib/docker + $ sudo rm -rf /var/lib/containerd + ``` + +您必须手动删除任何已编辑的配置文件。 + +### 3.2 安装 + +#### 3.2.1 设置源 + +1. ##### 基础源 + +```bash +$ # 编辑/etc/apt/sources.list +# 阿里云源 +deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib +deb-src https://mirrors.aliyun.com/debian/ bullseye main non-free contrib +deb https://mirrors.aliyun.com/debian-security/ bullseye-security main +deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main +deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib +deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib +deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib +deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib + +$ sudo apt-get update +$ sudo apt-get install \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg \ + lsb-release +``` + +2. ##### 设置Docker源 + +- 官方源 + - 添加Docker官方的GPG key + - 设置stable源 + +```bash +# 添加Docker官方的GPG key +$ sudo mkdir -p /etc/apt/keyrings +$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg +# 设置stable源 +$ echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +``` + +- 国内源 + - 添加Docker官方的GPG key + - 设置stable源 + +```bash +# 添加Docker官方的GPG key +$ sudo mkdir -p /etc/apt/keyrings +$ curl -fsSL http://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg +# 设置stable源 +$ echo \ + "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] http://mirrors.ustc.edu.cn/docker-ce/linux/debian \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +``` + +3. ##### 安装 + +- 更新包索引安装最新的Docker + +```bash +$ sudo apt-get update +``` + +- 查看可用版本 + +```bash +$ apt-cache madison docker-ce + + docker-ce | 5:20.10.18~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages + docker-ce | 5:20.10.17~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages + docker-ce | 5:20.10.16~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages + docker-ce | 5:20.10.15~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages + docker-ce | 5:20.10.14~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages + docker-ce | 5:20.10.13~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages + docker-ce | 5:20.10.12~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages + docker-ce | 5:20.10.11~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages + docker-ce | 5:20.10.10~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages + docker-ce | 5:20.10.9~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages + docker-ce | 5:20.10.8~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages + docker-ce | 5:20.10.7~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages + docker-ce | 5:20.10.6~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages +``` + +- 安装最新版 + +```bash +$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` + +- 安装指定版本,版本号为`5:20.10.8~3-0~debian-bullseye` + +```bash +$ sudo apt-get install docker-ce= docker-ce-cli= containerd.io docker-compose-plugin +``` + +4. ##### 运行测试 + +- 通过运行`hello-world`镜像来验证是否正确安装了 Docker 引擎。 + +```bash +$ sudo docker run hello-world +``` + +5. ##### 设置仓库(配置docker加速器) + +```bash +$ sudo mkdir -p /etc/docker +$ sudo touch /etc/docker/daemon.json + +# 编辑此文件,加入以下内容 +{ + "registry-mirrors" : [ + "https://8xpk5wnt.mirror.aliyuncs.com" # 自己的阿里云镜像源,每个人不一样 + # https://docker.mirrors.ustc.edu.cn # 中科大的源 + ] +} + +# 重启 +systemctl daemon-reload +systemctl restart docker +# 设置开机启动 +systemctl enable docker + +#查看是否运行 +ps aux | grep docker + +docker ps +docker images +docker version +``` + + + +### 3.3 以非root身份运行 + +#### 3.3.1 查看用户组 + +```bash +$ sudo cat /etc/group |grep docker + +# docker:x:998:表示存在 +``` + +#### 3.3.2 创建用户组 + +```bash +$ sudo groupadd docker +``` + +#### 3.3.3 将用户添加到用户组 + +```bash +$ sudo usermod -aG docker $USER +$ newgrp docker # 激活组更改,无效的话尝试重连ssh,退出登录,重启计算机等 +``` + +### 3.4 为Docker指定DNS服务器 + +[Linux |的安装后步骤泊坞窗文档 (docker.com)](https://docs.docker.com/engine/install/linux-postinstall/#specify-dns-servers-for-docker) + +### 3.5 CentOS上安装 + +> 大同小异,参考[在 CentOS |上安装Docker引擎文档 (docker.com)](https://docs.docker.com/engine/install/centos/) + +----- + + + +# 📒三、入门 + +## 1 基础组件 + +### 1.1 ⭐Docker引擎 + +![[Docker Engine.png]] + +### 1.2 ⭐Docker核心 + +![[Docker核心.png]] + +### 1.3 ⭐Docker平台组成 + +![[Docker平台组成.png]] + +### 1.4 ⭐Docker生命周期 + +![[Docker生命周期.png]] + +### 1.5 ⭐Docker分层原理 + +![[镜像分层原理.png]] + + + +----- + + + +# 🔯四、命令 + +## 镜像 + +### 查看本地镜像列表 + +```bash +docker images +``` + +### 搜索镜像 + +```bash +docker search imagesName +``` + +### 拉取镜像 + +```bash +docker pull imagesName/id +docker pull imagesName:Tag +``` + +### 保存镜像 + +```bash +docker save imagesName/id -o 镜像保存的位置和名称 +``` + +### 导入镜像 + +```bash +docker load -i 镜像位置 +``` + +### 删除镜像 + +```bash +#删除一个 +docker rmi -f 镜像名/镜像ID + +#删除多个 其镜像ID或镜像用用空格隔开即可 +docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID + +#删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID +docker rmi -f $(docker images -aq) +``` + +## 容器 + +### 容器列表 + +```bash +docker ps # 正在运行的 +docker ps -a # 所有的容器 +``` + +### 创建和删除容器 + +```bash +# 创建容器 +docker run -it -d --name 要取的别名 -p 宿主机端口:容器端口 -v 宿主机文件存储位置:容器内文件位置 镜像名:Tag /bin/bash + + +#删除一个容器 +docker rm -f 容器名/容器ID +#删除多个容器 空格隔开要删除的容器名或容器ID +docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID +#删除全部容器 +docker rm -f $(docker ps -aq) +``` + +参数含义 + +> - -it 表示 与容器进行交互式启动 +> - -d 表示可后台运行容器 (守护式运行)   +> - --name 给要运行的容器 起的名字   +> - /bin/bash  交互路径 +> - -p 将容器的端口映射到宿主机上,通过宿主机访问内部端口 +> - -v 将容器内的指定文件夹挂载到宿主机对应位置 + +### 启动和停止容器 + +```bash +# 启动 +docker start 容器ID/名称 +docker restart 容器ID/名称 +# 停止 +docker stop 容器名/id +``` + +### 退出和进入容器 + +```bash +exit +# Ctrl + D 直接退出并关闭容器 +# CTRL + P + Q 退出到后台 + +docker attach 容器ID/名称 # 需要Ctrl + P + Q才可以退出至后台,Ctrl + D会直接退出,exit也会直接退出 +docker exec -it 容器ID/名称 bash # Ctrl + D可以直接退出到后台 +``` + +### 修改容器名 + +```bash +# 修改容器名称 +docker rename 原容器名 要修改的容器名 +``` + +### 暂停和恢复容器 + +```bash +# 暂停容器 +docker pause 容器名 +# 恢复容器 +docker unpause 容器名 +``` + +### 生成镜像 + +**使用场景:** + +- 构建临时的测试镜像; +- 容器被入侵后,使用docker commit,基于被入侵的容器构建镜像,从而保留现场,方便以后追溯。 + +**弊端:** + +- 使用docker commit构建的镜像包含了编译构建、安装软件,以及程序运行产生的大量无用文件,这会导致镜像体积很大,非常臃肿。 +- 使用docker commit构建的镜像会丢失掉所有对该镜像的操作历史,无法还原镜像的构建过程,不利于镜像的维护。 + +```bash +docker commit 容器ID 镜像名称:TAG +``` \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker.svg b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker.svg new file mode 100644 index 0000000..d2a1f5f --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker2.svg b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker2.svg new file mode 100644 index 0000000..ac0a5b9 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Docker/Docker2.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Docker/docker.png b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Docker/docker.png new file mode 100644 index 0000000..0949b82 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Docker/docker.png differ diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Git/Git.md b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Git/Git.md new file mode 100644 index 0000000..1f34c5f --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Git/Git.md @@ -0,0 +1,177 @@ +# Git学习 + +> 来自于Bilibili +> 【狂神说Java】Git最新教程通俗易懂 + + +## Git配置 + +1. 查看Git配置 + +```bash +# 查看系统配置 +git config --system --list +# 查看当前用户配置global +git config --global --list +# 查看当前仓库配置 +git config -l +``` + +2. 设置用户标识 + +```bash +# 用户名称 +git config user.name "name" +# 邮箱 +git config user.email "email" +``` + + +## 核心 + +1. 四个区域 + +- 工作区 + +- 暂存区 + +- 仓库区 + +- 远程仓库 + +## 操作 + +1. 初始化 + +```bash +# 本地创建 +git init +# 远程克隆 +git clone url +``` + +2. 查看文件状态 + +```bash +# 查看指定文件状态 +git status [filename] +# 查看所有文件状态 +git status +``` + +3. 忽略文件 + +`.gitignore` + +- 注释使用`#`开头 + +- 通配符 + + - *任意多字符 + - ?一个字符 + - [abc]可选字符 + - {按不出, ds}可选字符串 + - !开头表示特例 + +- /开头代表路径 + +- /结尾代表路径下所有文件 + +4. 提交流程 + +```bash +# 添加到暂存区 +# .代表所有 +git add . +# 提交 +git commit -m "message" +# 推送到远程 +git push +``` + +5. 分支 + +```bash +# 列出所有本地分支 +git branch +# 列出所有远程分支 +git branch -r +# 创建一个分支但依然停留在当前分支 +git branch [分支名称] +# 创建分支并切换到改分支 +git checkout -b [分支名称] +# 切换存在的分支 +git checkout [分支名称] +# 切换到远程分支并创建本地分支 +# 一般远程分支为 orign/分支名 +git checkout -b [新本地分支] [远程分支] +# 删除分支 +git branch -d [分支名称] +# 删除远程分支 +git push orign --delete [远程分支名称] +git branch -dr [remote/branch] + +# 合并分支到当前分支 +git merge [分支名称] + +``` + +6. 查看提交记录 + +```bash +# 查看概览 +git log +# 查看修改内容 +git log -p +# 最近n条记录 +git log -[n] +# 查看简介信息 +git log --oneline +# 分支变动 +git log --graph +# 逆向显示 +git log --reverse +# 查找指定用户的提交日志 +git log --author=Linus --oneline -5 + + +# 查看指定文件的修改记录 +git blame + +``` + +7. 回退版本 + +```bash +$ git reset HEAD^ # 回退所有内容到上一个版本 +$ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本 +$ git reset 052e # 回退到指定版本 +``` + + +8. 清空暂存区 + +- 还没有进行 add . 和 commit 操作 + +```bash +# 只能清空全部已修改的问题件, 但是对于新建的文件和文件夹无法清空, 必须组合下面命令; +$ git checkout . +# 清空所有新建的文件和文件夹; +git clean -d +``` + +- 已经 add . 了, 用如下命令重置 + +```bash +$ git reset . +``` + +9. 远程仓库 + +```bash +# 添加远程仓库 +git remote add origin +# 提交到远程仓库 +git push -u origin master +# 由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。 +``` \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Pi/flask运行.txt b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Pi/flask运行.txt new file mode 100644 index 0000000..30eb547 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Pi/flask运行.txt @@ -0,0 +1 @@ +/usr/bin/python3 /usr/bin/gunicorn -w 4 app:app --preload --chdir /home/pi/togy2021/ \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Pi/zhixing gunicorn.txt b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Pi/zhixing gunicorn.txt new file mode 100644 index 0000000..1446eb6 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Pi/zhixing gunicorn.txt @@ -0,0 +1 @@ +gunicorn -w 4 app:app --preload --chdir /home/pi/togy2021 diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Pi/定时任务.txt b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Pi/定时任务.txt new file mode 100644 index 0000000..b0476d8 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Pi/定时任务.txt @@ -0,0 +1,24 @@ +# /etc/crontab: system-wide crontab +# Unlike any other crontab you don't have to run the `crontab' +# command to install the new version when you edit this file +# and files in /etc/cron.d. These files also have username fields, +# that none of the other crontabs do. + +SHELL=/bin/sh +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + +# Example of job definition: +# .---------------- minute (0 - 59) +# | .------------- hour (0 - 23) +# | | .---------- day of month (1 - 31) +# | | | .------- month (1 - 12) OR jan,feb,mar,apr ... +# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat +# | | | | | +# * * * * * user-name command to be executed +17 * * * * root cd / && run-parts --report /etc/cron.hourly +25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) +47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) +52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) +*/20 * * * * root python3 /home/pi/togyddns/togyddns.py +0 0 * * * root reboot +# diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Pi/开机自启.txt b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Pi/开机自启.txt new file mode 100644 index 0000000..60bfe0b --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Pi/开机自启.txt @@ -0,0 +1,30 @@ +sudo nano /etc/rc.local + + + + +#!/bin/sh -e +# +# rc.local +# +# This script is executed at the end of each multiuser runlevel. +# Make sure that the script will "exit 0" on success or any other +# value on error. +# +# In order to enable or disable this script just change the execution +# bits. +# +# By default this script does nothing. + +# Print the IP address +_IP=$(hostname -I) || true +if [ "$_IP" ]; then + printf "My IP address is %s\n" "$_IP" +fi +# sudo python3 /home/pi/togy2021/starttogy2021.py & +# sudo python3 /home/pi/togyddns/togyddns.py & + + su pi -c "python3 /home/pi/togyddns/togyddns.py &" + su pi -c "/usr/bin/python3 /usr/bin/gunicorn -w 4 app:app --preload --chdir /home/pi/togy2021/ &" + +exit 0 \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Shell.md b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/Shell.md new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/UFW.md b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/UFW.md new file mode 100644 index 0000000..46502cd --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Linux/UFW.md @@ -0,0 +1,362 @@ +# UFW + +> Debian + + +# 简单版本 + +* 下载 + +```bash +wget http://mirrors.163.com/debian/pool/main/u/ufw/(这里自己去查看版本).deb +# http://mirrors.163.com/debian/pool/main/u/ufw/ufw_0.36.1-4_all.deb +``` + +* 安装 + +```bash +sudo dpkg -i *.deb +``` + +* 配置文件 + +```bash +nano /etc/default/ufw +``` + +* 说明 + +allow 开启 + +deny 禁止 + +ignore 忽略 + +* 查看状态 + +```bash +sudo ufw status verbose +# sudo ufw status +``` + +* 刷新 + +```bash +sudo ufw reload +``` + +* 删除规则 + +```bash +sudo ufw delete allow ssh# 删除刚才添加的某个规则 +``` + +如果规则又长又复杂,问题就比较棘手了。这里有一个更简单的方法,需要分成两个步骤: + +```bash +sudo ufw status numbered //按规则来编号防火墙规则。命令会将所有防火墙规则以数字列表形式列出来 +# 请将 [number] 替换成规则列表对应的数字序号。 +sudo ufw delete 1 //按规则编号删除防火墙规则 sudo ufw delete [number] +sudo ufw delete 4 //删除编号为4的规则 +``` + +* 添加规则 + +```bash +sudo ufw allow port +``` + +* 范围规则(UDP和TCP需要单独设置) + +```bash +sudo ufw allow 0:1024/udp +``` + +* 禁用端口 + +示例: + +```bash +sudo ufw deny http //拒绝http连接 +sudo ufw deny smtp //禁止外部访问smtp服务 + +sudo ufw deny from 111.111.111.111 //拒绝特定IP连接 +sudo ufw deny from 192.168.1.5 to any //拦截或拒绝来自192.168.1.5的所有数据包 +``` + + + + + + + + +## 1.引言 + +`Linux`系统下一般会使用`iptables`对防火墙的规则进行管理。`iptables`可以灵活的定义防火墙规则, 功能非常强大,但是由此产生的副作用便是配置过于复杂。在`deepin`系的系统里,附带了一个相对iptables简单很多的防火墙配置工具:`ufw`。 + +## 2.安装 + +```bash +wget http://mirrors.163.com/debian/pool/main/u/ufw/(这里自己去查看版本).deb +# http://mirrors.163.com/debian/pool/main/u/ufw/ufw_0.36.1-4_all.deb +``` + +```bash +sudo dpkg -i *.deb +``` + +一般系统已经自带了ufw,如果意外卸载了,可以执行以下命令安装: + +```bash +sudo apt install ufw +``` + +## 3.查看防火墙状态 + +``` +sudo ufw status +sudo ufw status numbered //按编号显示 +``` + +## 4. 防火墙版本 + +``` +sudo ufw version +``` + +## 5.开启/禁止端口 + +``` +sudo ufw allow|deny [service] +``` + +## 6.开启/关闭防火墙 (默认设置是`disable`) + +``` +sudo ufw enable|disable +``` + +## 7.常见用法 + +## 7.1基本使用 + +``` +sudo ufw enable +sudo default deny +``` + +运行以上两条命令后,开启了防火墙,并在系统启动时自动开启。关闭所有外部对本机的访问,但本机访问外部正常;此时系统已经足够安全了,如果你需要开放某些服务,再使用`sudo ufw allow`开启。 + +设置默认策略(默认策略即为拒绝所有传入连接,允许所有传出链接) + +``` +sudo ufw default deny incoming +sudo ufw default allow outgoing +``` + +允许SSH连接(重要!)否则你将无法连接云服务器… + +``` +sudo ufw allow ssh +sudo ufw allow 22 +``` + +### 7.2启动端口 + +示例: + +``` +sudo ufw allow from 123.45.67.89 //允许从一个 IP 地址连接 +sudo ufw allow from 123.45.67.89/24 //允许特定子网的连接: +sudo ufw allow smtp  //允许所有的外部IP访问本机的25/tcp (smtp)端口 +sudo ufw allow 22/tcp //允许所有的外部IP访问本机的22/tcp (ssh)端口 +sudo ufw allow 53 //允许外部访问53端口(tcp/udp) +sudo ufw allow from 192.168.1.100 //允许此IP访问所有的本机端口 +sudo ufw allow proto udp 192.168.0.1 port 53 to 192.168.0.2 port 53 + +sudo ufw allow www +sudo ufw allow 80/tcp + +sudo ufw allow ftp +sudo ufw allow 21/tcp + +sudo ufw allow 22/tcp //允许所有的外部IP访问本机的22/tcp (ssh)端口 +sudo ufw allow 53 //允许外部访问53端口(tcp/udp) +sudo ufw allow 80 //允许外部访问80端口 等价 sudo ufw allow http +sudo ufw allow http + +sudo ufw allow from 192.168.1.1 //允许此IP访问所有的本机端口 +sudo ufw allow from 111.111.111.111 to any port 22 //允许特定IP特定端口的连接 +sudo ufw allow proto udp 192.168.0.1 port 53 to 192.168.0.2 port 53 +sudo ufw allow smtp  //允许所有的外部IP访问本机的25/tcp (smtp)端口 +``` + +允许特定 IP/端口的组合: + +``` +sudo ufw allow from 123.45.67.89 to any port 22 proto tcp +//proto tcp 可以删除或者根据你的需求改成 proto udp,所有例子的 allow 都可以根据需要变成 deny。 +``` + +允许特定端口范围连接 + +``` +sudo ufw allow 1000:2000/tcp +sudo ufw allow 2001:3000/udp + +//拒绝所有的TCP流量从10.0.0.0/8 到192.168.0.1地址的22端口 +sudo ufw deny proto tcp from 10.0.0.0/8 to 192.168.0.1 port 22 + +//可以允许所有RFC1918网络(局域网/无线局域网的)访问这个主机(/8,/16,/12是一种网络分级): +sudo ufw allow from 10.0.0.0/8 +sudo ufw allow from 172.16.0.0/12 +sudo ufw allow from 192.168.0.0/16 +``` + +### 7.3禁用端口 + +示例: + +``` +sudo ufw deny http //拒绝http连接 +sudo ufw deny smtp //禁止外部访问smtp服务 + +sudo ufw deny from 111.111.111.111 //拒绝特定IP连接 +sudo ufw deny from 192.168.1.5 to any //拦截或拒绝来自192.168.1.5的所有数据包 +``` + +除了基于端口的允许或阻止,UFW 还允许您按照 IP 地址、子网和 IP 地址/子网/端口的组合来允许/阻止: + +``` +ufw deny from {ip-address-here} to any port {port-number-here} + +//例子: +sudo ufw deny from 202.54.1.5 to any port 80 //阻断或拒绝IP地址202.54.1.5访问80端口的请求 +``` + +拦截特定IP、端口以及协议: + +``` +sudo ufw deny proto {tcp|udp} from {ip-address-here} to any port {port-number-here} + +//例如:阻断IP地址202.54.1.1访问tcp 22端口(FTP协议),可以输入 +sudo ufw deny proto tcp from 202.54.1.1 to any port 22 +sudo ufw status numbered +``` + +拦截子网 + +``` +sudo ufw deny proto tcp from sub/net to any port 22 +sudo ufw deny proto tcp from 202.54.1.0/24 to any port 22 +``` + +## 7.4删除规则 + +``` +sudo ufw delete allow ssh +sudo ufw delete allow 22 + +sudo ufw delete allow http +sudo ufw delete allow 80 +sudo ufw delete allow 80/tcp + +sudo ufw delete allow 1000:2000/tcp +``` + +如果规则又长又复杂,问题就比较棘手了。这里有一个更简单的方法,需要分成两个步骤: + +``` +sudo ufw status numbered //按规则来编号防火墙规则。命令会将所有防火墙规则以数字列表形式列出来 +# 请将 [number] 替换成规则列表对应的数字序号。 +sudo ufw delete 1 //按规则编号删除防火墙规则 sudo ufw delete [number] +sudo ufw delete 4 //删除编号为4的规则 +``` + +## 8.详细说明 + +``` +//[]内的为选配项 +//命令激活|关闭|重新载入 +ufw enable|disable|reload + +//命令默认 允许|阻止|拒绝 [访问本机的规则|向外访问的规则 +//注:reject让访问者知道数据被拒绝(回馈拒绝信息)。deny则直接丢弃访问数据,访问者不知道是访问被拒绝还是不存在该主机。 +ufw default allow|deny|reject [incoming|outgoing] + +//命令日志 开启|关闭|“级别” +ufw logging on|off|LEVEL + +//命令复位 +ufw reset + +//命令状态 [详细|被编号的规则] +ufw status [verbose|numbered] + +//命令显示 “报告类型” +ufw show REPORT + +//命令[删除][插到“x号规则”之前] 允许|阻止|拒绝|限制 [进|出] [记录新连接|记录所有数据包] “端口” [/“协议”] +ufw [delete] [insert NUM] allow|deny|reject|limit [in|out][log|log-all] PORT[/protocol] + +//命令[删除][插到x号规则之前] 允许|阻止|拒绝|限制 [进|出 基于“什么网络设备”] [协议 “协议”] [来源 “地址” [端口 “端口”]] [目标 “地址” [端口 “端口”]] +ufw [delete] [insert NUM] allow|deny|reject|limit [in|out on INTERFACE] [log|log-all] [proto protocol] [from ADDRESS [port PORT]] [to ADDRESS [port PORT]] + +//命令删除 “第X号规则” +ufw delete NUM + +//命令程序 清单|信息|默认|更新 +ufw [--dry-run] app list|info|default|update +``` + +## 9.参数 + +``` +–version +显示程序版本号 + +-h , –help +显示帮助信息 + +–dry-run +不实际运行,只是把涉及的更改显示出来。 + +enable +激活防火墙,开机时自动启动 + +disable +关闭防火墙,开机时不启动 + +reload +重新载入防火墙 + +default allow|deny|reject 方向 +方向是指:向内(incoming)|向外(outgoing)。如果更改了默认策略,一些已经存在的规则可能需要手动修改。更多内容看“规则示例”一节。 + +logging on|off|“级别” +切换日志状态。日志记录包使用的是系统日志。“级别”有好几个,默认是低级(low)。详细内容看“日志”一节。 + +reset [--force] +关闭防火墙,并复位至初始安装状态。如果使用–force选项,则忽略确认提示。 + +status +显示防火墙的状态和已经设定的规则。使用status verbose显示更详细的信息。‘anywhere’与‘any’、‘0.0.0.0/0’一个意思。 + +show “报告类型” +显示防火墙运行信息。详细内容看“报告类型” + +limit “规则” +此命令目前只能用于IPv4。还不支持IPv6. +``` + +学习更多知识,加QQ群:1098090823 + + + + + + + + + diff --git a/06===BPEMR/xi-note-computer/Xi-C-操作系统/Windows/wsl2总结.md b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Windows/wsl2总结.md new file mode 100644 index 0000000..20d1a13 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-C-操作系统/Windows/wsl2总结.md @@ -0,0 +1,147 @@ +> 所需环境: windows11专业版及以上 +> WSL版本: 2 +> 镜像: 通过VM导出或Docker导出 + +## 获取镜像 + +### 使用VM + +1. 安装好镜像 + +2. 制作镜像 + +```bash + cd / + tar Jcvpf debian.tar --exclude=/debian.tar --exclude=/proc --exclude=/sys / +``` + +### 使用Docker + +直接备份Docker容器 + +## 导入到WSL + +```bash + # 导入 + wsl --import Debian_base d:\WSL\Debian_base C:\Users\x7129\debian.tar + # 导出 + wsl --export Debian_base D:\Debian_Base_WSL.tar + # 强制关闭 + wsl --shutdown + # 查看运行状态 + wsl -l --all -v + # 注销 + wsl --unregister + # 进入用户主页 + wsl ~ + # 进入身份 + wsl -u root + # 更感默认账户,导入版不行 + # config --default-user + # 关闭运行 + wsl --terminate + # 设置默认分发版 + wsl -s Debian_base +``` + +## 设置开机启动 + +win+r 输入shell:startup +创建文件: `wsl_init.vbs` + +```powershell +Set ws = WScript.CreateObject("WScript.Shell") +ws.run "wsl -d Debian_base -u root /etc/wsl.init restart",vbhide +ws.run "Set-VMSwitch WSL -NetAdapterName 以太网",vbhide +``` + +wsl 的其他参数 + +cmd="wsl -d Ubuntu-20.04 -u root --cd %USERPROFILE%" +CreateObject("Wscript.Shell").run cmd,vbhide +除此之外还可以为 wsl设置一些参数,用于指定 wsl 的运行状态: + +--cd %USERPROFILE%用于指定wsl 的工作目录 +-u root 用于指定 wsl的登录用户为 root +-d Ubuntu-20.04 用于指定 wsl 的发行版,可以使用 wsl -l -v查看当前发行版 + +## 设置桥接网络 + +win+r shell:startup +创建文件: `wsl_switch.vbs` + +```powershell +# 存在中文编码方式为ASCII +strCommand ="C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -command Set-VMSwitch WSL -NetAdapterName 以太网" + +Set WshShell = WScript.CreateObject("WScript.Shell") +If WScript.Arguments.Length = 0 Then + Set ObjShell = CreateObject("Shell.Application") + ObjShell.ShellExecute "wscript.exe" _ + , """" & WScript.ScriptFullName & """ RunAsAdministrator", , "runas", 1 + WScript.Quit +End if + Set objExec = WshShell.Exec(strCommand) +``` + + +## 编辑wsl内部wsl.init文件 + +```bash + export PATH=/usr/sbin/:$PATH + service ssh start + # 后续启动内容可以添加 +``` + +## 更改命令行提示颜色 cp /home/nie/.bashrc /root + +- 将ps1哪一行32改成31 root为红色 + + +## 设置网络 + +```powershell + # 管理员身份运行 + Get-NetAdapter + # 可能需要开启运行脚本的指令 + Set-VMSwitch WSL -NetAdapterName 以太网 #以太网可以根据情况换,观察上面列出的网卡名称 +``` + +## wsl内部 +```bash + nano /etc/network.sh + #!/bin/bash + new_ip=192.168.1.233 + brd=192.168.1.255 + gateway=192.168.1.1 + nameserver=192.168.1.1 + net_dev=eth0 + # 注意,下面这里需要用到wsl的sud执行命令,所以需要填写你wsl的密码 + echo "[your password]" | sudo -S ip addr del $(ip addr show $net_dev | grep 'inet\b' | awk '{print $2}' | head -n 1) de>sudo ip addr add $new_ip/24 broadcast $brd dev $net_dev + sudo ip route add 0.0.0.0/0 via $gateway dev $net_dev + sudo sed -i "\$c nameserver $nameserver" /etc/resolv.conf +``` + +```bash + # /etc/wsl.init加入 + /etc/wsl_network.sh +``` + +## 其他设置 + +```bash + # nano /etc/wsl.conf + [user] + default=nie # 默认登陆账户 + [network] + hostname = wow-xi + generateHosts = false # 不自动修改主机名 + generateResolvConf = false # 不自动修改DNS +``` + +```bash + # nano /etc/hosts + # 加入上面设置的主机名 + 127.0.0.1 wow-xi + 127.0.0.1 localhost +``` \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-Plan9/2023年.md b/06===BPEMR/xi-note-computer/Xi-Plan9/2023年.md new file mode 100644 index 0000000..97d434a --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-Plan9/2023年.md @@ -0,0 +1,199 @@ +> 对本年度进行规划 + +## 年度总计划 +1. [ ] 攒钱 叁萬元整 +2. [ ] 深入学习js相关知识 + 1. [ ] TypeScript + 2. [ ] Vue 3 + 3. [ ] React 18 & React Router + 4. [ ] koa2 +3. [ ] 学习GoLang&Docker等技术 +4. [ ] 使用Go和Node&Bun开发同一款管理软件 + 1. [ ] 功能-记账和统计 +5. [ ] 减肥至130斤 +6. [ ] 减少抽烟量以至于戒烟 +7. [ ] 控制饮食 + 1. 不暴饮暴食 + 2. 少吃肉 + 3. 多吃稀饭类的东西 + 4. 尝试吃水果 + 1. 香蕉🍌 + 2. 葡萄🍇 + 3. 猕猴桃🥝 + 4. 樱桃🍒 + 5. 桃子🍑 +8. [ ] 规律作息 + 1. 早上6点整🕕起床,刷牙洗脸洗头 + 2. 早上6点半🕡晨跑听音乐,坚持40分钟左右 + 3. 早上7点整🕖学习和看书 + 4. 早上8点半🕣吃早饭上班 + 6. 晚上7点左右🕖下班进行锻炼 + 7. 晚上8点整🕗回家中继续学习读书 + 8. 晚上9点整🕘洗脚刷牙洗脸准备睡觉 + 9. 晚上9点40酝酿睡觉 + +## 1月 January + +- - [ ] 对文件进行整理 + - - [ ] 各种网盘文件的统一 + - - [ ] 技术上的文件归纳 + - - [ ] 仓库整理 +- - [ ] 做好本年度的细致规划(思想上,行为上) +- - [x] 回家过年(爸爸,妈妈,妹妹的礼物) +- - [ ] 思考要做的事情(主要是在技术上的产物) +- - [x] 完善文档体系(将生活使用Obsidian记录下来的体系) +- - [ ] 修复家里的网络,树莓派,带回去一个路由器 +- - [ ] 好好清理房子,衣服和各种物品 + +### 16日 周一 + +- [x] 必须完成RGV官网的反馈和图片点击跳转 +- [x] 整理百度云的文件 +- [ ] 整理阿里云的文件,将云盘文件全部转移到阿里云(下载较慢,得延期) +- [ ] 规划年度计划 + +### 17日 周二 放假 + +- [ ] 在公司下载B站视频 +- [ ] 转移Github项目到TOGY.TOP +- [ ] 规整所有项目到TOGY.TOP +- [ ] 规划年度计划 +- [ ] 整理高中知识点 + +😢失败的一天 + +### 18日 周三 + +- [ ] 收拾家里的衣服和其他物品 +- [ ] 继续规划未来 +- [ ] 整理各种笔记到这里 + +### 19日 周四 + +- [ ] 收拾回家的衣物等 +- [ ] + +### 20日 周五 回家 + +雪瑶来了 + +### 21日 周六 过年 + +雪瑶在玩 + +### 22日 周日 + +去朱根和吴阳家,王波回来了 + +### 23日 初二 🏠 + +大家都来了,彤彤,吴华,吴萍他们 + +### 24日 初三 + +去小姑家 + +### 25日 初四 ❤️ + +下午去了城里,见到了高力,杨继,王澳,李志伟。 +和图一一联线,尝试复原。 + +### 26日 初五 + +去李志伟家,喝多了,好讨厌喝酒。 +晚上回来打了台球,但是已经醉熏熏了。 + +### 27日 初六 🌍 + +回到西安,和王飞晚上看了流浪地球2 很好看 + +### 28日 初七 + +来到城固,见到了图一一同学,约好了明天看电影 +晚上和图一一同学逛了一圈,很开心 +发现身份证丢了。 + +### 29日 初八 假期最后一天 ❤️ + +和图一一同学看了电影。 +和图一一同学吃了火锅。 +送图一一同学回家。 +离开城固,回到西安。 +确定了和图一一的关系。 + +### 30日 上班第一天 + +我在公司摸鱼,因为昨晚睡的很迟,我很困,因此中午睡了好久 +开始节食计划和锻炼计划,虽然只是步行,我想有一个好的起点 + +### 31日 今日仍然无事可做 + +在公司摸鱼,下午安装了Docker,但是好多东西忘了,准备翻看笔记,但是windows对我的Mac笔记支持不是很好,我很难过 +晚上回来,走了很远,依然在节食。 + + +## 2月 February + +### 本月计划概要 + +1. Docker +2. 水果 +3. 锻炼 +4. 作息 +5. 计划习惯 + +### 1日 这个月的开端 + +- [ ] 早起,7点醒来,刷牙洗脸 +- [x] 开始读书吧。《沁园春-雪》 +- [x] 将电脑带到公司,记录相关笔记,docker和dockerfile +- [ ] 晚上少吃点东西,忌油腻和肉类食物,希望包子店开门,擀面皮和紫菜汤 +- [x] 锻炼,可以尝试跑步 +- [x] 伍六七第四季第四集 +- [ ] 👻❤️💀🐸🎈💣🌥️ 生涯 + +### 2日 周四 + +- [ ] 早起 +- [ ] 读书 -《》 +- [ ] 晨练 +- [x] 晚练 -时间 7:35-8:55 +- [ ] 学习golang语言,京东读书,参与,两小时 + +### 3日 周五 第一个假期 + +- [ ] 早起 +- [ ] 读书 +- [ ] 晨炼 +- [ ] 晚练 +- [ ] 学习和笔记 + +### 4日 周六 重要的日子 + +- [ ] 早起 +- [ ] 读书 +- [ ] 晨练 +- [ ] 晚练 +- [ ] 洗衣服 +- [ ] 收拾房子 +- [ ] + +## 3月 March + +## 4月 April + +## 5月 May + +## 6月 June + +## 7月 July + +## 8月 August + +## 9月 September + +## 10月 October + +## 11月 November + +## 12月 December \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/Readme.md b/06===BPEMR/xi-note-computer/Xi-S-XinQu/Readme.md new file mode 100644 index 0000000..2b20631 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-S-XinQu/Readme.md @@ -0,0 +1,5 @@ +> 心曲 + +我,想要设计出来一款完整的东西。 + +我想要给她完整的一生XD。 \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ01-需求导入.md b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ01-需求导入.md new file mode 100644 index 0000000..ab07938 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ01-需求导入.md @@ -0,0 +1,46 @@ +# 记账 + +1. 自动读取微信和支付宝的账单记录,优化支出方向 +2. 设置预算,收入支出分类,工资来源, +3. 负债 + + + +# 文件存储 + +1. 文件唯一性验证 +2. 分片上传 +3. 断点续传 +4. blob下载 +5. 文件分享 +6. 文件批量移动 +7. 文档在线编辑 +8. 图片在线查看 +9. 视频在线播放 +10. 命令行快捷下载(用户别名+文件别名+版本) +11. 用户组共享文件夹 + + +# 心情日记 + +1. 天气自动获取(定位) +2. 心情符号 +3. 心情可视化表 +4. 坚持清单 +5. 终极目标(全站循环) +6. + + +# 笔记 + +1. 笔记封面内容 +2. 笔记夹 +3. MarkDown +4. 笔记分享 + + +# 仿微博和空间的东西 + +1. 发帖子 +2. 加好友 +3. 在线聊天 \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ02-前置功能模块.md b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ02-前置功能模块.md new file mode 100644 index 0000000..e86d78c --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ02-前置功能模块.md @@ -0,0 +1,36 @@ +# 用户系统 + +1. 用户信息收集 +2. 用户登录方式 +3. 用户密码 +4. token存储共享 +5. 用户组(角色) +6. 权限与共享 +7. 用户信息的联合存储系统 + +# 日志系统 + +1. 系统日志 +2. 用户日志 +3. 系统资源日志 + +# 微服务载入系统 + +1. 系统架构纵览 +2. 系统负载显示 +3. 服务组件状态 +4. 服务组件添加分配 +5. 各服务的权限列表何菜单列表 +6. 各服务前置服务 + +# 数据备份系统 + +1. 全逻辑删除 +2. 全自增ID + +# 基础文件系统 + +1. 提供基础的文件上传下载功能 +2. 为隽辞系统提供底层服务 + + diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ03-需求模块分析.md b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ03-需求模块分析.md new file mode 100644 index 0000000..798618d --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ03-需求模块分析.md @@ -0,0 +1,146 @@ +# 1 用户模块 + +## 1.1 用户信息存储 + +### 1.1.1 存储方式 + +- 参考Docker的联合文件系统,为保存全段数据,所有数据采用联合文件系统思想。 +- 常用数据每次修改后存Redis,读取时更新。 + +### 1.1.2 存储字段 + +- 基础表user_info_base + - [x] uuid + +- 验证表user_info_verify + - [x] 电话 n1 + - [x] 用户名称(账号) + - [x] 邮箱 n1 + - [x] 身份证号码 + - [x] qq n1 + - [x] 微信 n1 + +- 额外表-基础user_info_extra + - [x] 真实姓名 + - [x] 昵称 + - [x] 出生日期 + - [x] 性别 + - [x] 地址 + - [x] 主页 + - [x] github主页 + - [x] 微博 + - [x] 抖音 + - [x] 支付宝 + - [x] 国家地区 + - [ ] 区县信息 n1 + - [x] 个人简介 + +- 密码表 user_info_passwd + - [x] 用户密码 + +- 描述性用户信息拓展表 user_info_extra_describe + - [x] 爱好 n + - [x] 属性 + - [x] 喜欢的运动 n + - [x] 喜欢的电影 n + - [ ] 喜欢的电视剧 n + - [x] 喜欢的 特别的人 n + - [x] 喜欢的动物 n + - [x] 喜欢的植物 n + - [x] 想去的地方 n + +- 用户信息-签名 user_info_extra_signone + - [x] 签名 + + +其他字段 + +- 关联前账号 + +## 1.2 用户角色 - 定位fixed position + +### 1.2.1 存在的角色类型 + +- 本系统自带的角色,如超级管理员,使用用户 +- 其他拓展角色,系统外部的角色,如加入特殊组织时的管理员,职责,岗位,等级等产生的角色关联,目前系统不考虑,但是会提供相应的数据接口以便拓展 +- 角色的叠加态,角色的默认权限问题,为用户单独链接权限的问题(直属权限) + +### 1.2.2 角色存储字段 + +> 20230312 角色可以嵌套,以此可以实现多种结构组织 + +- 角色定位表 +- [ ] 用户角色名称 +- [ ] 角色标志 +- [ ] 父角色id +- [ ] 角色描述 +- [ ] 角色创建人 +- [ ] 角色创建时间 + +- [ ] 用户uuid +- [ ] 角色何权限的关联问题 + +### 1.2.3 角色拓展查询问题 + +- 考虑到用户模块作为核心的权限模块,所有账户相关的权限信息都应该由权限模块统一分发,但非基础权限的存放由外部程序提供 +- 这个问题还需待议 + +#### Q + +## 1.3 权限 + +### 1.3.1 权限分类相关 + +- 用户系统自带超管相关权限基础 +- 权限分类有以下几个方面 + - 核心模块权限,如文件管理系统和记账 + - 各个系统下的子权限 +- 各个权限由各个系统提供,最后由微服务关联系统进行加载,传至用户系统统一管理 + +### 1.3.2 用户系统超级管理员职责 + +- 管理各个模块系统的微服务加载许可状态 +- 管理各个系统的分布 +- 管理其他子管理员 + +### 1.3.3 相关字段 + +- 所属服务系统 +- 父权限 +- 权限名称 +- 权限描述 +- 权限ID +- 权限标志 + + +# 2 基础文件系统 + +## 2.1 文件上传及下载 + +### 2.1.1 文件上传 + +- 文件分片上传 +- 文件大小限制 +- 文件校验(文件大小和第一片MD5) +- 断点续传 +- 文件版本控制 + +### 2.1.2 文件下载 + +- 分片下载 +- 命令行别名下载 +- 断点续传 + +## 2.2 文件字段 + +- 文件名 +- MD5 +- UUID +- 文件类型 +- 上传者 +- 上传事件 +- 文件大小 +- 别名 +- 标签 +- 文件夹 +- 父目录 \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ04-场景分析.md b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ04-场景分析.md new file mode 100644 index 0000000..8b6b7a9 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ04-场景分析.md @@ -0,0 +1,21 @@ +# 超管 + +1. 设置修改系统名称 +2. 设置其他管理员 + +# 系统启动 + +1. 各个系统提交自己的身份识别信息,各种信息的冲突 +2. 各个系统提交权限信息 +3. 用户系统将权限信息加入Redis + +# 微服务载入程序(Port:62176) + +> 由超管账号管理 + +1. 获取各个服务端口,生成Nginx配置文件(地址,端口,根路径) +2. 收集接口信息 +3. 收集权限信息 +4. 收集角色信息 +5. 子系统状态监控(进程号,内存占用) +6. 测试各个子系统代理状态(固有onlineTest接口) \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ05-数据库建设.md b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ05-数据库建设.md new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ06-接口建设和自动化测试.md b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ06-接口建设和自动化测试.md new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ07-建设工程控制-流程和工期.md b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ07-建设工程控制-流程和工期.md new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ08-预期和阶段成果.md b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ08-预期和阶段成果.md new file mode 100644 index 0000000..e69de29 diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ10-程序结构/XQ06-接口建设和自动化测试.xmind b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ10-程序结构/XQ06-接口建设和自动化测试.xmind new file mode 100644 index 0000000..4b4c315 Binary files /dev/null and b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ10-程序结构/XQ06-接口建设和自动化测试.xmind differ diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ10-程序结构/微服务架构拓扑.canvas b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ10-程序结构/微服务架构拓扑.canvas new file mode 100644 index 0000000..e91319a --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ10-程序结构/微服务架构拓扑.canvas @@ -0,0 +1,18 @@ +{ + "nodes":[ + {"type":"text","text":"微服务载入程序:心曲-恐龙领地","id":"8a171f21fc6e6657","x":-260,"y":160,"width":540,"height":60,"color":"5"}, + {"type":"text","text":"日志记录系统:心志","id":"dd0ea44fb99ad1d0","x":-260,"y":60,"width":160,"height":60,"color":"4"}, + {"type":"text","text":"用户系统:星稀","id":"912e1a7ca9283c3e","x":-260,"y":-40,"width":540,"height":60,"color":"1"}, + {"type":"text","text":"账务系统:亚精","id":"f68fdec3a9322ced","x":-260,"y":-140,"width":260,"height":60,"color":"6"}, + {"type":"text","text":"文件系统:隽辞","id":"928eac2ce3c26991","x":20,"y":-140,"width":260,"height":60,"color":"6"}, + {"type":"text","text":"基础文件系统:元朔","id":"1a2091c7d218c90f","x":120,"y":60,"width":160,"height":60,"color":"4"}, + {"type":"text","text":"资源控制系统:莉莉丝","id":"e3da27eee3d283c8","x":-70,"y":60,"width":160,"height":60,"color":"4"}, + {"type":"text","text":"REDIS","id":"58b8b2e54c047e23","x":420,"y":-360,"width":50,"height":480} + ], + "edges":[ + {"id":"c55ccef34fff6e0a","fromNode":"8a171f21fc6e6657","fromSide":"left","toNode":"912e1a7ca9283c3e","toSide":"left","toEnd":"none","label":"系统设置"}, + {"id":"e523f0e1f89963a7","fromNode":"1a2091c7d218c90f","fromSide":"bottom","toNode":"8a171f21fc6e6657","toSide":"top","toEnd":"none"}, + {"id":"8598cd056cbf5ee2","fromNode":"e3da27eee3d283c8","fromSide":"bottom","toNode":"8a171f21fc6e6657","toSide":"top","toEnd":"none"}, + {"id":"d317adc6f045f802","fromNode":"dd0ea44fb99ad1d0","fromSide":"bottom","toNode":"8a171f21fc6e6657","toSide":"top","toEnd":"none"} + ] +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ10-程序结构/用户系统数据架构.canvas b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ10-程序结构/用户系统数据架构.canvas new file mode 100644 index 0000000..2142a27 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-S-XinQu/XQ10-程序结构/用户系统数据架构.canvas @@ -0,0 +1,19 @@ +{ + "nodes":[ + {"type":"text","text":"用户验证信息","id":"c4259f53f309e6b9","x":120,"y":-180,"width":250,"height":60}, + {"type":"text","text":"用户拓展信息","id":"88999d515b6fbac4","x":120,"y":-100,"width":250,"height":60}, + {"type":"text","text":"用户密码","id":"ba69f7f37345fe3c","x":120,"y":-20,"width":250,"height":60}, + {"type":"text","text":"用户基础信息","id":"eeead3d71b4716c9","x":-200,"y":-100,"width":250,"height":60}, + {"id":"bced9660574f4b85","x":-200,"y":60,"width":250,"height":60,"type":"text","text":"用户角色关联"}, + {"type":"text","text":"角色信息","id":"2f864ee0f029962a","x":-200,"y":160,"width":250,"height":60}, + {"type":"text","text":"权限信息","id":"f606992261056a7a","x":-200,"y":260,"width":250,"height":60} + ], + "edges":[ + {"id":"9ae512fcaaf2b17f","fromNode":"eeead3d71b4716c9","fromSide":"right","toNode":"c4259f53f309e6b9","toSide":"left"}, + {"id":"033ef3ae6ac50619","fromNode":"eeead3d71b4716c9","fromSide":"right","toNode":"88999d515b6fbac4","toSide":"left"}, + {"id":"17d9adbad850c487","fromNode":"eeead3d71b4716c9","fromSide":"right","toNode":"ba69f7f37345fe3c","toSide":"left"}, + {"id":"b2af8a12f69f6b1c","fromNode":"eeead3d71b4716c9","fromSide":"bottom","toNode":"bced9660574f4b85","toSide":"top"}, + {"id":"0211c0d0c15e35b1","fromNode":"bced9660574f4b85","fromSide":"bottom","toNode":"2f864ee0f029962a","toSide":"top"}, + {"id":"64f8a9513f393f5a","fromNode":"2f864ee0f029962a","fromSide":"bottom","toNode":"f606992261056a7a","toSide":"top"} + ] +} \ No newline at end of file diff --git a/06===BPEMR/xi-note-computer/Xi-S-XinQu/数据库/sql.sql b/06===BPEMR/xi-note-computer/Xi-S-XinQu/数据库/sql.sql new file mode 100644 index 0000000..1656ce5 --- /dev/null +++ b/06===BPEMR/xi-note-computer/Xi-S-XinQu/数据库/sql.sql @@ -0,0 +1,120 @@ +CREATE TABLE `user_authority` ( + `id` int NOT NULL, + `server` varchar(255) NOT NULL COMMENT '服务名', + `index` varchar(255) NOT NULL COMMENT '权限标识', + `name` varchar(255) NOT NULL COMMENT '权限名称', + `type` varchar(255) NOT NULL COMMENT '权限类型(菜单、按钮、接口)', + `father_id` int NULL COMMENT '父权限', + `describe` varchar(255) NULL COMMENT '权限描述', + `creator` varchar(255) NOT NULL COMMENT '创建人', + `ico` varchar(255) NULL COMMENT '图标链接', + `is_delete` int NOT NULL DEFAULT 0 COMMENT '是否删除', + `createtime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) +); + +CREATE TABLE `user_authority_relation` ( + `id` int NOT NULL, + `position_id` int NOT NULL COMMENT '角色定位id', + `authority_id` int NOT NULL COMMENT '权限id', + `creator` varchar(255) NOT NULL COMMENT '创建人', + `createtime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) +); + +CREATE TABLE `user_info_base` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID,用于区分,以及备份索引', + `uuid` varchar(32) NOT NULL COMMENT '每个用户的唯一用户标识', + `state` int NOT NULL DEFAULT 0 COMMENT '用户账号的状态\n0是未激活\n1是正常\n2是禁用\n3是注销', + `createtime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + `about_id` int NULL COMMENT '关联账号(注销关联)', + PRIMARY KEY (`id`) +) COMMENT = '用户基础信息表,存储用户的唯一索引'; + +CREATE TABLE `user_info_extra` ( + `id` int NOT NULL AUTO_INCREMENT, + `uuid` varchar(32) NOT NULL COMMENT '用户唯一标识', + `realname` varchar(255) NULL COMMENT '真实姓名', + `nickname` varchar(255) NULL COMMENT '昵称', + `birthday` bigint NULL COMMENT '生日', + `sex` int NULL COMMENT '性别', + `address` varchar(255) NULL COMMENT '地址', + `country` varchar(255) NULL COMMENT '国家', + `profile` varchar(255) NULL COMMENT '个人简介', + `alibaba_id` varchar(255) NULL COMMENT '阿里账号', + `tiktok_id` varchar(255) NULL COMMENT '抖音账号', + `weibo_id` int NULL COMMENT '微博帐号', + `github_url` varchar(255) NULL COMMENT 'github地址', + `personal_url` varchar(255) NULL COMMENT '个人网站地址', + `createtime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) COMMENT = '用户一般拓展信息表'; + +CREATE TABLE `user_info_extra_describe` ( + `id` int NOT NULL AUTO_INCREMENT, + `uuid` varchar(32) NOT NULL, + `like` varchar(255) NULL COMMENT '爱好', + `other` varchar(255) NULL COMMENT '其他属性', + `motion` varchar(255) NULL COMMENT '运动', + `film` varchar(255) NULL COMMENT '电影', + `person` varchar(255) NULL COMMENT '特别的人', + `animal` varchar(255) NULL COMMENT '动物', + `plant` varchar(255) NULL COMMENT '植物', + `place` varchar(255) NULL COMMENT '想去的地方', + `createtime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) +) COMMENT = '用户描述性信息表'; + +CREATE TABLE `user_info_extra_signone` ( + `id` int NOT NULL AUTO_INCREMENT, + `uuid` varchar(32) NOT NULL, + `describe` varchar(255) NOT NULL, + `createtime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) COMMENT = '用户签名列表'; + +CREATE TABLE `user_info_passwd` ( + `id` int NOT NULL AUTO_INCREMENT, + `uuid` varchar(32) NOT NULL COMMENT '关联用户唯一标识', + `passwd` varchar(255) NOT NULL COMMENT '密码', + `createtime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) +) COMMENT = '密码表'; + +CREATE TABLE `user_info_verify` ( + `id` int NOT NULL AUTO_INCREMENT, + `uuid` varchar(32) NOT NULL COMMENT 'uuid关联基础用户信息', + `username` varchar(32) NULL COMMENT '用户名称', + `phone` varchar(11) NULL COMMENT '手机号', + `wechatid` varchar(32) NULL COMMENT '微信id', + `email` varchar(255) NULL COMMENT '邮箱', + `residentid` varchar(32) NULL COMMENT '身份证', + `qq` bigint NULL COMMENT 'qq号', + `is_multiplex` int NOT NULL DEFAULT 0 COMMENT '是否复用', + `createtime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) +); + +CREATE TABLE `user_position` ( + `id` int NOT NULL, + `type` varchar(255) NOT NULL COMMENT '角色定位类型', + `fatherid` int NULL COMMENT '父id', + `name` varchar(255) NOT NULL COMMENT '角色名称', + `index` varchar(255) NOT NULL COMMENT '角色定位标识', + `describe` varchar(255) NULL COMMENT '角色定位描述', + `creator` varchar(32) NULL COMMENT '创建人uuid', + `ico` varchar(255) NULL COMMENT 'logo路径', + `is_delete` int NOT NULL DEFAULT 0 COMMENT '是否删除', + `createtime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) +) COMMENT = '用户角色定位表'; + +CREATE TABLE `user_position_relation` ( + `id` int NOT NULL, + `uuid` varchar(32) NOT NULL COMMENT '用户标识', + `position_id` int NOT NULL COMMENT '角色定位id', + `is_delete` int NOT NULL DEFAULT 0 COMMENT '是否删除', + `createtime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) +); + diff --git a/06===BPEMR/xi-note-computer/readme.md b/06===BPEMR/xi-note-computer/readme.md new file mode 100644 index 0000000..e856f28 --- /dev/null +++ b/06===BPEMR/xi-note-computer/readme.md @@ -0,0 +1,9 @@ +- 此库作为学习专业知识,计算机领域的内容。 + +- 2023-01-14 + +# HotoKiss 2023-03-22 + +obsidian记录笔记 +笔记:第一次比较全面的笔记 +心曲的设计 diff --git a/06===BPEMR/xi-note-computer/风.md b/06===BPEMR/xi-note-computer/风.md new file mode 100644 index 0000000..2d1154a --- /dev/null +++ b/06===BPEMR/xi-note-computer/风.md @@ -0,0 +1,40 @@ +这是一个平常的时间节点,进入辅助世界线,2023-05-26 15:51 + +距离上一次跳跃已经过去了近6年,6年前的过度投入,渐渐忘记了一些初衷,也逐渐了解了自己的本性。最近出现、产生的意外,导致一系列节点的断裂,不能再支持时间的继续流转,我来到这里,寄希望于过去、未来的自己。 + +事件起因是感情和欲望,我既已混淆并酿成了错误,至此,我反思一下历程。 + +## 月印 + +月印之前(节点)。张辛欣,一个特殊的人,他有超越时间线的敏锐与直觉,因为好奇心、欲望、以及特殊的感情,暂不确定,因为已经忘记了,此时我脑海中的完美变成了恐惧,在此时,我发现了内心深处极为深刻的恶,他是人类本性,但是我将他愈加更甚,伤害即从这里开始,我丢失了许多(冷静,多维),变得偏执,武断,鲁莽,急躁,这个人推进了时间的行进,但是很多没有准备好,有得有失,但间接促使我变得恶劣。她给了我一些自信。 + +月印前后(节点)。郭莹,一个特殊的人,对我影响深刻,大多是积极的,他激发了我的自我感动和自卑懦弱,但也给了我很多动力,是我内心美好的白月光,交集甚少,却也满足了,对于风节点完结后,我会删除关于他的所有记忆,不再提,无论如何,我选择放弃所有感情。跳过感情或者说等待重新再来的感情。张世玲,一个特殊的女孩,一切都是应该很美好的,但是缺少了方法,时机,以及自我认知,他让我逐渐诞生自我认知,因为他我伤害了张辛欣,并且没有过多的交际,或许是因为一位朋友,我忘的彻底,她是月印的开始,郭莹是月印的结束,张辛欣是月印的中心节点,也是转折节点。 + +月印外(节点)。刘秦瑜,一个特殊的人,是朋友,但是因为?不知道因为什么,方向可能不同吧,在她身上我也展现了恶,抛弃,是我最大的恶。 + +月印是懵懂的,是不确定的,在这里迷失,在这里重新起航,梦醒时分,阴阳两隔,已过数万年。 + +## 良人 + +在这里,我遇到了最重要的两个人,一个烙在了血骨上。 + +韩莹,真正曾经最爱的一个人,因为自己的恐惧,不成熟,导致铸成大错,互相伤害,在最后我依然展现的恶,时光虽短,我很开心,但后患刻骨铭心,只能如此了,我怀念他,希望能真正领悟我和他之间的点点滴滴吧。 + +汪隽仪,一个我对不起的人,但是我帮他走出了一个可能会后悔终生的陷阱,第三方视角,功过相抵吧,爱过的,在最后我依然展现了自己的恶。 + +## 风 + +我需要总结两次节点,不再刻意的去做某件事,去想某个人,不在冠冕堂皇,不再过分执着。希望风之后是一个全新的节点,斩断过往。 + +眼下万般利刃,唯有过往伤人最深,我既已无过往 ,便不再踌躇不前。 + + +### 风结点之后 + +去年今日此门中,人面桃花相映红,人面不知何处去,桃花依旧笑春风。 + +人生若只如初见,何事秋风悲画扇。等闲变却故人心,却道故人心易变。 + +骊山语罢清宵半,泪雨霖铃终不怨。何如薄幸锦衣郎,比翼连枝当日愿。 + +曾将沧海难为水,除却巫山不是云,取次花丛懒回顾,半缘修道半缘君。 \ No newline at end of file diff --git a/07=logger/.gitignore b/07=logger/.gitignore new file mode 100644 index 0000000..676022c --- /dev/null +++ b/07=logger/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* +*logs/* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/07=logger/README.md b/07=logger/README.md new file mode 100644 index 0000000..2228b89 --- /dev/null +++ b/07=logger/README.md @@ -0,0 +1,3 @@ +# HotoKiss + +winston日志 \ No newline at end of file diff --git a/07=logger/app.js b/07=logger/app.js new file mode 100644 index 0000000..2c32d02 --- /dev/null +++ b/07=logger/app.js @@ -0,0 +1,29 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @文件描述: logger | Nodejs的日志记录工具合集,包括Winston、pino、log4js, +// | @创建时间: 2023-09-15 09:28 +// | @更新时间: 2023-09-15 09:28 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +const winston = require('./src/winston/index') +console.time(1) +winston.fatal('Hello Wrold') +winston.error({time: new Date()},{name:'hexi'},'xsaxasx') +winston.warn('Hello Wrold') +winston.info('Hello Wrold') +winston.debug('Hello Wrold') +winston.trace('Hello Wrold') +console.timeEnd(1) +const obj = { + name:'Nier', + age:25, + sex:1, + muster:"PAC", + role:'保密者', + premier:'ALL' +} +winston.info(obj) diff --git a/07=logger/package-lock.json b/07=logger/package-lock.json new file mode 100644 index 0000000..b2f19f1 --- /dev/null +++ b/07=logger/package-lock.json @@ -0,0 +1,550 @@ +{ + "name": "logger", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "logger", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "winston": "^3.10.0", + "winston-daily-rotate-file": "^4.7.1" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.3.tgz", + "integrity": "sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g==" + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/file-stream-rotator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", + "dependencies": { + "moment": "^2.29.1" + } + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/logform": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", + "dependencies": { + "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/winston": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", + "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", + "dependencies": { + "@colors/colors": "1.5.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-daily-rotate-file": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz", + "integrity": "sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==", + "dependencies": { + "file-stream-rotator": "^0.6.1", + "object-hash": "^2.0.1", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "winston": "^3" + } + }, + "node_modules/winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 6.4.0" + } + } + }, + "dependencies": { + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, + "@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "@types/triple-beam": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.3.tgz", + "integrity": "sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g==" + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "requires": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "file-stream-rotator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", + "requires": { + "moment": "^2.29.1" + } + }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "logform": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", + "requires": { + "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "winston": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", + "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", + "requires": { + "@colors/colors": "1.5.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + } + }, + "winston-daily-rotate-file": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz", + "integrity": "sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==", + "requires": { + "file-stream-rotator": "^0.6.1", + "object-hash": "^2.0.1", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + } + }, + "winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "requires": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + } + } + } +} diff --git a/07=logger/package.json b/07=logger/package.json new file mode 100644 index 0000000..164ffd1 --- /dev/null +++ b/07=logger/package.json @@ -0,0 +1,16 @@ +{ + "name": "logger", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node app.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "winston": "^3.10.0", + "winston-daily-rotate-file": "^4.7.1" + } +} diff --git a/07=logger/src/winston/index.js b/07=logger/src/winston/index.js new file mode 100644 index 0000000..b7e0669 --- /dev/null +++ b/07=logger/src/winston/index.js @@ -0,0 +1,145 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @文件描述: winston的核心文件 +// | @创建时间: 2023-09-15 09:45 +// | @更新时间: 2023-09-15 09:45 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +const winston = require("winston"); +require("winston-daily-rotate-file"); + +// 自定义日志等级和颜色 +const myCustomLevels = { + levels:{ + fatal: 0, + error: 1, + warn: 2, + info: 3, + debug: 4, + trace: 5 + }, +// 字体样式:bold, dim,italic, underline, inverse, hidden, strikethrough +// 字体背景颜色:black, red, green, yellow, blue, magenta紫色, cyan青色, white, gray, grey +// 背景颜色:blackBG, redBG, greenBG, yellowBG, blueBG, magentaBG, cyanBG, whiteBG + levelsColor:{ + fatal: 'bold red cyanBG italic underline', + error: 'bold magenta', + warn: 'yellow', + info: 'green', + debug: 'cyan', + trace: 'white' + } +} +// 创建颜色方法 +const colorizer = winston.format.colorize(); +colorizer.addColors(myCustomLevels.levelsColor) + +const logger = winston.createLogger({ + // colorize: true, + // prettyPrint: true, + // json:true, + level: 'trace', // 日志打印等级 + levels: myCustomLevels.levels,// 日志等级列表 + exitOnError: false,// 如果为false,处理异常不会导致process.exit + silent: false, // 如果为true,所有日志被抑制 + format: winston.format.combine( + // winston.format.label({ label: '测试' }),// 自定义标签 + // winston.format.align(),//加了打印不出来对象 + // winston.format.prettyPrint(), + // winston.format.json(), + winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss:SSS" }), + winston.format.printf( + (i) => { + const splatList = Array.from(Object.getOwnPropertySymbols(i)) + const splat = splatList && splatList.filter(item => item.toString() === 'Symbol(splat)') + const splatName = splat.length == 1 ? splat[0] : null + const data = splatName ? JSON.stringify([i.message, ...i[splatName]]) : JSON.stringify({message:i.message}) + return `${i.timestamp} [${i.level.padEnd(5, ' ').toUpperCase()}] ${data}` + // return colorizer.colorize( + // i.level, + // `${i.timestamp} [${i.level.padEnd(5, ' ').toUpperCase()}] ${data}`, + // ); + }, + ), + ), + transports: [ + new winston.transports.DailyRotateFile({ + filename: "winston-logs/%DATE%-INFO--winston.log", + level: "info", + datePattern: "YYYY-MM-DD", + zippedArchive: true,// 启用压缩 + maxSize: "10m",// 单文件大小 + maxFiles: "30d",// 存储时间 + // format: winston.format.combine( + // winston.format.printf(i => `${i.timestamp} [${i.level.padEnd(5, ' ').toUpperCase()}] ${i.message}`), + // ) + }), + new winston.transports.DailyRotateFile({ + filename: "winston-logs/%DATE%-ERROR-winston.log", + level: "error", + datePattern: "YYYY-MM-DD", + zippedArchive: true, + maxSize: "10m", + maxFiles: "365d", + // format: winston.format.combine( + // winston.format.printf(i => `${i.timestamp} [${i.level.padEnd(5, ' ').toUpperCase()}] ${i.message}`), + // ) + }), + ], + // winston可以捕获和记录异常 + exceptionHandlers: [ + new winston.transports.File({ filename: 'winston-logs/winston-exceptions.log' }) + ], + // 捕获uncaughtRejection事件 + rejectionHandlers: [ + new winston.transports.File({ filename: 'winston-logs/rejections.log' }) + ] +}); +// 后续加入记录器,这里可以加入环境变量的判断,当为生产模式时,取消控制台的打印操作。 +logger.add(new winston.transports.Console({ + format:winston.format.combine( + winston.format.printf( + (i) => { + const splatList = Array.from(Object.getOwnPropertySymbols(i)) + const splat = splatList && splatList.filter(item => item.toString() === 'Symbol(message)') + const splatName = splat.length == 1 ? splat[0] : null + const data = splatName ? i[splatName] : i.message + return colorizer.colorize( + i.level, + data + ); + }, + ), + ) +})) +function getStack(){ + (function throwNewError() { + try { + throw new Error() + } catch (err) { + console.trace('AA') + console.log('AAA') + const stack = err.stack; + console.log(stack) + const stackList = stack.split('\n') + const fileStackList = stackList.map(i => i.trim()) + let stackPost; + console.log('BBB') + for (let i in fileStackList) { + if (fileStackList[i].indexOf('throwNewError') != -1) { + stackPost = Number(i) + break + } + } + const stackLine = fileStackList[stackPost + 3]; + console.log('CCC') + // const dirname = __dirname.split(path.sep).join(path.posix.sep) + console.log(stackLine.split(__dirname).slice(-1)[0]) + } + })() +} +module.exports = logger diff --git a/07=logger/src/winston/test.js b/07=logger/src/winston/test.js new file mode 100644 index 0000000..a008f5e --- /dev/null +++ b/07=logger/src/winston/test.js @@ -0,0 +1,67 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @文件描述: logger +// | @创建时间: 2023-09-15 11:24 +// | @更新时间: 2023-09-15 11:24 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +const winston = require('winston'); +const colorizer = winston.format.colorize(); +const { + combine, timestamp, printf, simple, +} = winston.format; + +const myCustomLevels = { + levels: { + error: 0, + warn: 1, + data: 2, + info: 3, + debug: 4, + verbose: 5, + silly: 6, + custom: 7, + a:8, + }, + colors: { + error: 'red', + warn: 'orange', + data: 'grey', + info: 'green', + debug: 'yellow', + verbose: 'cyan', + silly: 'magenta', + custom: 'blue', + a:'blue' + }, +}; + +colorizer.addColors(myCustomLevels.colors); + +const logger = winston.createLogger({ + colorize: true, + prettyPrint: true, + level: 'a', + levels: myCustomLevels.levels, + format: combine( + simple(), + printf( + (msg) => { + return colorizer.colorize( + msg.level, + `${msg.level} - ${msg.message}`, + ); + }, + ), + timestamp(), + ), + transports: [ + new winston.transports.Console(), + ], +}); + +module.exports = logger; diff --git a/07=logger/src/winston/winston.conf.js b/07=logger/src/winston/winston.conf.js new file mode 100644 index 0000000..f334f50 --- /dev/null +++ b/07=logger/src/winston/winston.conf.js @@ -0,0 +1,11 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @文件描述: winston的配置文件 +// | @创建时间: 2023-09-15 09:45 +// | @更新时间: 2023-09-15 09:45 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ diff --git a/08=rgvScleNestjs/.eslintrc.js b/08=rgvScleNestjs/.eslintrc.js new file mode 100644 index 0000000..259de13 --- /dev/null +++ b/08=rgvScleNestjs/.eslintrc.js @@ -0,0 +1,25 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}; diff --git a/08=rgvScleNestjs/.gitignore b/08=rgvScleNestjs/.gitignore new file mode 100644 index 0000000..e706083 --- /dev/null +++ b/08=rgvScleNestjs/.gitignore @@ -0,0 +1,38 @@ +# compiled output +/dist +/node_modules +/Log/* +/file/* + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +pnpm-lock.yaml + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json \ No newline at end of file diff --git a/08=rgvScleNestjs/.prettierrc b/08=rgvScleNestjs/.prettierrc new file mode 100644 index 0000000..bb05c7f --- /dev/null +++ b/08=rgvScleNestjs/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "tabWidth": 4 +} \ No newline at end of file diff --git a/08=rgvScleNestjs/README.md b/08=rgvScleNestjs/README.md new file mode 100644 index 0000000..0aa3b10 --- /dev/null +++ b/08=rgvScleNestjs/README.md @@ -0,0 +1,3 @@ +# HotoKiss + +RGV销售管理系统 diff --git a/08=rgvScleNestjs/config/development.ts b/08=rgvScleNestjs/config/development.ts new file mode 100644 index 0000000..fa9d4f1 --- /dev/null +++ b/08=rgvScleNestjs/config/development.ts @@ -0,0 +1,59 @@ +export default { + // 主服务 + master: { + systemName: '心曲Tune', + host: '0.0.0.0', + port: '3000', + }, + swagger: { + enable: true, + }, + dev: { + // 开发模式拦截器,用以提供接口请求时间和响应大小 + devInterceptor: true, + }, + log: { + level: 'all', + }, + databases: { + starLight: { + host: '10.10.10.200', + port: 3306, + username: 'root', + password: 'root', + database: 'rgv-sale-system', + }, + }, + redis: { + starLight: { + host: 'localhost', + port: 6379, + username: 'default', + password: 'default', + dbNumber: 3, + }, + }, + email: { + host: 'smtp.qq.com', + user: 'togy.gc@qq.com', + pass: 'miidbsjeuqcxddbf', + }, + // 加密 + encryption: { + salt: 'время,вперёд!', // 盐 + secretKey: 'быть всегда готовым!', // 密钥 + }, + token: { + timeout: 1000 * 60 * 60 * 24 * 7, + secretKey: 'Missing You!(John waite)', + }, + // 登录 + signIn: { + // @ 密码验证次数超限后的冷却时长 + signInErrorTimeout: 60 * 10, + // @ 允许密码输错几次 + signInErrorNumber: 5, + // @ 允许同时在线数 + onLineNumber: 6, + }, +}; diff --git a/08=rgvScleNestjs/config/index.ts b/08=rgvScleNestjs/config/index.ts new file mode 100644 index 0000000..09a2c8b --- /dev/null +++ b/08=rgvScleNestjs/config/index.ts @@ -0,0 +1,12 @@ +import developmentConfig from './development'; +import testConfig from './test'; +import productionConfig from './production'; + +const configs = { + development: developmentConfig, + test: testConfig, + production: productionConfig, +}; +const env = process.env.NODE_ENV || 'development'; + +export default () => configs[env]; diff --git a/08=rgvScleNestjs/config/production.ts b/08=rgvScleNestjs/config/production.ts new file mode 100644 index 0000000..425f36f --- /dev/null +++ b/08=rgvScleNestjs/config/production.ts @@ -0,0 +1,57 @@ +export default { + // 主服务 + master: { + systemName: '心曲Tune', + host: '0.0.0.0', + port: '3000', + }, + swagger: { + enable: false, + }, + dev: { + // 开发模式拦截器,用以提供接口请求时间和响应大小 + devInterceptor: false, + }, + log: { + level: 'info', + }, + databases: { + starLight: { + host: '10.10.10.200', + port: 3306, + username: 'root', + password: 'root', + database: 'rgv-sale-system', + }, + }, + redis: { + starLight: { + host: 'localhost', + port: 6379, + username: 'default', + password: 'default', + dbNumber: 3, + }, + }, + email: { + host: 'smtp.qq.com', + user: 'togy.gc@qq.com', + pass: 'miidbsjeuqcxddbf', + }, + // 加密 + encryption: { + salt: 'время,вперёд!', // 盐 + secretKey: 'быть всегда готовым!', // 密钥 + }, + token: { + timeout: 1000 * 60 * 60 * 24 * 7, + secretKey: 'Missing You!(John waite)', + }, + // 登录 + signIn: { + // @ 密码验证次数超限后的冷却时长 + signInErrorTimeout: 60 * 10, + // @ 允许密码输错几次 + signInErrorNumber: 5, + }, +}; diff --git a/08=rgvScleNestjs/config/test.ts b/08=rgvScleNestjs/config/test.ts new file mode 100644 index 0000000..2233785 --- /dev/null +++ b/08=rgvScleNestjs/config/test.ts @@ -0,0 +1,10 @@ +export default { + // 主服务 + master: { + host: '0.0.0.0', + port: '3000', + }, + swagger: { + enable: true, + }, +}; diff --git a/08=rgvScleNestjs/nest-cli.json b/08=rgvScleNestjs/nest-cli.json new file mode 100644 index 0000000..f9aa683 --- /dev/null +++ b/08=rgvScleNestjs/nest-cli.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true + } +} diff --git a/08=rgvScleNestjs/package.json b/08=rgvScleNestjs/package.json new file mode 100644 index 0000000..2457639 --- /dev/null +++ b/08=rgvScleNestjs/package.json @@ -0,0 +1,84 @@ +{ + "name": "tune", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "scripts": { + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "cross-env NODE_ENV=production nest start", + "start:dev": "cross-env NODE_ENV=development nest start --watch", + "start:debug": "cross-env NODE_ENV=development nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@fastify/multipart": "^7.4.2", + "@fastify/static": "^6.9.0", + "@nestjs/common": "^9.0.0", + "@nestjs/config": "^2.3.1", + "@nestjs/core": "^9.0.0", + "@nestjs/mapped-types": "*", + "@nestjs/platform-fastify": "^9.3.9", + "@nestjs/swagger": "^6.2.1", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", + "fastify": "^4.19.2", + "fastify-swagger": "^5.2.0", + "jsonwebtoken": "^9.0.0", + "log4js": "^6.9.1", + "mysql2": "^3.2.0", + "nodemailer": "^6.9.1", + "redis": "^4.6.5", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.2.0" + }, + "devDependencies": { + "@nestjs/cli": "^9.0.0", + "@nestjs/schematics": "^9.0.0", + "@nestjs/testing": "^9.0.0", + "@types/express": "^4.17.13", + "@types/jest": "29.2.4", + "@types/node": "18.11.18", + "@types/supertest": "^2.0.11", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "cross-env": "^7.0.3", + "eslint": "^8.0.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "jest": "29.3.1", + "prettier": "^2.3.2", + "source-map-support": "^0.5.20", + "supertest": "^6.1.3", + "ts-jest": "29.0.3", + "ts-loader": "^9.2.3", + "ts-node": "^10.0.0", + "tsconfig-paths": "4.1.1", + "typescript": "^4.7.4" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/08=rgvScleNestjs/src/Gdecorator/userinfoDecorator/userinfoDecorator.decorator.ts b/08=rgvScleNestjs/src/Gdecorator/userinfoDecorator/userinfoDecorator.decorator.ts new file mode 100644 index 0000000..387ada9 --- /dev/null +++ b/08=rgvScleNestjs/src/Gdecorator/userinfoDecorator/userinfoDecorator.decorator.ts @@ -0,0 +1,39 @@ +import { + createParamDecorator, + ExecutionContext, HttpException, + SetMetadata, +} from '@nestjs/common'; + +export const UserInfoDecorator = (...args: string[]) => + SetMetadata('userinfoDecorator', args); + +// nest g d [name] +// 自定义装饰器 + +// ? ? +// ? 函数名称: userinfoDto +// ? 函数描述: 限制userinfo数据格式 +// ? ? +export class userinfoDto { + userId: string; + token: string; +} + +// ? ? +// ? 函数名称: getUserinfo +// ? 函数描述: 获取token用户信息 +// ? ? +export const getUserinfo = createParamDecorator( + (data: string, ctx: ExecutionContext) => { + const req = ctx.switchToHttp().getRequest(); + if (!req.headers.userid) { + throw new HttpException('缺少Headers参数userid', 400); + } else if (!req.headers.token) { + throw new HttpException('缺少Headers参数token', 400); + } + return { + userId: req.headers.userid, + token: req.headers.token, + } as userinfoDto; + }, +); diff --git a/08=rgvScleNestjs/src/Gexceptions/gexceptionsfilter.filter.ts b/08=rgvScleNestjs/src/Gexceptions/gexceptionsfilter.filter.ts new file mode 100644 index 0000000..078210b --- /dev/null +++ b/08=rgvScleNestjs/src/Gexceptions/gexceptionsfilter.filter.ts @@ -0,0 +1,32 @@ +import { + ArgumentsHost, + Catch, + ExceptionFilter, + HttpException, +} from '@nestjs/common'; +import a from '@nestjs/platform-fastify' +import { Request, Response } from 'express'; + +@Catch() +export class GexceptionsfilterFilter implements ExceptionFilter { + catch(exception: HttpException, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const request = ctx.getRequest(); + console.log('拦截外的报错',exception); + const status = exception.getStatus(); + const responseBody = exception.getResponse() + if(typeof responseBody === 'object'){ + response + .status(status) + .send(responseBody); + }else + response + .status(status) + .send({ + statusCode: status, + message: exception.getResponse(), + error:'Bad Request' + }); + } +} diff --git a/08=rgvScleNestjs/src/Ginterceptor/gdevinterceptor.interceptor.ts b/08=rgvScleNestjs/src/Ginterceptor/gdevinterceptor.interceptor.ts new file mode 100644 index 0000000..7742bc7 --- /dev/null +++ b/08=rgvScleNestjs/src/Ginterceptor/gdevinterceptor.interceptor.ts @@ -0,0 +1,35 @@ +import { + CallHandler, + ExecutionContext, + Injectable, + NestInterceptor, +} from '@nestjs/common'; +import { Observable } from 'rxjs'; +import { GloggerService } from '../Gservice/GLOGGER/glogger.service'; +import { tap } from 'rxjs/operators'; + +@Injectable() +export class GdevinterceptorInterceptor implements NestInterceptor { + logger: GloggerService; + constructor() { + this.logger = new GloggerService(); + this.logger.setContext(`[DevlInterceptor]`); + } + intercept(context: ExecutionContext, next: CallHandler): Observable { + const request = context.switchToHttp().getRequest(); + this.logger.warn(request.method, request.url, '<=='); + + const now = Date.now(); + return next.handle().pipe( + tap((data) => { + this.logger.warn( + request.method, + request.url, + '==>', + `${Date.now() - now}ms`, + `${data ? Buffer.from(data).length : '?'}b`, + ); + }), + ); + } +} diff --git a/08=rgvScleNestjs/src/Ginterceptor/gresponseinterceptor.interceptor.ts b/08=rgvScleNestjs/src/Ginterceptor/gresponseinterceptor.interceptor.ts new file mode 100644 index 0000000..6075db8 --- /dev/null +++ b/08=rgvScleNestjs/src/Ginterceptor/gresponseinterceptor.interceptor.ts @@ -0,0 +1,49 @@ +import { + CallHandler, + ExecutionContext, + Injectable, + NestInterceptor, +} from '@nestjs/common'; +import { Observable } from 'rxjs'; +import { GloggerService } from '../Gservice/GLOGGER/glogger.service'; +import { map } from 'rxjs/operators'; + +@Injectable() +export class GresponseinterceptorInterceptor implements NestInterceptor { + logger: GloggerService; + constructor() { + this.logger = new GloggerService(); + this.logger.setContext(`[Responseinterceptor]`); + } + intercept(context: ExecutionContext, next: CallHandler): Observable { + const response = context.switchToHttp().getResponse(); + return next.handle().pipe( + map((data) => { + if(!data){ + return null + } + // this.logger.debug(response.statusCode); + return JSON.stringify({ + data: + typeof data == 'string' + ? data + : data.data + ? data.data + : data, + statusCode: response.statusCode, + success: data + ? data.success === false + ? false + : true + : true, + message: + typeof data == 'string' + ? 'ok' + : data.message + ? data.message + : 'ok', + }); + }), + ); + } +} diff --git a/08=rgvScleNestjs/src/Gservice/GDATABASE/gdatabase.module.ts b/08=rgvScleNestjs/src/Gservice/GDATABASE/gdatabase.module.ts new file mode 100644 index 0000000..cfe03f4 --- /dev/null +++ b/08=rgvScleNestjs/src/Gservice/GDATABASE/gdatabase.module.ts @@ -0,0 +1,8 @@ +import { Global, Module } from '@nestjs/common'; +import { GdatabaseService } from './gdatabase.service'; +@Global() +@Module({ + providers: [GdatabaseService], + exports: [GdatabaseService], +}) +export class GdatabaseModule {} diff --git a/08=rgvScleNestjs/src/Gservice/GDATABASE/gdatabase.service.ts b/08=rgvScleNestjs/src/Gservice/GDATABASE/gdatabase.service.ts new file mode 100644 index 0000000..84ad687 --- /dev/null +++ b/08=rgvScleNestjs/src/Gservice/GDATABASE/gdatabase.service.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@nestjs/common'; +import * as mysql from 'mysql2/promise'; +import config from '@CFG/index'; + +@Injectable() +export class GdatabaseService { + public DB; + constructor() { + this.start(); + } + private async start() { + const DBConfig = config().databases.starLight; + const DB = mysql.createPool({ + host: DBConfig.host, + port: DBConfig.port, + user: DBConfig.username, + password: DBConfig.password, + database: DBConfig.database, + connectionLimit: 20, // 用于指定连接池中最大的链接数,默认属性值为10. + multipleStatements: true, //是否允许执行多条sql语句,默认值为false + waitForConnections: true, // 超过最大连接时排队 + queueLimit: 0, // 排队最大数量(0 代表不做限制) + maxIdle: 20, // 最大空闲连接数 + idleTimeout: 60000, // 空闲连接超时,以毫秒为单位,默认值60000 + }); + this.DB = DB; + return DB; + } +} diff --git a/08=rgvScleNestjs/src/Gservice/GEMAIL/gemail.module.ts b/08=rgvScleNestjs/src/Gservice/GEMAIL/gemail.module.ts new file mode 100644 index 0000000..d3689a8 --- /dev/null +++ b/08=rgvScleNestjs/src/Gservice/GEMAIL/gemail.module.ts @@ -0,0 +1,8 @@ +import { Global, Module } from '@nestjs/common'; +import { GemailService } from './gemail.service'; +@Global() +@Module({ + providers: [GemailService], + exports: [GemailService], +}) +export class GemailModule {} diff --git a/08=rgvScleNestjs/src/Gservice/GEMAIL/gemail.service.ts b/08=rgvScleNestjs/src/Gservice/GEMAIL/gemail.service.ts new file mode 100644 index 0000000..5171a8e --- /dev/null +++ b/08=rgvScleNestjs/src/Gservice/GEMAIL/gemail.service.ts @@ -0,0 +1,317 @@ +import { Injectable } from '@nestjs/common'; +import * as nodemailer from 'nodemailer'; +import config from '@CFG/index'; + +@Injectable() +export class GemailService { + // @ 邮件服务 + private transporter; + // @ 邮箱配置 + private EMAILCONFIG; + // @ 系统名称,作用于邮件主题。 + private sysName: string; + + constructor() { + this.start(); + } + + // ? ? + // ? 函数名称: start + // ? 函数描述: 生成邮件服务 + // ? ? + private start() { + const EMAILCONFIG = config().email; + const transporter = nodemailer.createTransport({ + //node_modules/nodemailer/lib/well-known/services.json 查看相关的配置,如果使用qq邮箱,就查看qq邮箱的相关配置 + host: EMAILCONFIG.host, + // secureConnection:true, + service: 'qq', //类型qq邮箱 + // port: 465, + secure: true, // true for 465, false for other ports + auth: { + user: EMAILCONFIG.user, // 发送方的邮箱 + pass: EMAILCONFIG.pass, // smtp 的授权码 + }, + //pass 不是邮箱账户的密码而是stmp的授权码(必须是相应邮箱的stmp授权码) + //邮箱---设置--账户--POP3/SMTP服务---开启---获取stmp授权码 + }); + this.transporter = transporter; + this.EMAILCONFIG = EMAILCONFIG; + this.sysName = config().master.systemName; + } + + // ? ? + // ? 函数名称: senMail(邮件内容, 收件人邮箱) + // ? 函数描述: 发送邮件主函数 + // ? ? + private senMail(html, mail) { + return new Promise((res, rej) => { + const mailOptions = { + from: '"TOGY | 心曲Tune" ', // 发送方 + to: mail, //接收者邮箱,多个邮箱用逗号间隔 + subject: `${this.sysName}`, // 标题 + text: 'Hello world?', // 文本内容 + html, + }; + this.transporter.sendMail(mailOptions, (error, info) => { + if (error) { + rej([error, info]); + } else { + res(info); //因为是异步 所有需要回调函数通知成功结果 + } + }); + }); + } + // ? ? + // ? 函数名称: sendTestEmail + // ? 函数描述: 给指定邮箱发送测试验证码 + // ? ? + public sendTestEmail(email) { + return new Promise(async (res, rej) => { + const test = ` + +
      +
      +
      我们欢迎您使用${this.sysName}
      +
      您在某些地方请求了邮箱的验证码,如果不是自己操作请修改账户的密码。
      +
      +
      ABCDEF
      +
      +
      此邮件作用于注册
      截止邮件发送时间5分钟内使用有效。
      +
      +
      + `; + try { + const resd = await this.senMail(test, email); + res(resd); + } catch (e) { + rej(e); + } + }); + } + + // ? ? + // ? 函数名称: sendRegisterCodeMail(邮箱, 验证码) + // ? 函数描述: 给制定邮箱发送注册验证码 + // ? ? + public sendRegisterCodeMail(email, code) { + return new Promise(async (res, rej) => { + const test = ` + +
      +
      +
      我们欢迎您使用${this.sysName}
      +
      您在某些地方请求了邮箱的验证码,如果不是自己操作请修改账户的密码。
      +
      +
      ${code}
      +
      +
      此邮件作用于账户注册
      截止邮件发送时间5分钟内使用有效。
      +
      +
      + `; + try { + console.time('EMAIL'); + const resd = await this.senMail(test, email); + console.timeEnd('EMAIL'); + res(resd); + } catch (e) { + rej({ + data: e, + message: '发送邮件失败!', + }); + } + }); + } + + // ? ? + // ? 函数名称: sendSignInCodeMail(邮箱, 验证码) + // ? 函数描述: 给制定邮箱发送注册验证码 + // ? ? + public sendSignInCodeMail(email, code) { + return new Promise(async (res, rej) => { + const test = ` + +
      +
      +
      我们欢迎您使用${this.sysName}
      +
      您在某些地方请求了邮箱的验证码,如果不是自己操作请修改账户的密码。
      +
      +
      ${code}
      +
      +
      此邮件作用于账户登录
      截止邮件发送时间5分钟内使用有效。
      +
      +
      + `; + try { + console.time('EMAIL'); + const resd = await this.senMail(test, email); + console.timeEnd('EMAIL'); + res(resd); + } catch (e) { + rej({ + data: e, + message: '发送邮件失败!', + }); + } + }); + } +} diff --git a/08=rgvScleNestjs/src/Gservice/GLOGGER/glogger.module.ts b/08=rgvScleNestjs/src/Gservice/GLOGGER/glogger.module.ts new file mode 100644 index 0000000..d2ce4ff --- /dev/null +++ b/08=rgvScleNestjs/src/Gservice/GLOGGER/glogger.module.ts @@ -0,0 +1,8 @@ +import { Global, Module } from '@nestjs/common'; +import { GloggerService } from './glogger.service'; +@Global() +@Module({ + providers: [GloggerService], + exports: [GloggerService], +}) +export class GloggerModule {} diff --git a/08=rgvScleNestjs/src/Gservice/GLOGGER/glogger.service.ts b/08=rgvScleNestjs/src/Gservice/GLOGGER/glogger.service.ts new file mode 100644 index 0000000..208b171 --- /dev/null +++ b/08=rgvScleNestjs/src/Gservice/GLOGGER/glogger.service.ts @@ -0,0 +1,108 @@ +import { ConsoleLogger, Injectable, Scope } from '@nestjs/common'; +import { configure, getLogger, Logger as log4jsLogger } from 'log4js'; +import config from '../../../config'; + +@Injectable({ scope: Scope.TRANSIENT }) +export class GloggerService extends ConsoleLogger { + // 默认日志 + defaultLog: log4jsLogger; + // 文件日志 + fileLog: log4jsLogger; + context = ''; + + constructor(context = '') { + super(); + const logConfig = config().log; + if (context) { + this.context = context; + } + // this.configService + configure({ + appenders: { + default: { + type: 'console', + layout: { + type: 'pattern', + pattern: `%[%d{yyMMdd-hh:mm:ss:SSS} [%p]\t%m%]`, + }, + }, + file: { + filename: `Log/nestjs.services.log`, + type: 'dateFile', + // 配置 layout,此处使用自定义模式 pattern + layout: { + type: 'pattern', + pattern: '%d{yyMMdd-hh:mm:ss:SSS} [%p]\t%m', + }, + // 日志文件按日期(天)切割 + pattern: 'yy-MM-dd', + // 回滚旧的日志文件时,保证以 .log 结尾 (只有在 alwaysIncludePattern 为 false 生效) + keepFileExt: true, + // 输出的日志文件名是都始终包含 pattern 日期结尾 + alwaysIncludePattern: true, + // 指定日志保留的天数 + // daysToKeep: 10, + }, + }, + categories: { + default: { + appenders: ['default'], + level: logConfig.level || 'all', + enableCallStack: true, + }, + fileAll: { + appenders: ['file'], + level: logConfig.level || 'all', + enableCallStack: true, + }, + }, + }); + + this.defaultLog = getLogger(); + this.fileLog = getLogger('fileAll'); + } + + log(message: any, ...optionalParams: any[]) { + const context = this.context; + this.defaultLog.info(context, message, ...optionalParams); + this.fileLog.info(context, message, ...optionalParams); + } + + info(message: any, ...optionalParams: any[]) { + const context = this.context; + this.defaultLog.info(context, message, ...optionalParams); + this.fileLog.info(context, message, ...optionalParams); + } + + error(message: any, ...optionalParams: any[]) { + const context = this.context; + this.defaultLog.error(context, message, ...optionalParams); + this.fileLog.error(context, message, ...optionalParams); + } + + warn(message: any, ...optionalParams: any[]) { + // super.warn(message, trace); + const context = this.context; + this.defaultLog.warn(context, message, ...optionalParams); + this.fileLog.warn(context, message, ...optionalParams); + } + + debug(message: any, ...optionalParams: any[]) { + // super.debug(message, trace); + const context = this.context; + this.defaultLog.debug(context, message, ...optionalParams); + this.fileLog.debug(context, message, ...optionalParams); + } + + verbose(message: any, ...optionalParams: any[]) { + // super.verbose(message, trace); + const context = this.context; + this.defaultLog.info(context, message, ...optionalParams); + this.fileLog.info(context, message, ...optionalParams); + } + + setContext(context: string) { + this.context = context; + this.debug('加载日志'); + } +} diff --git a/08=rgvScleNestjs/src/Gservice/GREDIS/gredis.module.ts b/08=rgvScleNestjs/src/Gservice/GREDIS/gredis.module.ts new file mode 100644 index 0000000..3b7e8de --- /dev/null +++ b/08=rgvScleNestjs/src/Gservice/GREDIS/gredis.module.ts @@ -0,0 +1,8 @@ +import { Global, Module } from '@nestjs/common'; +import { GredisService } from './gredis.service'; +@Global() +@Module({ + providers: [GredisService], + exports: [GredisService], +}) +export class GredisModule {} diff --git a/08=rgvScleNestjs/src/Gservice/GREDIS/gredis.service.ts b/08=rgvScleNestjs/src/Gservice/GREDIS/gredis.service.ts new file mode 100644 index 0000000..09d4fc2 --- /dev/null +++ b/08=rgvScleNestjs/src/Gservice/GREDIS/gredis.service.ts @@ -0,0 +1,360 @@ +import { Injectable } from '@nestjs/common'; +import { createClient } from 'redis'; +import config from '../../../config'; +import { GtoolsService, HASHT } from '@/Gservice/GTOOLS/gtools.service'; + +export declare interface ISetRegisterEmailCode { + data: any; + message: string; + registerCode?: string; +} +export declare interface ISetSignInEmailCode { + data: any; + message: string; + signInCode?: string; +} + +@Injectable() +export class GredisService { + public DB; + private config; + // @ 专注于注册的数据库 + private readonly UserRegisterPoll = 1; + // @ 专注于登录的数据库 + private readonly UserSignInPoll = 2; + // @ 登录的相关配置文件 + private readonly SignInCFG = config().signIn; + // @ Token相关的配置文件 + private readonly TokenCFG = config().token; + + constructor(private readonly gtools: GtoolsService) { + this.config = config().redis.starLight; + this.start(); + } + //#region 注册 + // ? ? + // ? 函数名称: start + // ? 函数描述: 连接redis + // ? ? + private async start() { + const client = createClient({ + url: `redis://${this.config.username}:${this.config.password}@${this.config.host}:${this.config.port}/${this.config.dbNumber}`, + }); + await client.connect(); + this.DB = client; + } + + // ? ? + // ? 函数名称: setRegisterEmailCode(邮箱) + // ? 函数描述: 设置注册邮箱验证 + // ? ? + public setRegisterEmailCode(email): Promise { + return new Promise(async (res, rej) => { + this.DB.select(this.UserRegisterPoll); + try { + const key = 'Register-' + email; + const result = await this.DB.get(key); + if (result === null) { + const registerCode = this.gtools.getRandomString(6); + try { + const data = await this.DB.setEx( + key, + 300, + registerCode, + ); + res({ + data, + registerCode, + message: '生成验证码成功。', + }); + } catch (e) { + rej({ + data: e, + message: '生成验证码失败。', + }); + } + } else { + rej({ + data: null, + message: '已发送过邮件,请稍后再重试。', + }); + } + } catch (e) { + rej({ + data: e, + message: '查找注册码失败。', + }); + } + }); + } + + // ? ? + // ? 函数名称: getRegisterEmailCode(邮箱) + // ? 函数描述: 读取注册验证码 + // ? ? + public getRegisterEmailCode(email): Promise { + return new Promise(async (res, rej) => { + this.DB.select(this.UserRegisterPoll); + const key = 'Register-' + email; + try { + const result = await this.DB.get(key); + if (result === null) { + rej({ + data: null, + message: '未找到相匹配的验证码!', + }); + } else { + res({ + data: null, + message: '获取成功', + registerCode: result as string, + }); + } + } catch (e) { + rej({ + data: e, + message: '从Redis获取注册码出现错误!', + }); + } + }); + } + + // ? ? + // ? 函数名称: removeRegisterEmailCode + // ? 函数描述: + // ? ? + public removeRegisterEmailCode(email): Promise { + return new Promise(async (res, rej) => { + this.DB.select(this.UserRegisterPoll); + const key = 'Register-' + email; + try { + const result = await this.DB.del(key); + res({ + message: '清除注册验证码成功!', + data: {}, + }); + } catch (e) { + res({ + message: '清除注册验证码失败!', + data: e, + }); + } + }); + } + //#endregion + + //#region 密码登录 + // ? ? + // ? 函数名称: getSignInErrorNumber + // ? 函数描述: 获取异常登录信息 + // ? ? + public async getSignInErrorNumber(uuid) { + const key = 'SIN' + uuid; + this.DB.select(this.UserSignInPoll); + try { + const result = await this.DB.get(key); + if ( + result === null || + Number(result) < this.SignInCFG.signInErrorNumber + ) { + return { + state: true, + message: '获取成功', + error: null, + }; + } else { + const ttl = await this.DB.ttl(key); + return { + state: false, + message: '登陆异常已达上限,请稍后重试!', + ttl, + error: null, + }; + } + } catch (e) { + return { + state: false, + message: '查找登录异常数据出错!', + error: e, + }; + } + } + + // ? ? + // ? 函数名称: setSignInErrorNumber + // ? 函数描述: 设置用户登陆异常数字 + // ? ? + public async setSignInErrorNumber(uuid) { + const key = 'SIN' + uuid; + this.DB.select(this.UserSignInPoll); + try { + const exist = await this.DB.exists(key); + if (exist == 0) { + console.log(key); + await this.DB.set(key, 1); + await this.DB.expire(key, this.SignInCFG.signInErrorTimeout); + return { + error: null, + number: 1, + state: true, + }; + } else { + const number = await this.DB.get(key); + await this.DB.set(key, Number(number) + 1); + await this.DB.expire(key, this.SignInCFG.signInErrorTimeout); + return { + error: null, + number: Number(number) + 1, + state: true, + }; + } + } catch (e) { + return { + error: e, + message: '设置登陆异常数量出现错误!', + }; + } + } + + // ? ? + // ? 函数名称: setToken + // ? 函数描述: 设置Token到Redis + // ? ? + public async setToken(uuid, token) { + this.DB.select(this.UserSignInPoll); + const tokenKey = + 'TK' + this.gtools.makeHASH(token, HASHT.MD5).slice(0, 32); + const uuidKey = 'UK' + uuid; + await this.DB.setEx(tokenKey, this.TokenCFG.timeout / 1000, uuid); + + // 获取此用户的登陆数量 + let signInNumber: number; + try { + signInNumber = await this.DB.zCard(uuidKey); + } catch (e) { + return { + state: false, + message: '获取登陆数量出错!', + error: e, + }; + } + // 写入Token有序集合 + try { + const score = new Date().getTime(); + await this.DB.zAdd(uuidKey, [{ score, value: tokenKey }]); + } catch (e) { + return { + state: false, + message: '写入Token有序集合出错!', + error: e, + }; + } + // 清除最早的TokenKey和uuidKey + try { + if (signInNumber >= this.SignInCFG.onLineNumber) { + // 超出范围内 + // 删除最先的 + const uuidKeyZList = await this.DB.zRange( + uuidKey, + 0, + signInNumber, + ); + // 删除第一个 + const popTokenKey = await this.DB.zRemRangeByRank( + uuidKey, + 0, + 0, + ); + // 删除token + const delUuidKey = await this.DB.del(uuidKeyZList[0]); + // 加入新的 + } + } catch (e) { + return { + state: false, + message: '清除最早的TokenKey和uuidKey出错!', + error: e, + }; + } + return { + data: { + tokenKey, + uuidKey, + }, + state: true, + message: '设置成功!', + }; + } + + // ? ? + // ? 函数名称: setSignInEmailCode(邮箱) + // ? 函数描述: 设置邮箱登录验证 + // ? ? + public setSignInEmailCode(email): Promise { + return new Promise(async (res, rej) => { + this.DB.select(this.UserSignInPoll); + try { + const key = 'SignIn-' + email; + const result = await this.DB.get(key); + if (result === null) { + const signInCode = this.gtools.getRandomString(6); + try { + const data = await this.DB.setEx(key, 300, signInCode); + res({ + data, + signInCode, + message: '生成验证码成功。', + }); + } catch (e) { + rej({ + data: e, + message: '生成验证码失败。', + }); + } + } else { + rej({ + data: null, + message: '已发送过邮件,请稍后再重试。', + }); + } + } catch (e) { + rej({ + data: e, + message: '查找登录码失败。', + }); + } + }); + } + + // ? ? + // ? 函数名称: getSignInEmailEntryCode(邮箱) + // ? 函数描述: 读取登录验证码 + // ? ? + public getSignInEmailEntryCode(email): Promise { + return new Promise(async (res, rej) => { + this.DB.select(this.UserSignInPoll); + const key = 'SignIn-' + email; + try { + const result = await this.DB.get(key); + if (result === null) { + rej({ + data: null, + message: '未找到相匹配的验证码!', + }); + } else { + res({ + data: null, + message: '获取成功', + signInCode: result as string, + }); + } + } catch (e) { + rej({ + data: e, + message: '从Redis获取登录码出现错误!', + }); + } + }); + } + //#endregion +} diff --git a/08=rgvScleNestjs/src/Gservice/GREDIS/testJson.js b/08=rgvScleNestjs/src/Gservice/GREDIS/testJson.js new file mode 100644 index 0000000..e69de29 diff --git a/08=rgvScleNestjs/src/Gservice/GTOOLS/gtools.module.ts b/08=rgvScleNestjs/src/Gservice/GTOOLS/gtools.module.ts new file mode 100644 index 0000000..52736de --- /dev/null +++ b/08=rgvScleNestjs/src/Gservice/GTOOLS/gtools.module.ts @@ -0,0 +1,8 @@ +import { Global, Module } from '@nestjs/common'; +import { GtoolsService } from './gtools.service'; +@Global() +@Module({ + providers: [GtoolsService], + exports: [GtoolsService], +}) +export class GtoolsModule {} diff --git a/08=rgvScleNestjs/src/Gservice/GTOOLS/gtools.service.ts b/08=rgvScleNestjs/src/Gservice/GTOOLS/gtools.service.ts new file mode 100644 index 0000000..9a12df5 --- /dev/null +++ b/08=rgvScleNestjs/src/Gservice/GTOOLS/gtools.service.ts @@ -0,0 +1,137 @@ +import { Injectable } from '@nestjs/common'; +import * as crypto from 'crypto'; +import config from '@CFG/index'; +import * as jwt from 'jsonwebtoken'; + +// @ 不可逆加密 +export enum HASHT { + MD5 = 'md5', // 32位 + SHA256 = 'sha256', // 64位 + SHA512 = 'sha512', // 128位 +} +// @ 可逆加密 +export enum AEST { + AES128 = 'aes-128-cbc', + AES256 = 'aes-256-gcm', +} + +@Injectable() +export class GtoolsService { + // @ 加解密配置文件 + private readonly encryptionCFG = config().encryption; + private readonly tokenCFG = config().token; + + // @ AES-128-cec加解密 iv和key + private AES128CEC_key; + private AES128CEC_iv; + + constructor() { + this.AES128CEC_key = Buffer.from( + this.makeHASH(this.encryptionCFG.secretKey, HASHT.MD5).slice(-16), + 'utf8', + ); + + this.AES128CEC_iv = Buffer.from( + this.makeHASH(this.encryptionCFG.salt, HASHT.MD5).slice(-16), + 'utf8', + ); + } + + // ? ? + // ? 函数名称: getRandomString(长度,大小写默认big) + // ? 函数描述: 获取制定长度的随机字符串 + // ? ? + public getRandomString(len: number, size = 'big'): string { + if (size == 'big') { + return Math.random() + .toString(36) + .slice(-len) + .toString() + .toUpperCase(); + } else { + return Math.random() + .toString(36) + .slice(-len) + .toString() + .toLowerCase(); + } + } + + // ? ? + // ? 函数名称: makeUUID + // ? 函数描述: 生成UUID + // ? ? + public makeUUID() { + return crypto.randomUUID().split('-').join('').toUpperCase(); + } + + // ? ? + // ? 函数名称: makeHASH(加密内容, 加密编码默认为SHA512) + // ? 函数描述: =加密字符串 + // ? ? + public makeHASH(plaintext, algorithm = HASHT.SHA512) { + const sha512 = crypto.createHash(algorithm); + const sha512Sum = sha512.update(plaintext + this.encryptionCFG.salt); + const ciphertext = sha512Sum.digest('hex'); + return ciphertext; + } + + //#region 可逆加密 + // ? ? + // ? 函数名称: encrypt + // ? 函数描述: 加密字符串 + // ? ? + encrypt(plaintext, algorithm = AEST.AES128) { + const cipher = crypto.createCipheriv( + algorithm, + this.AES128CEC_key, + this.AES128CEC_iv, + ); // 初始化加密算法 + let ciphertext = cipher.update(plaintext, 'utf8', 'hex'); + ciphertext += cipher.final('hex'); + return ciphertext; + } + + // ? ? + // ? 函数名称: decrypt + // ? 函数描述: 解密字符串 + // ? ? + decrypt(ciphertext, algorithm = AEST.AES128) { + let plaintext = ''; + const cipher = crypto.createDecipheriv( + algorithm, + this.AES128CEC_key, + this.AES128CEC_iv, + ); + plaintext += cipher.update(ciphertext, 'hex', 'utf8'); + plaintext += cipher.final('utf8'); + return plaintext; + } + //#endredion + + //#region jwt + createToken(data) { + const plaintextToken = jwt.sign(data, this.tokenCFG.secretKey, { + expiresIn: this.tokenCFG.timeout / 1000, + }); + const ciphertextToken = this.encrypt(plaintextToken); + return ciphertextToken; + } + resolveToken(ciphertextToken) { + try { + // 解析密文 + const plaintextToken = this.decrypt(ciphertextToken); + const data = jwt.verify(plaintextToken, this.tokenCFG.secretKey); + return { + token: true, + data, + }; + } catch (e) { + return { + token: false, + data: e, + }; + } + } + //#endredion +} diff --git a/08=rgvScleNestjs/src/Gservice/GTOOLS/testToken.js b/08=rgvScleNestjs/src/Gservice/GTOOLS/testToken.js new file mode 100644 index 0000000..31359cc --- /dev/null +++ b/08=rgvScleNestjs/src/Gservice/GTOOLS/testToken.js @@ -0,0 +1,4 @@ +import GtoolsService from './gtools.service' + + +const g = new GtoolsService() \ No newline at end of file diff --git a/08=rgvScleNestjs/src/app.module.ts b/08=rgvScleNestjs/src/app.module.ts new file mode 100644 index 0000000..ef2262e --- /dev/null +++ b/08=rgvScleNestjs/src/app.module.ts @@ -0,0 +1,29 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { GredisModule } from '@/Gservice/GREDIS/gredis.module'; +import { GloggerModule } from '@/Gservice/GLOGGER/glogger.module'; +import { GdatabaseModule } from '@/Gservice/GDATABASE/gdatabase.module'; +import { GemailModule } from '@/Gservice/GEMAIL/gemail.module'; +import { GtoolsModule } from '@/Gservice/GTOOLS/gtools.module'; +import config from '@CFG/index'; +// import { StarlightModule } from '@/starlight/starlight.module'; +import { RgvsaleModule } from './rgvsale/rgvsale.module'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + isGlobal: true, // 作用于全局 + load: [config], // 加载自定义配置项 + }), + GloggerModule, + // StarlightModule, + GdatabaseModule, + // GredisModule, + GemailModule, + GtoolsModule, + RgvsaleModule, + ], + controllers: [], + providers: [], +}) +export class AppModule {} diff --git a/08=rgvScleNestjs/src/main.ts b/08=rgvScleNestjs/src/main.ts new file mode 100644 index 0000000..e4ed5a4 --- /dev/null +++ b/08=rgvScleNestjs/src/main.ts @@ -0,0 +1,100 @@ +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; +import { + FastifyAdapter, + NestFastifyApplication, +} from '@nestjs/platform-fastify'; + +// 参数验证 +import { ValidationPipe } from '@nestjs/common'; +// Fastify文件上传插件 +import fastifyMultipart from '@fastify/multipart'; +// 日志服务 +import { GloggerService } from '@/Gservice/GLOGGER/glogger.service'; +// API文档 +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +// 配置文件 +import { ConfigService } from '@nestjs/config'; +// 异常捕获 +import { GexceptionsfilterFilter } from '@/Gexceptions/gexceptionsfilter.filter'; +// 拦截器 +// --全局开发拦截 +import { GdevinterceptorInterceptor } from '@/Ginterceptor/gdevinterceptor.interceptor'; +// --全局响应拦截 +import { GresponseinterceptorInterceptor } from '@/Ginterceptor/gresponseinterceptor.interceptor'; + +async function bootstrap() { + const app = await NestFactory.create( + // 加载主程序模块 + AppModule, + // 使用Fastify作为底层框架 + new FastifyAdapter({ + logger: false, + }), + ); + // 配置服务 + const appConfig = app.get(ConfigService); + // 日志 Log为文件路径 + const logger = new GloggerService('[BOOTSTRAP]'); + app.useLogger(logger); + // 全局路由前缀 + app.setGlobalPrefix('api'); + + // 全局开启参数验证--需要安装class-validator 又依赖 class-transformer + // app.useGlobalPipes(new ValidationPipe()); + app.useGlobalPipes( + new ValidationPipe({ + transform: true, + }), + ); // 开启参数转换,就不用一个一个写了 + // fastify文件上传中间件 + await app.register(fastifyMultipart as any, { + addToBody: true, + throwFileSizeLimit: true, + limits: { + fileSize: 1024 * 1024 * 500, + }, + }); + // 开发者工具 + const swaggerState = appConfig.get('swagger').enable; + Swagger(app, swaggerState, logger); + const devInterceptorState = appConfig.get('dev').devInterceptor; + DevInterceptor(app, devInterceptorState, logger); + + //全局响应拦截器 + app.useGlobalInterceptors(new GresponseinterceptorInterceptor()); + // 全局异常捕获 + app.useGlobalFilters(new GexceptionsfilterFilter()); + + // 从配置文件的信息中启动服务 + const listenConfig = appConfig.get('master'); + await app.listen(listenConfig.port, listenConfig.host); + + logger.log( + '🚀 服务应用已经成功启动!', + `http://${listenConfig.host}:${listenConfig.port}`, + ); +} +// Swagger接口测试和说明文档 +function Swagger(app, state, logger) { + if (!state) return; + const config = new DocumentBuilder() + .setTitle('系统接口文档') + .setDescription('这是一份接口文档') + .setVersion('1.0.0') + .addBearerAuth() + .build(); + const document = SwaggerModule.createDocument(app, config); + SwaggerModule.setup('docs', app, document); + logger.warn('Swagger外接程序已加载!'); + logger.warn('应用程序文档地址: http://localhost:3000/docs'); +} +// DevInterceptorService 输出请求处理时间和响应数据大小的拦截器 +function DevInterceptor(app, state, logger) { + // 全局拦截器 + if (!state) return; + app.useGlobalInterceptors(new GdevinterceptorInterceptor()); + logger.warn('DevInterceptorService请求响应拦截器已开启!'); +} + +bootstrap(); diff --git a/08=rgvScleNestjs/src/rgvsale/dto/account.dto.ts b/08=rgvScleNestjs/src/rgvsale/dto/account.dto.ts new file mode 100644 index 0000000..6ee7bd4 --- /dev/null +++ b/08=rgvScleNestjs/src/rgvsale/dto/account.dto.ts @@ -0,0 +1,140 @@ +import { IsNotEmpty, IsNumber, IsOptional, IsString } from 'class-validator'; +import { + Param, + ValidationPipe, + Query, + HttpException, + HttpStatus, +} from '@nestjs/common'; +import { Transform } from 'class-transformer'; + +// 获取产品账户分页 +export class GetAccountPageDto { + // 产品ID + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: number; + + // 页码 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('pageNum必须为数字', 400); + } + }) + pageNum: number; + + // 页大小 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('pageSize必须为数字', 400); + } + }) + pageSize: number; +} + +// 添加产品账户 +export class CreateAccountDto { + // 产品ID + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + @IsNumber( + {}, + { + message: '产品ID必须为数字', + }, + ) + productId: number; + + @IsOptional() + @IsString({ + message: '产品账户角色必须为字符串', + }) + accountRoleName: string; + + @IsString({ + message: '产品账户用户名必须为字符串', + }) + accountUsername: string; + + @IsString({ + message: '产品账户密码必须为字符串', + }) + accountPassword: string; +} + +// 编辑产品账户 +export class EditAccountDto { + // 账户ID + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('产品账户ID必须为数字', 400); + } + }) + accountId: number; + + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: number; + + @IsOptional() + @IsString({ + message: '产品账户角色必须为字符串', + }) + accountRoleName: string; + + @IsString({ + message: '产品账户用户名必须为字符串', + }) + accountUsername: string; + + @IsString({ + message: '产品账户密码必须为字符串', + }) + accountPassword: string; +} + +// 删除产品账户 +export class DeleteAccountDto { + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('产品账户ID必须为数字', 400); + } + }) + accountId: number; +} diff --git a/08=rgvScleNestjs/src/rgvsale/dto/demoItem.dto.ts b/08=rgvScleNestjs/src/rgvsale/dto/demoItem.dto.ts new file mode 100644 index 0000000..7474888 --- /dev/null +++ b/08=rgvScleNestjs/src/rgvsale/dto/demoItem.dto.ts @@ -0,0 +1,156 @@ +import { IsNotEmpty, IsNumber, IsOptional, IsString } from 'class-validator'; +import { Param, ValidationPipe, Query, HttpException, HttpStatus } from '@nestjs/common'; +import { Transform } from 'class-transformer'; + +// 获取演示项分页 +export class GetDemoItemPageDto { + // 产品ID + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + }else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: number; + + // 页码 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + } else { + throw new HttpException('pageNum必须为数字', 400); + } + }) + pageNum: number; + + // 页大小 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + } else { + throw new HttpException('pageSize必须为数字', 400); + } + }) + pageSize: number; +} + +export class GetDemoItemListDto { + // 产品ID + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + }else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: number; +} + +// 添加演示项 +export class CreateDemoItemDto{ + // 产品ID + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: number; + + @IsOptional() + @IsString({ + message: '演示项名称必须为字符串', + }) + itemName: string + + @Transform((val) => { + const filepathList = val.value.split('/rgvsale/staticFile/') + if(filepathList.length == 2){ + let fileId = filepathList[1] + if (Number(fileId)) { + return Number(fileId); + } else { + throw new HttpException('演示项图解地址格式不正确', 400); + } + }else{ + throw new HttpException('演示项图解地址格式不正确', 400); + } + + }) + itemUrl: Number +} + +// 编辑演示项 +export class EditDemoItemDto{ + // 产品ID + @IsNotEmpty({ + message: '演示项Id不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: number; + + // 产品ID + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('演示项ID必须为数字', 400); + } + }) + itemId: number; + @IsString({ + message: '演示项名称必须为字符串', + }) + itemName: string + + @Transform((val) => { + const filepathList = val.value.split('/rgvsale/staticFile/') + if(filepathList.length == 2){ + let fileId = filepathList[1] + if (Number(fileId)) { + return Number(fileId); + } else { + throw new HttpException('演示项图解地址格式不正确', 400); + } + }else{ + throw new HttpException('演示项图解地址格式不正确', 400); + } + + }) + itemUrl: Number +} + +// 删除演示项 +export class DeleteDemoItemDto{ + @IsNotEmpty({ + message: '演示项Id不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('演示项ID必须为数字', 400); + } + }) + itemId: Number; +} diff --git a/08=rgvScleNestjs/src/rgvsale/dto/demoScenes.dto.ts b/08=rgvScleNestjs/src/rgvsale/dto/demoScenes.dto.ts new file mode 100644 index 0000000..348d244 --- /dev/null +++ b/08=rgvScleNestjs/src/rgvsale/dto/demoScenes.dto.ts @@ -0,0 +1,177 @@ +import { + ArrayMinSize, + IsArray, IsDate, + IsEnum, + IsMilitaryTime, + IsNotEmpty, + IsNumber, + IsOptional, + IsString, +} from 'class-validator'; +import { Param, ValidationPipe, Query, HttpException, HttpStatus } from '@nestjs/common'; +import { Transform, Type } from 'class-transformer'; + + +export enum sex { + '上' = 0, + '下' = 1, +} + +// 添加演示方案 +export class CreateProgrammeDto{ + @IsString({ + message: '方案名称必须为字符串', + }) + programmeName: string + + @IsNotEmpty({ + message: '产品ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: Number; + + @IsNotEmpty({ + message: '行业ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('行业ID必须为数字', 400); + } + }) + industryId: Number; + + @ArrayMinSize(1, { message: '演示项至少有一个' }) + // 文档建议如果是字符串的数组,使用字符串约束更好,因为js其实不存在数字数组,字符串数组等 + @Type(() => Number) + // 上面虽然解决了不是字符串的数组的问题,但是如果传进来的是一个字符串呢?这就太tm难了,所以再在编译时检查一下算了吧,运行时不管了 + @IsArray({ message: '演示项列表必须是一个数组' }) + @Transform((val) => { + const newList = [] + val.value.map(i => { + const newNum = Number(i) + if (newNum) { + if(isNaN(newNum)) throw new HttpException('演示项列表必须为数字', 400) + newList.push(newNum) + } else { + throw new HttpException('演示项列表必须为数字', 400); + } + }) + console.log(newList); + return newList + }) + demoItemsList: Number[] +} + +// 创建 +export class CreateScenesDto{ + // 方案ID + @IsNotEmpty({ + message: '方案ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('方案ID必须为数字', 400); + } + }) + programmeId: Number; + + // 预计开始时间 + @Type(() => Date) + @IsDate({ + message: '预计开始时间格式不正确' + }) + @IsNotEmpty({ + message: '预计开始时间不能为空', + }) + expectedStarttime: string; + + // 目标客户 + @IsString() + @IsNotEmpty({ + message: '目标客户不能为空', + }) + targetCustomers: string; +} + +// 删除现场 +export class DeleteSceneDto{ + @IsNotEmpty({ + message: '演示现场Id不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('演示现场ID必须为数字', 400); + } + }) + sceneId: Number; +} + +// 编辑场景信息 +export class EditSceneDto{ + @IsNotEmpty({ + message: '演示现场Id不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('演示现场ID必须为数字', 400); + } + }) + sceneId: Number; + + + // 预计开始时间 + @IsMilitaryTime() + @IsNotEmpty({ + message: '预计开始时间不能为空', + }) + expectedStarttime: string; + + // 目标客户 + @IsString() + @IsNotEmpty({ + message: '目标客户不能为空', + }) + targetCustomers: string; +} + +// 增加演示项点击次数 +export class AddDemoItemAccumulateForSceneDto{ + @IsNotEmpty({ + message: '演示项Id不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('演示项ID必须为数字', 400); + } + }) + demoItemId: Number; + + + @IsNotEmpty({ + message: '演示现场Id不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('演示现场ID必须为数字', 400); + } + }) + sceneId: Number; +} \ No newline at end of file diff --git a/08=rgvScleNestjs/src/rgvsale/dto/demoScenesProblem.dto.ts b/08=rgvScleNestjs/src/rgvsale/dto/demoScenesProblem.dto.ts new file mode 100644 index 0000000..907225c --- /dev/null +++ b/08=rgvScleNestjs/src/rgvsale/dto/demoScenesProblem.dto.ts @@ -0,0 +1,261 @@ +import { IsNotEmpty, IsNumber, IsOptional, IsString } from 'class-validator'; +import { + Param, + ValidationPipe, + Query, + HttpException, + HttpStatus, +} from '@nestjs/common'; +import { Transform } from 'class-transformer'; + +// 获取演示问题分页 +export class GetScenesProblemPageDto { + // 产品ID + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: number; + + // 行业ID + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('行业ID必须为数字', 400); + } + }) + industryId: number; + + // 方案ID + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('方案ID必须为数字', 400); + } + }) + programmeId: number; + + // 现场ID + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('现场ID必须为数字', 400); + } + }) + sceneId: number; + + // 模糊查询 + @IsOptional() + @IsString({ + message: '客户角色必须为字符串', + }) + search: string; + + // 利用状态 + @IsOptional() + @Transform((val) => { + if (Number(val.value) || Number(val.value) === 0) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else if (Number(val.value) !== 0) { + throw new HttpException('利用状态必须为数字', 400); + } + }) + isUse: number; + + // 页码 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('pageNum必须为数字', 400); + } + }) + pageNum: number; + + // 页大小 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('pageSize必须为数字', 400); + } + }) + pageSize: number; +} + +// 新增演示问题 +export class CreateScenesProblemDto { + // 问题内容 + @IsString({ + message: '问题内容必须为字符串', + }) + problemContent: string; + + // 演示现场ID + @IsNotEmpty({ + message: '演示现场ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('演示现场ID必须为数字', 400); + } + }) + sceneId: number; + + // 演示项ID + @IsNotEmpty({ + message: '演示现项ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('演示项ID必须为数字', 400); + } + }) + demoItemId: number; + + // 客户角色 + @IsOptional() + @IsString({ + message: '客户角色必须为字符串', + }) + targetCustomersRole: string; + + // 客户名称 + @IsString({ + message: '客户名称必须为字符串', + }) + targetCustomers: string; +} + +// 编辑演示问题 +export class EditScenesProblemDto { + // 问题内容 + @IsString({ + message: '问题内容必须为字符串', + }) + problemContent: string; + + // 问题ID + @IsNotEmpty({ + message: '演示现场ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('演示现场ID必须为数字', 400); + } + }) + problemId: number; + + // 客户角色 + @IsOptional() + @IsString({ + message: '客户角色必须为字符串', + }) + targetCustomersRole: string; + + // 客户名称 + @IsString({ + message: '客户名称必须为字符串', + }) + targetCustomers: string; + + // 演示现场ID + @IsNotEmpty({ + message: '演示现场ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('演示现场ID必须为数字', 400); + } + }) + sceneId: number; + + // 演示项ID + @IsNotEmpty({ + message: '演示现项ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('演示项ID必须为数字', 400); + } + }) + demoItemId: number; +} + +// 删除演示问题 +export class DeleteScenesProblemDto { + // 问题ID + @IsNotEmpty({ + message: '问题ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('问题ID必须为数字', 400); + } + }) + problemId: number; +} + +// 修改问题利用状态 +export class ChangeUseStateDto { + // 问题ID + @IsNotEmpty({ + message: '问题ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if (!val.value) { + return undefined; + } else { + throw new HttpException('问题ID必须为数字', 400); + } + }) + problemId: number; +} diff --git a/08=rgvScleNestjs/src/rgvsale/dto/industry.dto.ts b/08=rgvScleNestjs/src/rgvsale/dto/industry.dto.ts new file mode 100644 index 0000000..4d3cd9f --- /dev/null +++ b/08=rgvScleNestjs/src/rgvsale/dto/industry.dto.ts @@ -0,0 +1,171 @@ +import { IsNotEmpty, IsNumber, IsOptional, IsString } from 'class-validator'; +import { Param, ValidationPipe, Query, HttpException, HttpStatus } from '@nestjs/common'; +import { Transform } from 'class-transformer'; + +// 获取行业分页 +export class GetIndustryPageDto { + // 产品ID + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + }else { + throw new HttpException('行业ID必须为数字', 400); + } + }) + productId: number; + // 页码 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + } else { + throw new HttpException('pageNum必须为数字', 400); + } + }) + pageNum: number; + + // 页大小 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + } else { + throw new HttpException('pageSize必须为数字', 400); + } + }) + pageSize: number; +} + +// 获取行业下拉列表 +export class GetIndustryListDto{ + // 产品ID + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + }else { + throw new HttpException('行业ID必须为数字', 400); + } + }) + productId: number; +} + +// 添加行业 +export class CreateIndustryDto{ + // 行业ID + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + }else { + throw new HttpException('行业ID必须为数字', 400); + } + }) + productId: number; + + // 行业名称 + @IsString({ + message: '行业名称必须为字符串', + }) + industryName: string + + // 行业描述 + @IsOptional() + @IsString({ + message: '行业描述必须为字符串', + }) + industryDescription: string + + // 数据库文件 + @Transform((val) => { + const filepathList = val.value.split('/rgvsale/staticFile/') + if(filepathList.length == 2){ + let fileId = filepathList[1] + if (Number(fileId)) { + return Number(fileId); + } else { + throw new HttpException('数据库文件地址格式不正确', 400); + } + }else{ + throw new HttpException('数据库文件地址格式不正确', 400); + } + + }) + sqlId: Number +} + +// 编辑行业 +export class EditIndustryDto{ + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('行业ID必须为数字', 400); + } + }) + industryId: Number; + + // 行业ID + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + }else { + throw new HttpException('行业ID必须为数字', 400); + } + }) + productId: number; + + // 行业名称 + @IsString({ + message: '行业名称必须为字符串', + }) + industryName: string + + // 行业描述 + @IsOptional() + @IsString({ + message: '行业描述必须为字符串', + }) + industryDescription: string + + // 数据库文件 + @Transform((val) => { + const filepathList = val.value.split('/rgvsale/staticFile/') + if(filepathList.length == 2){ + let fileId = filepathList[1] + if (Number(fileId)) { + return Number(fileId); + } else { + throw new HttpException('数据库文件地址格式不正确', 400); + } + }else{ + throw new HttpException('数据库文件地址格式不正确', 400); + } + + }) + sqlId: Number +} + +// 删除行业 +export class DeleteIndustryDto{ + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('行业ID必须为数字', 400); + } + }) + industryId: Number; +} diff --git a/08=rgvScleNestjs/src/rgvsale/dto/product.dto.ts b/08=rgvScleNestjs/src/rgvsale/dto/product.dto.ts new file mode 100644 index 0000000..9b1b813 --- /dev/null +++ b/08=rgvScleNestjs/src/rgvsale/dto/product.dto.ts @@ -0,0 +1,91 @@ +import { IsNotEmpty, IsNumber, IsOptional, IsString } from 'class-validator'; +import { Param, ValidationPipe, Query, HttpException, HttpStatus } from '@nestjs/common'; +import { Transform } from 'class-transformer'; + +// 获取产品分页 +export class GetProductPageDto { + // 页码 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + } else { + throw new HttpException('pageNum必须为数字', 400); + } + }) + pageNum: number; + + // 页大小 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + } else { + throw new HttpException('pageSize必须为数字', 400); + } + }) + pageSize: number; +} + +// 添加产品 +export class CreateProductDto{ + @IsString({ + message: '产品名称必须为字符串', + }) + productName: string + + @IsOptional() + @IsString({ + message: '产品描述必须为字符串', + }) + productDescription: string + + @IsString({ + message: '产品链接必须为字符串', + }) + productsUrl: string +} + +// 编辑产品 +export class EditProductDto{ + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: Number; + + @IsString({ + message: '产品名称必须为字符串', + }) + productName: string + + @IsOptional() + @IsString({ + message: '产品描述必须为字符串', + }) + productDescription: string + + @IsString({ + message: '产品链接必须为字符串', + }) + productUrl: string +} + +// 删除产品 +export class DeleteProductDto{ + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: Number; +} diff --git a/08=rgvScleNestjs/src/rgvsale/dto/productsProgramme.dto.ts b/08=rgvScleNestjs/src/rgvsale/dto/productsProgramme.dto.ts new file mode 100644 index 0000000..a07d80e --- /dev/null +++ b/08=rgvScleNestjs/src/rgvsale/dto/productsProgramme.dto.ts @@ -0,0 +1,300 @@ +import { ArrayMinSize, IsArray, IsEnum, IsNotEmpty, IsNumber, IsOptional, IsString } from 'class-validator'; +import { Param, ValidationPipe, Query, HttpException, HttpStatus } from '@nestjs/common'; +import { Transform, Type } from 'class-transformer'; + + +export enum sex { + '上' = 0, + '下' = 1, +} + +// 添加演示方案 +export class CreateProgrammeDto{ + @IsString({ + message: '方案名称必须为字符串', + }) + programmeName: string + + @IsNotEmpty({ + message: '产品ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: Number; + + @IsNotEmpty({ + message: '行业ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('行业ID必须为数字', 400); + } + }) + industryId: Number; + + @ArrayMinSize(1, { message: '演示项至少有一个' }) + // 文档建议如果是字符串的数组,使用字符串约束更好,因为js其实不存在数字数组,字符串数组等 + @Type(() => Number) + // 上面虽然解决了不是字符串的数组的问题,但是如果传进来的是一个字符串呢?这就太tm难了,所以再在编译时检查一下算了吧,运行时不管了 + @IsArray({ message: '演示项列表必须是一个数组' }) + @Transform((val) => { + const newList = [] + val.value.map(i => { + const newNum = Number(i) + if (newNum) { + if(isNaN(newNum)) throw new HttpException('演示项列表必须为数字', 400) + newList.push(newNum) + } else { + throw new HttpException('演示项列表必须为数字', 400); + } + }) + console.log(newList); + return newList + }) + demoItemsList: Number[] +} + +// 编辑演示方案 +export class EditProgrammeDto{ + @IsNotEmpty({ + message: '产品ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: Number; + + @IsNotEmpty({ + message: '方案ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('方案ID必须为数字', 400); + } + }) + programmeId: Number; + + @IsNotEmpty({ + message: '行业ID不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('行业ID必须为数字', 400); + } + }) + industryId: Number; + + @IsNotEmpty({ + message: '产品名称不能为空', + }) + @IsString({ + message: '产品名称必须为字符串', + }) + programmeName: string + + @ArrayMinSize(1, { message: '演示项至少有一个' }) + // 文档建议如果是字符串的数组,使用字符串约束更好,因为js其实不存在数字数组,字符串数组等 + @Type(() => Number) + // 上面虽然解决了不是字符串的数组的问题,但是如果传进来的是一个字符串呢?这就太tm难了,所以再在编译时检查一下算了吧,运行时不管了 + @IsArray({ message: '演示项列表必须是一个数组' }) + @Transform((val) => { + const newList = [] + val.value.map(i => { + const newNum = Number(i) + if (newNum) { + if(isNaN(newNum)) throw new HttpException('演示项列表必须为数字', 400) + newList.push(newNum) + } else { + throw new HttpException('演示项列表必须为数字', 400); + } + }) + return newList + }) + demoItemsList: Number[] +} + +// 删除产品 +export class DeleteProgrammeDto{ + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('方案ID必须为数字', 400); + } + }) + programmeId: Number; +} + +// 排序演示项 +export class EditDemoItemsListRankDto{ + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('方案ID必须为数字', 400); + } + }) + programmeId: Number; + + + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else { + throw new HttpException('演示项ID必须为数字', 400); + } + }) + demoItemId: Number; + + + + @IsEnum(sex, { message: '顺序参数必须为:' + Object.keys(sex) }) + offset: Number; +} + +// 获取我的演示方案分页 +export class GetProgrammePageDto{ + // 产品ID + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + }else { + throw new HttpException('产品ID必须为数字', 400); + } + }) + productId: number; + + // 行业Id + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + }else { + throw new HttpException('行业ID必须为数字', 400); + } + }) + industryId: number; + + // 页码 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + } else { + throw new HttpException('pageNum必须为数字', 400); + } + }) + pageNum: number; + + // 页大小 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + } else { + throw new HttpException('pageSize必须为数字', 400); + } + }) + pageSize: number; +} + +// 获取方案的演示项分页 +export class GetDemoItemsPageForProgrammeDto{ + // 页码 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + } else { + throw new HttpException('pageNum必须为数字', 400); + } + }) + pageNum: number; + + // 页大小 + @IsOptional() + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + } else { + throw new HttpException('pageSize必须为数字', 400); + } + }) + pageSize: number; + + // 方案Id + @IsNotEmpty({ + message: '方案Id不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + }else { + throw new HttpException('方案ID必须为数字', 400); + } + }) + programmeId: number; +} + +// 删除方案演示项 +export class DeleteDemoItemForProgrammeDto{ + // 方案Id + @IsNotEmpty({ + message: '方案Id不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + }else { + throw new HttpException('方案ID必须为数字', 400); + } + }) + programmeId: number; + + // 演示项ID + @IsNotEmpty({ + message: '演示项Id不能为空', + }) + @Transform((val) => { + if (Number(val.value)) { + return Number(val.value); + } else if(!val.value){ + return undefined + }else { + throw new HttpException('演示项ID必须为数字', 400); + } + }) + demoItemId: number; +} diff --git a/08=rgvScleNestjs/src/rgvsale/dto/userInfo.dto.ts b/08=rgvScleNestjs/src/rgvsale/dto/userInfo.dto.ts new file mode 100644 index 0000000..75f74de --- /dev/null +++ b/08=rgvScleNestjs/src/rgvsale/dto/userInfo.dto.ts @@ -0,0 +1,15 @@ +import { IsNotEmpty, IsNumber, IsOptional, IsString } from 'class-validator'; + +export class UserInfoDto { + // 用户ID + @IsString({ + message: 'headers:userId必须为字符串', + }) + userId: string; + + // 用户ID + @IsString({ + message: 'headers:token必须为字符串', + }) + token: string; +} diff --git a/08=rgvScleNestjs/src/rgvsale/rgvsale.controller.ts b/08=rgvScleNestjs/src/rgvsale/rgvsale.controller.ts new file mode 100644 index 0000000..532ba14 --- /dev/null +++ b/08=rgvScleNestjs/src/rgvsale/rgvsale.controller.ts @@ -0,0 +1,395 @@ +import { + Controller, + Get, + Post, + Body, + Patch, + Param, + Delete, + Query, + ValidationPipe, + Req, + Res, + Response, + HttpStatus, + HttpException, +} from '@nestjs/common'; +import { FastifyRequest } from 'fastify'; +import { RgvsaleService } from './rgvsale.service'; +import { + GetProductPageDto, + CreateProductDto, + EditProductDto, + DeleteProductDto, +} from './dto/product.dto'; +import { + getUserinfo, + userinfoDto, +} from '@/Gdecorator/userinfoDecorator/userinfoDecorator.decorator'; +import { UserInfoDto } from './dto/userInfo.dto'; +import { + CreateAccountDto, + EditAccountDto, + DeleteAccountDto, + GetAccountPageDto, +} from '@/rgvsale/dto/account.dto'; +import { + CreateDemoItemDto, + DeleteDemoItemDto, + EditDemoItemDto, + GetDemoItemListDto, + GetDemoItemPageDto, +} from '@/rgvsale/dto/demoItem.dto'; +import { + CreateIndustryDto, + DeleteIndustryDto, + EditIndustryDto, + GetIndustryListDto, + GetIndustryPageDto, +} from '@/rgvsale/dto/industry.dto'; +import { + CreateProgrammeDto, + DeleteDemoItemForProgrammeDto, + DeleteProgrammeDto, + EditDemoItemsListRankDto, + EditProgrammeDto, + GetDemoItemsPageForProgrammeDto, + GetProgrammePageDto, +} from '@/rgvsale/dto/productsProgramme.dto'; +import { + AddDemoItemAccumulateForSceneDto, + CreateScenesDto, + DeleteSceneDto, +} from '@/rgvsale/dto/demoScenes.dto'; +import { + ChangeUseStateDto, + CreateScenesProblemDto, + DeleteScenesProblemDto, + EditScenesProblemDto, + GetScenesProblemPageDto, +} from '@/rgvsale/dto/demoScenesProblem.dto'; + +@Controller('rgvsale') +export class RgvsaleController { + constructor(private readonly rgvsaleService: RgvsaleService) {} + + //#region 产品 + + // 分页获取产品列表 + // , @getUserinfo() userInfo: UserInfoDto + @Get('/products/getPage') + getProductPage( + @Query(new ValidationPipe({ transform: true })) + query: GetProductPageDto, + @getUserinfo() userInfo: UserInfoDto, + ): Promise { + return this.rgvsaleService.getProductPage(query); + } + + // 获取产品下拉菜单 + @Get('/products/getList') + getProductList(): Promise { + return this.rgvsaleService.getProductList(); + } + + // 新增产品 + @Post('/products/createProduct') + createProduct( + @Body() body: CreateProductDto, + @getUserinfo() userInfo: UserInfoDto, + ): Promise { + return this.rgvsaleService.createProduct(body, userInfo); + } + + // 删除产品 + @Delete('/products/deleteProduct') + deleteProduct(@Body() body: DeleteProductDto): Promise { + return this.rgvsaleService.deleteProduct(body); + } + + // 编辑产品 + @Patch('/products/editProduct') + editProduct(@Body() body: EditProductDto): Promise { + return this.rgvsaleService.editProduct(body); + } + //#endregion + + //#region 账户 + + //分页获取账户列表 + @Get('/productsAccount/getPage') + getAccountPage( + @Query(new ValidationPipe({ transform: true })) + query: GetAccountPageDto, + ): Promise { + return this.rgvsaleService.getAccountPage(query); + } + + // 创建账户 + @Post('/productsAccount/createAccount') + createAccount( + @Body() body: CreateAccountDto, + @getUserinfo() userInfo: UserInfoDto, + ): Promise { + return this.rgvsaleService.createAccount(body, userInfo); + } + + // 删除账户 + @Delete('/productsAccount/deleteAccount') + deleteAccount(@Body() body: DeleteAccountDto): Promise { + return this.rgvsaleService.deleteAccount(body); + } + + // 编辑账户 + @Patch('/productsAccount/editAccount') + editAccount(@Body() body: EditAccountDto): Promise { + return this.rgvsaleService.editAccount(body); + } + //#endregion + + //#region 演示项 + + // 分页查询演示项列表 + @Get('/demoItems/getPage') + getDemoPage( + @Query(new ValidationPipe({ transform: true })) + query: GetDemoItemPageDto, + @getUserinfo() userInfo: UserInfoDto, + ): Promise { + return this.rgvsaleService.getDemoPage(query); + } + + // 获取产品演示项列表 + @Get('/demoItems/getList') + getDemoList(@Query() params: GetDemoItemListDto) { + return this.rgvsaleService.getDemoList(params); + } + + // 添加演示项 + @Post('/demoItems/createItem') + createDemo( + @Body() body: CreateDemoItemDto, + @getUserinfo() userInfo: UserInfoDto, + ) { + return this.rgvsaleService.createDemo(body, userInfo); + } + + // 删除演示项 + @Delete('/demoItems/deleteItem') + deleteDemo(@Body() body: DeleteDemoItemDto) { + return this.rgvsaleService.deleteDemo(body); + } + + // 编辑演示项 + @Patch('/demoItems/editItem') + editDemo(@Body() body: EditDemoItemDto) { + return this.rgvsaleService.editDemo(body); + } + + //#endregion + + //#region 文件 + + // 文件上传 + @Post('/upload') + upload( + @Body() body, + @getUserinfo() userInfo: UserInfoDto, + ): Promise { + return this.rgvsaleService.upload(body, userInfo); + } + + // 文件下载 + @Get('download/:id') + async download(@Param('id') id: string, @Res() res) { + return this.rgvsaleService.download(id, res); + } + + // 静态文件 + @Get('staticFile/:id') + async staticFile(@Param('id') id: string, @Res() res) { + return this.rgvsaleService.download(id, res); + } + + //#endregion + + //#region 行业 + + //分页获取行业列表 + @Get('/productsIndustry/getPage') + getIndustryPage( + @Query() params: GetIndustryPageDto, + @getUserinfo() userInfo: UserInfoDto, + ) { + return this.rgvsaleService.getIndustryPage(params, userInfo); + } + + // 获取行业下拉列表 + @Get('/productsIndustry/getList') + getIndustryList(@Query() params: GetIndustryListDto) { + return this.rgvsaleService.getIndustryList(params); + } + + // 创建行业 + @Post('/productsIndustry/createIndustry') + createIndustry( + @Body() body: CreateIndustryDto, + @getUserinfo() userInfo: UserInfoDto, + ) { + return this.rgvsaleService.createIndustry(body, userInfo); + } + + // 删除行业 + @Delete('/productsIndustry/deleteIndustry') + deleteIndustry(@Body() body: DeleteIndustryDto) { + return this.rgvsaleService.deleteIndustry(body); + } + + // 编辑行业 + @Patch('/productsIndustry/editIndustry') + editIndustry(@Body() body: EditIndustryDto) { + return this.rgvsaleService.editIndustry(body); + } + + //#endregion + + //#region 演示项 + // 获取演示方案树 + @Get('/productsProgramme/getTree') + getProductsProgrammeTree(@getUserinfo() userInfo: UserInfoDto) { + return this.rgvsaleService.getProductsProgrammeTree(userInfo); + } + // 新增演示方案 + @Post('/productsProgramme/createProgramme') + createProductsProgramme( + @Body() body: CreateProgrammeDto, + @getUserinfo() userInfo: UserInfoDto, + ) { + return this.rgvsaleService.createProductsProgramme(body, userInfo); + } + // 删除演示方案 + @Delete('/productsProgramme/deleteProgramme') + deleteProductsProgramme(@Body() body: DeleteProgrammeDto) { + return this.rgvsaleService.deleteProductsProgramme(body); + } + // 编辑演示方案 + @Patch('/productsProgramme/editProgramme') + editProductsProgramme( + @Body() body: EditProgrammeDto, + @getUserinfo() userInfo: UserInfoDto, + ) { + return this.rgvsaleService.editProductsProgramme(body, userInfo); + } + // 排序方案演示项 + @Patch('/productsProgramme/editDemoItemsListRank') + editProductsProgrammeForDemoItemsListRank( + @Body() body: EditDemoItemsListRankDto, + ) { + return this.rgvsaleService.editProductsProgrammeForDemoItemsListRank( + body, + ); + } + // 获取个人方案分页 + @Get('/productsProgramme/getPage') + getProductsProgrammePage( + @Query() params: GetProgrammePageDto, + @getUserinfo() userInfo: UserInfoDto, + ) { + return this.rgvsaleService.getProductsProgrammePage(params, userInfo); + } + // 获取方案演示项分页 + @Get('/productsProgramme/getDemoItemPageForProgramme') + getDemoItemPageForProgramme( + @Query() params: GetDemoItemsPageForProgrammeDto, + ) { + return this.rgvsaleService.getDemoItemPageForProgramme(params); + } + // 获取方案演示项列表 + @Get('/productsProgramme/getDemoItemListForProgramme') + getDemoItemListForProgramme( + @Query() params: GetDemoItemsPageForProgrammeDto, + ) { + return this.rgvsaleService.getDemoItemListForProgramme(params); + } + // 获取我的方案列表 + @Get('/productsProgramme/getList') + getProductsProgrammeList(@getUserinfo() userInfo: UserInfoDto) { + return this.rgvsaleService.getProductsProgrammeList(userInfo); + } + // 删除方案演示项 + @Delete('/productsProgramme/deleteDemoItemForProgramme') + deleteDemoItemForProgramme(@Body() body: DeleteDemoItemForProgrammeDto) { + return this.rgvsaleService.deleteDemoItemForProgramme(body); + } + //#endregion + + //#region 演示现场 场景 + + // 获取我的演示现场 + @Get('/demoScenes/getList') + getSceneListAndTree(@getUserinfo() userInfo: UserInfoDto) { + return this.rgvsaleService.getSceneListAndTree(userInfo); + } + + // 根据ID获取演示现场 + @Get('/demoScenes/getListById') + getListById(@Query() params: DeleteSceneDto) { + return this.rgvsaleService.getListById(params); + } + + // 创建演示现场 + @Post('/demoScenes/createScene') + createScene( + @Body() body: CreateScenesDto, + @getUserinfo() userInfo: UserInfoDto, + ) { + return this.rgvsaleService.createScene(body, userInfo); + } + + // 删除演示现场 + @Delete('/demoScenes/deleteScene') + deleteScene(@Body() body: DeleteSceneDto) { + return this.rgvsaleService.deleteScene(body); + } + + // + @Patch('/demoScenes/addSceneRecordDemoItem') + addDemoItemAccumulateForScene( + @Body() body: AddDemoItemAccumulateForSceneDto, + ) { + return this.rgvsaleService.addDemoItemAccumulateForScene(body); + } + + //#endregion + + //#region 问题 + 获取问题分页; + @Get('/demoScenesProblem/getScenesProblemList') + getScenesProblemList(@Query() params: GetScenesProblemPageDto) { + return this.rgvsaleService.getScenesProblemList(params); + } + 创建问题; + @Post('/demoScenesProblem/createScenesProblem') + createScenesProblem( + @Body() body: CreateScenesProblemDto, + @getUserinfo() userInfo: UserInfoDto, + ) { + return this.rgvsaleService.createScenesProblem(body, userInfo); + } + 删除问题; + @Delete('/demoScenesProblem/deleteScenesProblem') + deleteScenesProblem(@Body() body: DeleteScenesProblemDto) { + return this.rgvsaleService.deleteScenesProblem(body); + } + 编辑问题; + @Patch('/demoScenesProblem/editScenesProblem') + editScenesProblem(@Body() body: EditScenesProblemDto) { + return this.rgvsaleService.editScenesProblem(body); + } + 修改问题利用状态; + @Patch('/demoScenesProblem/changeUseState') + changeScenesProblemUseState(@Body() body: ChangeUseStateDto) { + return this.rgvsaleService.changeScenesProblemUseState(body); + } + //#endregion +} diff --git a/08=rgvScleNestjs/src/rgvsale/rgvsale.module.ts b/08=rgvScleNestjs/src/rgvsale/rgvsale.module.ts new file mode 100644 index 0000000..c00292e --- /dev/null +++ b/08=rgvScleNestjs/src/rgvsale/rgvsale.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { RgvsaleService } from './rgvsale.service'; +import { RgvsaleController } from './rgvsale.controller'; + +@Module({ + controllers: [RgvsaleController], + providers: [RgvsaleService], +}) +export class RgvsaleModule {} diff --git a/08=rgvScleNestjs/src/rgvsale/rgvsale.service.ts b/08=rgvScleNestjs/src/rgvsale/rgvsale.service.ts new file mode 100644 index 0000000..ca77a92 --- /dev/null +++ b/08=rgvScleNestjs/src/rgvsale/rgvsale.service.ts @@ -0,0 +1,2735 @@ +import { + HttpException, + HttpStatus, + Injectable, + Response, +} from '@nestjs/common'; +import { GdatabaseService } from '@/Gservice/GDATABASE/gdatabase.service'; +import { ConfigService } from '@nestjs/config'; +import { GloggerService } from '@/Gservice/GLOGGER/glogger.service'; +import { + GetProductPageDto, + CreateProductDto, + EditProductDto, + DeleteProductDto, +} from './dto/product.dto'; +import { UserInfoDto } from './dto/userInfo.dto'; +import { + CreateAccountDto, + EditAccountDto, + DeleteAccountDto, + GetAccountPageDto, +} from '@/rgvsale/dto/account.dto'; +import { + GetDemoItemPageDto, + CreateDemoItemDto, + EditDemoItemDto, + DeleteDemoItemDto, + GetDemoItemListDto, +} from '@/rgvsale/dto/demoItem.dto'; +import { createWriteStream, createReadStream, exists, stat } from 'fs'; +import { join } from 'path'; +import { + CreateIndustryDto, + DeleteIndustryDto, + EditIndustryDto, + GetIndustryListDto, + GetIndustryPageDto, +} from '@/rgvsale/dto/industry.dto'; +import { + CreateProgrammeDto, + DeleteDemoItemForProgrammeDto, + DeleteProgrammeDto, + EditDemoItemsListRankDto, + EditProgrammeDto, + GetDemoItemsPageForProgrammeDto, + GetProgrammePageDto, +} from '@/rgvsale/dto/productsProgramme.dto'; +import { of } from 'rxjs'; +import { FastifyRequest } from 'fastify/types/request'; +import { + AddDemoItemAccumulateForSceneDto, + CreateScenesDto, + DeleteSceneDto, + EditSceneDto, +} from '@/rgvsale/dto/demoScenes.dto'; + +import { + GetScenesProblemPageDto, + CreateScenesProblemDto, + EditScenesProblemDto, + DeleteScenesProblemDto, + ChangeUseStateDto, +} from '@/rgvsale/dto/demoScenesProblem.dto'; + +@Injectable() +export class RgvsaleService { + constructor( + // @ 配置文件服务 + private readonly config: ConfigService, + // @ 日志服务 + private readonly logger: GloggerService, + // @ 数据库服务 + private readonly database: GdatabaseService, + ) {} + + //#region 产品 + + // 分页获取产品列表 + public async getProductPage(params: GetProductPageDto) { + let total = 0; + let rowData = []; + let { pageNum, pageSize } = params; + if (pageNum == 0 || !pageNum) pageNum = 1; + if (pageSize == 0 || !pageSize) pageSize = 10; + try { + const TotalSQL = `SELECT COUNT(*) FROM products_info WHERE isDelete = 0`; + const [rows, results] = await this.database.DB.execute( + TotalSQL, + [], + ); + total = rows[0]['COUNT(*)']; + // const DataSQL = `SELECT * FROM products_info WHERE isDelete = 0 ORDER BY id DESC limit ?,?`; 倒序排列 limit需要在最后 + const DataSQL = `SELECT * FROM products_info WHERE isDelete = 0 ORDER BY id DESC limit ?,?`; + const [datarows, dataresults] = await this.database.DB.execute( + DataSQL, + [(pageNum - 1) * pageSize, pageSize], + ); + rowData = datarows; + } catch (e) { + return { + data: e, + message: '获取产品出现错误!', + success: false, + }; + } + return { + data: { + total, + pageNum, + pageSize, + rowData, + }, + success: true, + message: '获取产品页面成功!', + }; + } + + // 获取产品下拉菜单 + public async getProductList() { + const SQL = `SELECT * FROM products_info WHERE isDelete = 0 ORDER BY id DESC`; + try { + const [rows, results] = await this.database.DB.execute(SQL, []); + return { + data: rows, + success: true, + message: '获取产品列表成功!', + }; + } catch (e) { + return { + data: e, + message: '获取产品出现错误!', + success: false, + }; + } + } + + // 新增产品 + public async createProduct(body: CreateProductDto, userInfo: UserInfoDto) { + try { + // 重名校验 + const SQL = `SELECT id FROM products_info WHERE productsName = ? AND isDelete = 0;`; + const [row] = await this.database.DB.execute(SQL, [ + body.productName, + ]); + console.log(row); + if (row.length != 0) { + return { + data: {}, + message: '新增产品失败,产品重名!', + success: false, + }; + } + } catch (e) { + return { + data: e, + message: '新增产品失败,产品名称查重失败!', + success: false, + }; + } + try { + const createTime = new Date(); + const [rows] = await this.database.DB.execute( + `INSERT INTO products_info (productsName, productsDescription, productsUrl, createtime, createuser) VALUES (?, ?, ?, ?, ?);`, + [ + body.productName, + body.productDescription, + body.productsUrl, + createTime, + userInfo.userId, + ], + ); + } catch (e) { + return { + data: e, + message: '新增产品出现错误!', + success: false, + }; + } + return { + data: {}, + message: '新增产品成功!', + success: true, + }; + } + + // 删除产品 + public async deleteProduct(body: DeleteProductDto) { + try { + const [rows] = await this.database.DB.execute( + `UPDATE products_info SET isDelete = 1 WHERE id = ?;`, + [body.productId], + ); + } catch (e) { + return { + data: e, + message: '删除产品出现错误!', + success: false, + }; + } + return { + data: {}, + message: '删除产品成功!', + success: true, + }; + } + + // 编辑产品 + public async editProduct(body: EditProductDto) { + try { + // 重名校验 + const SQL = `SELECT id FROM products_info WHERE productsName = ? AND isDelete = 0 AND id != ?;`; + const [row] = await this.database.DB.execute(SQL, [ + body.productName, + body.productId, + ]); + if (row.length != 0) { + return { + data: {}, + message: '编辑产品失败,产品重名!', + success: false, + }; + } + } catch (e) { + return { + data: e, + message: '编辑产品失败,产品名称查重失败!', + success: false, + }; + } + try { + const [rows] = await this.database.DB.execute( + `UPDATE products_info SET productsName = ?, productsDescription = ?, productsUrl = ? WHERE id = ?;`, + [ + body.productName, + body.productDescription, + body.productUrl, + body.productId, + ], + ); + } catch (e) { + return { + data: e, + message: '编辑产品信息出现错误!', + success: false, + }; + } + return { + data: {}, + message: '编辑产品信息成功!', + success: true, + }; + } + + //#endregion + + //#region 账户 + + //分页获取账户列表 + public async getAccountPage(params: GetAccountPageDto) { + let total = 0; + let rowData = []; + let { pageNum, pageSize, productId } = params; + if (pageNum == 0 || !pageNum) pageNum = 1; + if (pageSize == 0 || !pageSize) pageSize = 10; + try { + const TotalSQL = productId + ? `SELECT COUNT(*) FROM products_account WHERE isDelete = 0 AND productsInfoId = ?` + : `SELECT COUNT(*) FROM products_account WHERE isDelete = 0`; + const [rows, results] = productId + ? await this.database.DB.execute(TotalSQL, [params.productId]) + : await this.database.DB.execute(TotalSQL, []); + total = rows[0]['COUNT(*)']; + const DataSQL = productId + ? `SELECT * FROM products_account WHERE isDelete = 0 AND productsInfoId = ? ORDER BY id DESC limit ?,?` + : `SELECT * FROM products_account WHERE isDelete = 0 ORDER BY id DESC limit ?,?`; + const [datarows, dataresults] = productId + ? await this.database.DB.execute(DataSQL, [ + productId, + (pageNum - 1) * pageSize, + pageSize, + ]) + : await this.database.DB.execute(DataSQL, [ + (pageNum - 1) * pageSize, + pageSize, + ]); + rowData = datarows; + } catch (e) { + return { + data: e, + message: '获取产品账户出现错误!', + success: false, + }; + } + // 获取产品 + const productIdList = Array.from( + new Set(rowData.map((i) => i.productsInfoId)), + ); + let allProduct = []; + try { + const setl = productIdList.join(','); + const SQL = `SELECT id, productsName FROM products_info WHERE id IN (${setl})`; + const [row, result] = await this.database.DB.execute(SQL, []); + allProduct = row; + } catch (e) { + return { + data: e, + message: '获取产品账户出现错误!', + success: false, + }; + } + // 展开产品 + rowData = rowData.map((i) => { + return { + ...i, + productsName: allProduct.filter( + (j) => j.id == i.productsInfoId, + )[0]?.productsName, + }; + }); + return { + data: { + total, + pageNum, + pageSize, + rowData, + }, + success: true, + message: '获取产品账户页面成功!', + }; + } + + // 创建账户 + public async createAccount(body: CreateAccountDto, userInfo: UserInfoDto) { + console.log(body) + const { productId, accountPassword, accountUsername, accountRoleName } = + body; + try { + // 重名校验 + const SQL = `SELECT id FROM products_account WHERE accountName = ? AND productsInfoId = ? AND isDelete = 0;`; + const [row] = await this.database.DB.execute(SQL, [ + accountUsername, + productId, + ]); + if (row.length != 0) { + return { + data: {}, + message: '新增产品账户失败,账户重名!', + success: false, + }; + } + } catch (e) { + console.log(e) + return { + data: e, + message: '新增产品账户失败,账户名称查重失败!', + success: false, + }; + } + try { + const createTime = new Date(); + const [rows] = await this.database.DB.execute( + `INSERT INTO products_account (productsInfoId, accountName, accountPass, accountRole, createtime, createuser) VALUES (?, ?, ?, ?, ?, ?);`, + [ + body.productId, + body.accountUsername, + body.accountPassword, + body.accountRoleName, + createTime, + userInfo.userId, + ], + ); + } catch (e) { + return { + data: e, + message: '新增产品账户出现错误!', + success: false, + }; + } + return { + data: {}, + message: '新增产品账户成功!', + success: true, + }; + } + + // 删除账户 + public async deleteAccount(body: DeleteAccountDto) { + try { + const [rows] = await this.database.DB.execute( + `UPDATE products_account SET isDelete = 1 WHERE id = ?;`, + [body.accountId], + ); + } catch (e) { + return { + data: e, + message: '删除产品账户出现错误!', + success: false, + }; + } + return { + data: {}, + message: '删除产品账户成功!', + success: true, + }; + } + + // 编辑账户 + public async editAccount(body: EditAccountDto) { + try { + // 重名校验 + const SQL = `SELECT id FROM products_account WHERE accountName = ? AND isDelete = 0 AND id != ?;`; + const [row] = await this.database.DB.execute(SQL, [ + body.accountUsername, + body.accountId, + ]); + if (row.length != 0) { + return { + data: {}, + message: '编辑产品账户失败,账户重名!', + success: false, + }; + } + } catch (e) { + return { + data: {}, + message: '编辑产品账户失败,账户名称查重失败!', + success: false, + }; + } + try { + const [rows] = await this.database.DB.execute( + `UPDATE products_account SET accountName = ?, productsInfoId =?, accountPass = ?, accountRole = ? WHERE id = ?;`, + [ + body.accountUsername, + body.productId, + body.accountPassword, + body.accountRoleName, + body.accountId, + ], + ); + } catch (e) { + return { + data: e, + message: '编辑产品账户信息出现错误!', + success: false, + }; + } + return { + data: {}, + message: '编辑产品账户信息成功!', + success: true, + }; + } + + //#endregion + + //#region 演示项 + + // 分页查询演示项列表 + public async getDemoPage(params: GetDemoItemPageDto) { + let total = 0; + let rowData = []; + let { pageNum, pageSize, productId } = params; + if (pageNum == 0 || !pageNum) pageNum = 1; + if (pageSize == 0 || !pageSize) pageSize = 10; + try { + const TotalSQL = productId + ? `SELECT COUNT(*) FROM demo_items WHERE isDelete = 0 AND productsInfoId = ?` + : `SELECT COUNT(*) FROM demo_items WHERE isDelete = 0`; + const [rows, results] = productId + ? await this.database.DB.execute(TotalSQL, [productId]) + : await this.database.DB.execute(TotalSQL, []); + total = rows[0]['COUNT(*)']; + const DataSQL = productId + ? `SELECT * FROM demo_items WHERE isDelete = 0 AND productsInfoId = ? ORDER BY id DESC limit ?,?` + : `SELECT * FROM demo_items WHERE isDelete = 0 ORDER BY id DESC limit ?,?`; + const [datarows, dataresults] = productId + ? await this.database.DB.execute(DataSQL, [ + productId, + (pageNum - 1) * pageSize, + pageSize, + ]) + : await this.database.DB.execute(DataSQL, [ + (pageNum - 1) * pageSize, + pageSize, + ]); + rowData = datarows; + } catch (e) { + return { + data: e, + message: '获取演示项列表出现错误!', + success: false, + }; + } + // 获取产品 + const productIdList = Array.from( + new Set(rowData.map((i) => i.productsInfoId)), + ); + let allProduct = []; + try { + const setl = productIdList.join(','); + const SQL = `SELECT id, productsName FROM products_info WHERE id IN (${setl})`; + const [row, result] = await this.database.DB.execute(SQL, []); + allProduct = row; + } catch (e) { + return { + data: e, + message: '获取产品账户出现错误!', + success: false, + }; + } + // 展开产品 + rowData = rowData.map((i) => { + return { + ...i, + productsName: allProduct.filter( + (j) => j.id == i.productsInfoId, + )[0]?.productsName, + }; + }); + return { + data: { + total, + pageNum, + pageSize, + rowData: rowData.map((i) => { + const obj = { ...i }; + obj.itemUrl = '/api/rgvsale/staticFile/' + obj.itemUrl; + return obj; + }), + }, + success: true, + message: '获取演示项列表成功!', + }; + } + + // 获取演示项下拉列表 + public async getDemoList(params: GetDemoItemListDto) { + const { productId } = params; + let SQL, SQLData; + if (productId) { + SQL = + 'SELECT id, itemName FROM demo_items WHERE isDelete = 0 AND productsInfoId = ? ORDER BY id DESC'; + SQLData = [productId]; + } else { + SQL = + 'SELECT id, itemName FROM demo_items WHERE isDelete = 0 ORDER BY id DESC'; + SQLData = []; + } + try { + const [row] = await this.database.DB.execute(SQL, SQLData); + return { + data: row, + message: '获取演示项列表成功!', + success: true, + }; + } catch (e) { + return { + data: e, + message: '获取演示项列表出现错误!', + success: false, + }; + } + } + + // 添加演示项 + public async createDemo(body: CreateDemoItemDto, userInfo: UserInfoDto) { + try { + // 重名校验 + const SQL = `SELECT id FROM demo_items WHERE itemName = ? AND isDelete = 0;`; + const [row] = await this.database.DB.execute(SQL, [body.itemName]); + if (row.length != 0) { + return { + data: {}, + message: '新增产品失败,演示项重名!', + success: false, + }; + } + } catch (e) { + return { + data: {}, + message: '新增产品失败,演示项名称查重失败!', + success: false, + }; + } + try { + const createTime = new Date(); + const [rows] = await this.database.DB.execute( + `INSERT INTO demo_items (productsInfoId, itemName, itemUrl, createtime, createuser) VALUES (?, ?, ?, ?, ?);`, + [ + body.productId, + body.itemName, + body.itemUrl, + createTime, + userInfo.userId, + ], + ); + } catch (e) { + return { + data: e, + message: '新增演示项出现错误!', + success: false, + }; + } + return { + data: {}, + message: '新增演示项成功!', + success: true, + }; + } + + // 删除演示项 + public async deleteDemo(body: DeleteDemoItemDto) { + try { + const [rows] = await this.database.DB.execute( + `UPDATE demo_items SET isDelete = 1 WHERE id = ?;`, + [body.itemId], + ); + } catch (e) { + return { + data: e, + message: '删除演示项出现错误!', + success: false, + }; + } + return { + data: {}, + message: '删除演示项成功!', + success: true, + }; + } + + // 编辑演示项 + public async editDemo(body: EditDemoItemDto) { + try { + // 重名校验 + const SQL = `SELECT id FROM demo_items WHERE itemName = ? AND isDelete = 0 AND id != ?;`; + const [row] = await this.database.DB.execute(SQL, [ + body.itemName, + body.itemId, + ]); + if (row.length != 0) { + return { + data: {}, + message: '编辑产品失败,演示项重名!', + success: false, + }; + } + } catch (e) { + return { + data: {}, + message: '编辑产品失败,演示项名称查重失败!', + success: false, + }; + } + try { + const [rows] = await this.database.DB.execute( + `UPDATE demo_items SET productsInfoId =?, itemName = ?, itemUrl = ? WHERE id = ?;`, + [body.productId, body.itemName, body.itemUrl, body.itemId], + ); + } catch (e) { + return { + data: e, + message: '编辑演示项信息出现错误!', + success: false, + }; + } + return { + data: {}, + message: '编辑演示项信息成功!', + success: true, + }; + } + + //#endregion + + //#region 文件 + + // 上传文件 + public async upload(body, userInfo) { + const { file } = body; + if (file.length == 0) { + return { + data: {}, + message: '未找到文件!', + success: false, + }; + } + try { + await this.uploadCertificate(file); + console.log(file); + const createtime = new Date(); + const SQL = `INSERT INTO file (filename, filesize, createtime, createuser) VALUES (?, ?, ?, ?);`; + const [row, results] = await this.database.DB.execute(SQL, [ + file[0].filename, + file[0].data.length, + createtime, + userInfo.userId, + ]); + return { + data: { + filename: file[0].filename, + filepath: '/api/rgvsale/staticFile/' + row.insertId, + filesize: file[0].data.length, + }, + message: '文件上传成功!', + success: true, + }; + } catch (e) { + return { + data: e, + message: '文件上传失败!', + success: false, + }; + } + } + + // 保存文件 + //重要的是先写入流 然后再读流,把读到的数据append到formData的对象中 + private async uploadCertificate(file) { + const writerStream = createWriteStream( + join('./file', `${file[0].filename}`), + ); + writerStream.write(file[0].data); + await writerStream.end(); + // const readerStream = createReadStream(join(__dirname, `${file[0].filename}`)); + // const fileFormData = new FormData(); + } + + // 文件单位转换 + private formatBytes(bytes, decimals = 2) { + if (bytes === 0) return '0 Bytes'; + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return ( + parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i] + ); + } + + // 下载文件 + public async download(id, res) { + console.log(id); + let filename; + try { + filename = await this.getFilePath(id); + } catch (e) { + throw new HttpException(e, HttpStatus.SERVICE_UNAVAILABLE); + } + const state = await new Promise((res, rej) => { + exists(join('./file', filename), (e) => { + e ? res(e) : rej(e); + }); + }).catch((e) => { + throw new HttpException( + '未找到文件', + HttpStatus.SERVICE_UNAVAILABLE, + ); + }); + const readerStream = createReadStream(join('./file', filename)); + res.header('Content-Type', 'application/octet-stream'); + res.header( + 'Content-Disposition', + 'attachment; filename=' + encodeURIComponent(filename), + ); + // readerStream.pipe(res) + readerStream.on('error', (err) => { + throw new HttpException( + '下载失败,请重试', + HttpStatus.SERVICE_UNAVAILABLE, + ); + }); + res.send(readerStream); + } + + // 静态文件 + public async staticFile(id, res) { + let filename; + try { + filename = await this.getFilePath(id); + } catch (e) { + throw new HttpException(e, HttpStatus.SERVICE_UNAVAILABLE); + } + res.sendFile(join('./file', filename)); + } + + // 获取文件地址 + private async getFilePath(id) { + const SQL = `SELECT filename FROM file WHERE uuid = ? AND isDelete = 0;`; + const [row] = await this.database.DB.execute(SQL, [Number(id)]); + if (row.length == 0) { + throw new HttpException( + '下载失败,不存在该文件', + HttpStatus.SERVICE_UNAVAILABLE, + ); + } + return row[0].filename; + } + + //#endregion + + //#region行业 + + // 分页获取行业列表 + public async getIndustryPage(params: GetIndustryPageDto, userInfo) { + let total = 0; + let rowData = []; + let { pageNum, pageSize, productId } = params; + if (pageNum == 0 || !pageNum) pageNum = 1; + if (pageSize == 0 || !pageSize) pageSize = 10; + try { + const TotalSQL = productId + ? `SELECT COUNT(*) FROM products_industry WHERE isDelete = 0 AND productsInfoId = ?` + : `SELECT COUNT(*) FROM products_industry WHERE isDelete = 0`; + const [rows, results] = productId + ? await this.database.DB.execute(TotalSQL, [params.productId]) + : await this.database.DB.execute(TotalSQL, []); + total = rows[0]['COUNT(*)']; + const DataSQL = productId + ? `SELECT * FROM products_industry WHERE isDelete = 0 AND productsInfoId = ? ORDER BY id DESC limit ?,?` + : `SELECT * FROM products_industry WHERE isDelete = 0 ORDER BY id DESC limit ?,?`; + const [datarows, dataresults] = productId + ? await this.database.DB.execute(DataSQL, [ + productId, + (pageNum - 1) * pageSize, + pageSize, + ]) + : await this.database.DB.execute(DataSQL, [ + (pageNum - 1) * pageSize, + pageSize, + ]); + console.log(DataSQL, (pageNum - 1) * pageSize, pageSize); + rowData = datarows; + } catch (e) { + return { + data: e, + message: '获取行业页面出现错误!', + success: false, + }; + } + const productIdList = Array.from( + new Set(rowData.map((i) => i.productsInfoId)), + ); + let allProduct = []; + try { + const setl = productIdList.join(','); + const SQL = `SELECT id, productsName FROM products_info WHERE id IN (${setl})`; + const [row, result] = await this.database.DB.execute(SQL, []); + allProduct = row; + } catch (e) { + return { + data: e, + message: '获取产品账户出现错误!', + success: false, + }; + } + // 展开产品 + rowData = rowData.map((i) => { + return { + ...i, + productsName: allProduct.filter( + (j) => j.id == i.productsInfoId, + )[0]?.productsName, + }; + }); + return { + data: { + total, + pageNum, + pageSize, + rowData: rowData.map((i) => { + const obj = { ...i }; + obj.sqlId = '/api/rgvsale/staticFile/' + obj.sqlId; + return obj; + }), + }, + success: true, + message: '获取行业页面成功!', + }; + } + + // 获取行业下拉列表 + public async getIndustryList(params: GetIndustryListDto) { + const { productId } = params; + if (productId) { + const SQL = `SELECT * FROM products_industry WHERE productsInfoId = ? AND isDelete = 0 ORDER BY id DESC`; + try { + const [rows, results] = await this.database.DB.execute(SQL, [ + productId, + ]); + return { + data: rows, + success: true, + message: '获取行业列表成功!', + }; + } catch (e) { + return { + data: e, + message: '获取行业列表出现错误!', + success: false, + }; + } + } else { + const SQL = `SELECT * FROM products_industry WHERE isDelete = 0 ORDER BY id DESC`; + try { + const [rows, results] = await this.database.DB.execute(SQL, []); + return { + data: rows, + success: true, + message: '获取行业列表成功!', + }; + } catch (e) { + return { + data: e, + message: '获取行业列表出现错误!', + success: false, + }; + } + } + } + + // 创建行业 + public async createIndustry( + body: CreateIndustryDto, + userInfo: UserInfoDto, + ) { + try { + // 重名校验 + const SQL = `SELECT id FROM products_industry WHERE industryName = ? AND isDelete = 0;`; + const [row] = await this.database.DB.execute(SQL, [ + body.industryName, + ]); + if (row.length != 0) { + return { + data: {}, + message: '新增行业失败,行业重名!', + success: false, + }; + } + } catch (e) { + return { + data: e, + message: '新增行业失败,行业名称查重失败!', + success: false, + }; + } + try { + const createTime = new Date(); + const [rows] = await this.database.DB.execute( + `INSERT INTO products_industry (productsInfoId, industryName, industryDescription, sqlId, createtime, createuser) VALUES (?, ?, ?, ?, ?, ?);`, + [ + body.productId, + body.industryName, + body.industryDescription, + body.sqlId, + createTime, + userInfo.userId, + ], + ); + } catch (e) { + return { + data: e, + message: '新增行业出现错误!', + success: false, + }; + } + return { + data: {}, + message: '新增行业成功!', + success: true, + }; + } + + // 删除行业 + public async deleteIndustry(body: DeleteIndustryDto) { + try { + const [rows] = await this.database.DB.execute( + `UPDATE products_industry SET isDelete = 1 WHERE id = ?;`, + [body.industryId], + ); + } catch (e) { + return { + data: e, + message: '删除行业出现错误!', + success: false, + }; + } + return { + data: {}, + message: '删除行业成功!', + success: true, + }; + } + + // 编辑行业 + public async editIndustry(body: EditIndustryDto) { + try { + // 重名校验 + const SQL = `SELECT id FROM products_industry WHERE industryName = ? AND isDelete = 0 AND id != ?;`; + const [row] = await this.database.DB.execute(SQL, [ + body.industryName, + body.industryId, + ]); + if (row.length != 0) { + return { + data: {}, + message: '编辑行业失败,行业重名!', + success: false, + }; + } + } catch (e) { + return { + data: {}, + message: '编辑行业失败,行业名称查重失败!', + success: false, + }; + } + try { + const [rows] = await this.database.DB.execute( + `UPDATE products_industry SET industryName = ?, productsInfoId =?, industryDescription = ?, sqlId = ? WHERE id = ?;`, + [ + body.industryName, + body.productId, + body.industryDescription, + body.productId, + body.industryId, + ], + ); + } catch (e) { + return { + data: e, + message: '编辑行业信息出现错误!', + success: false, + }; + } + return { + data: {}, + message: '编辑行业信息成功!', + success: true, + }; + } + + //#endregion + + //#region 演示方案 + // 获取演示方案树 + public async getProductsProgrammeTree(userInfo: UserInfoDto) { + const { userId } = userInfo; + const Errmessage = { + data: {}, + message: '获取演示方案出现错误!', + success: false, + }; + // 查个人所有方案 + let allProgramme = []; + try { + const SQL = `SELECT * FROM demo_programmes WHERE createuser = ? AND isDelete = 0 ORDER BY id DESC`; + const [row] = await this.database.DB.execute(SQL, [userId]); + allProgramme = row; + allProgramme = allProgramme.map((i) => { + return { + AXID: ( + new Date().getTime().toString() + + Math.random() * 100000 + ).toString(), + label: i.programmeName, + ...i, + }; + }); + if (row.length == 0) { + return { + data: [], + message: '获取演示方案成功!', + success: true, + }; + } + } catch (e) { + Errmessage.data = e; + return Errmessage; + } + // 查方案所有产品 + const allProductId = Array.from( + new Set(allProgramme.map((i) => i.productsInfoId)), + ); + let allProduct = []; + try { + const setl = allProductId.join(','); + const SQL = `SELECT id, productsName FROM products_info WHERE id IN (${setl})`; + const [row, result] = await this.database.DB.execute(SQL, []); + allProduct = row; + } catch (e) { + Errmessage.data = e; + return Errmessage; + } + // 查方案所有行业 + const allIndustryId = Array.from( + new Set(allProgramme.map((i) => i.industryId)), + ); + let allIndustry = []; + try { + const setl = allIndustryId.join(','); + const SQL = `SELECT id, industryName FROM products_industry WHERE id IN (${setl})`; + const [row] = await this.database.DB.execute(SQL, []); + allIndustry = row; + } catch (e) { + Errmessage.data = e; + return Errmessage; + } + // 查所有演示项 + const allDemoItemId = Array.from( + new Set( + allProgramme.map((i) => JSON.parse(i.demoItemsList)).flat(), + ), + ); + let allDemoItem = []; + try { + const setl = allDemoItemId.join(','); + const SQL = `SELECT id, itemName, itemUrl FROM demo_items WHERE id IN (${setl})`; + const [row] = await this.database.DB.execute(SQL, []); + allDemoItem = row; + allDemoItem = allDemoItem.map((i) => { + return { + AZID: ( + new Date().getTime().toString() + + Math.random() * 100000 + ).toString(), + label: i.itemName, + ...i, + }; + }); + } catch (e) { + Errmessage.data = e; + return Errmessage; + } + const newDemoList = []; + allDemoItemId.map((i) => { + newDemoList.push( + allDemoItem[ + allDemoItem.findIndex((j) => { + return i == j.id; + }) + ], + ); + }); + allDemoItem = newDemoList; + // 查账户 + let allAccount = []; + try { + const setl = allProductId.join(','); + const SQL = `SELECT id, productsInfoId, accountName, accountPass, accountRole FROM products_account WHERE productsInfoId IN (${setl}) AND isDelete = 0;`; + const [row, result] = await this.database.DB.execute(SQL, []); + allAccount = row; + } catch (e) { + Errmessage.data = e; + return Errmessage; + } + allProgramme = allProgramme.map((i) => { + // 展开产品信息 + const productName = allProduct.filter( + (j) => j.id == i.productsInfoId, + ); + i.productName = productName[0] ? productName[0].productsName : null; + // 展开行业信息 + const industryName = allIndustry.filter( + (j) => j.id == i.industryId, + ); + i.industryName = industryName[0] + ? industryName[0].industryName + : null; + // 展开账户信息 + const accountList = allAccount.filter( + (j) => i.productsInfoId == j.productsInfoId, + ); + i.accountList = accountList; + // 展开演示项 + i.children = JSON.parse(i.demoItemsList).map((j) => { + const demoData = allDemoItem.filter((k) => { + return k.id == j; + }); + const obj = { + baba: { ...i }, + ...demoData[0], + }; + obj.itemUrl = '/api/rgvsale/staticFile/' + obj.itemUrl; + obj.AXID = ( + new Date().getTime().toString() + + Math.random() * 100000 + ).toString(); + return obj; + }); + return i; + }); + let programmeTree = []; + programmeTree = allProduct.map((i) => { + const programmeItem = allProgramme.filter( + (j) => i.id == j.productsInfoId, + ); + return { + productId: i.id, + productName: i.productsName, + AXID: i.id, + label: i.productsName, + children: programmeItem, + }; + }); + return { + data: programmeTree, + message: '获取演示方案成功!', + success: true, + }; + } + + // 查找我的方案列表 + public async getProductsProgrammeList(userInfo: UserInfoDto) { + const { userId } = userInfo; + // 查个人所有方案 + try { + const SQL = `SELECT id, programmeName FROM demo_programmes WHERE createuser = ? AND isDelete = 0 ORDER BY id DESC`; + const [row] = await this.database.DB.execute(SQL, [userId]); + return { + data: row, + message: '查找我的演示方案列表成功!', + success: true, + }; + } catch (e) { + return { + data: e, + message: '获取演示方案出现错误!', + success: false, + }; + } + } + + // 获取个人方案分页 + public async getProductsProgrammePage( + params: GetProgrammePageDto, + userInfo: UserInfoDto, + ) { + function ErrReturn(e) { + return { + data: e, + message: '获取演示方案出现错误!', + success: false, + }; + } + let total = 0; + let allProgramme = []; + let { pageNum, pageSize, productId, industryId } = params; + const { userId } = userInfo; + if (pageNum == 0 || !pageNum) pageNum = 1; + if (pageSize == 0 || !pageSize) pageSize = 10; + try { + let TotalSQL, TotalSQLParams, DataSQL, DataSQLParams; + if (productId != undefined && industryId == undefined) { + TotalSQL = + 'SELECT COUNT(*) FROM demo_programmes WHERE isDelete = 0 AND productsInfoId = ? AND createuser = ?'; + DataSQL = + 'SELECT * FROM demo_programmes WHERE createuser = ? AND isDelete = 0 AND productsInfoId = ? ORDER BY id DESC limit ?,?'; + TotalSQLParams = [productId, userId]; + DataSQLParams = [ + userId, + productId, + (pageNum - 1) * pageSize, + pageSize, + ]; + } else if (productId == undefined && industryId != undefined) { + TotalSQL = + 'SELECT COUNT(*) FROM demo_programmes WHERE isDelete = 0 AND industryId = ? AND createuser = ?'; + DataSQL = + 'SELECT * FROM demo_programmes WHERE createuser = ? AND isDelete = 0 AND industryId = ? ORDER BY id DESC limit ?,?'; + TotalSQLParams = [industryId, userId]; + DataSQLParams = [ + userId, + industryId, + (pageNum - 1) * pageSize, + pageSize, + ]; + } else if (productId != undefined && industryId != undefined) { + TotalSQL = + 'SELECT COUNT(*) FROM demo_programmes WHERE isDelete = 0 AND industryId = ? AND productsInfoId = ? AND createuser = ?'; + DataSQL = + 'SELECT * FROM demo_programmes WHERE createuser = ? AND isDelete = 0 AND industryId = ? AND productsInfoId = ? ORDER BY id DESC limit ?,?'; + TotalSQLParams = [industryId, productId, userId]; + DataSQLParams = [ + userId, + industryId, + productId, + (pageNum - 1) * pageSize, + pageSize, + ]; + } else if (productId == undefined && industryId == undefined) { + TotalSQL = + 'SELECT COUNT(*) FROM demo_programmes WHERE isDelete = 0 AND createuser = ?'; + DataSQL = + 'SELECT * FROM demo_programmes WHERE createuser = ? AND isDelete = 0 ORDER BY id DESC limit ?,?'; + TotalSQLParams = [userId]; + DataSQLParams = [userId, (pageNum - 1) * pageSize, pageSize]; + } + const [rows, results] = await this.database.DB.execute( + TotalSQL, + TotalSQLParams, + ); + total = rows[0]['COUNT(*)']; + const [datarows, dataresults] = await this.database.DB.execute( + DataSQL, + DataSQLParams, + ); + allProgramme = datarows; + if (allProgramme.length == 0) { + return { + data: { + total, + pageNum, + pageSize, + rowData: [], + }, + success: true, + message: '获取演示方案页面成功!', + }; + } + } catch (e) { + return ErrReturn(e); + } + // 查方案所有产品 + const allProductId = Array.from( + new Set(allProgramme.map((i) => i.productsInfoId)), + ); + let allProduct = []; + try { + const setl = allProductId.join(','); + const SQL = `SELECT id, productsName FROM products_info WHERE id IN (${setl})`; + const [row, result] = await this.database.DB.execute(SQL, []); + allProduct = row; + } catch (e) { + return ErrReturn(e); + } + // 查方案所有行业 + const allIndustryId = Array.from( + new Set(allProgramme.map((i) => i.industryId)), + ); + let allIndustry = []; + try { + const setl = allIndustryId.join(','); + const SQL = `SELECT id, industryName FROM products_industry WHERE id IN (${setl})`; + const [row] = await this.database.DB.execute(SQL, []); + allIndustry = row; + } catch (e) { + return ErrReturn(e); + } + allProgramme = allProgramme.map((i) => { + // 展开产品信息 + const productName = allProduct.filter( + (j) => j.id == i.productsInfoId, + ); + i.productName = productName[0] ? productName[0].productsName : null; + // 展开行业信息 + const industryName = allIndustry.filter( + (j) => j.id == i.industryId, + ); + i.industryName = industryName[0] + ? industryName[0].industryName + : null; + return i; + }); + allProgramme = allProgramme.map((i) => { + i.demoItemsList = JSON.parse(i.demoItemsList); + return i; + }); + return { + data: { + total, + pageNum, + pageSize, + rowData: allProgramme, + }, + success: true, + message: '获取演示方案页面成功!', + }; + } + + // 获取方案演示项分页 + public async getDemoItemPageForProgramme( + params: GetDemoItemsPageForProgrammeDto, + ) { + const { programmeId, pageNum, pageSize } = params; + // 查方案演示项 + let demoItemsIdList; + let total; + try { + const SQL = + 'SELECT demoItemsList FROM demo_programmes WHERE id = ? AND isDelete = 0;'; + const [rows, results] = await this.database.DB.execute(SQL, [ + programmeId, + ]); + if (rows.length == 0) { + return { + data: {}, + message: '未找到演示方案!', + success: false, + }; + } + total = JSON.parse(rows[0].demoItemsList).length; + demoItemsIdList = JSON.parse(rows[0].demoItemsList).splice( + (pageNum - 1) * pageSize, + pageSize, + ); + if (demoItemsIdList.length == 0) { + return { + data: { + total, + pageNum, + pageSize, + rowData: [], + }, + message: '查找演示方案演示项页面成功!', + success: true, + }; + } + } catch (e) { + return { + data: e, + message: '查找演示方案演示项页面出现错误!', + success: false, + }; + } + let demoList; + try { + const setl = demoItemsIdList.join(','); + const SQL = `SELECT * FROM demo_items WHERE id IN (${setl})`; + const [row] = await this.database.DB.execute(SQL, []); + demoList = row; + } catch (e) { + return { + data: e, + message: '查找演示方案演示项页面出现错误!', + success: false, + }; + } + demoList = demoList.map((i) => { + i.itemUrl = '/api/rgvsale/staticFile/' + i.itemUrl; + return i; + }); + const newDemoList = []; + demoItemsIdList.map((i) => { + newDemoList.push( + demoList[ + demoList.findIndex((j) => { + return i == j.id; + }) + ], + ); + }); + return { + data: { + total, + pageNum, + pageSize, + rowData: newDemoList, + }, + message: '查找演示方案演示项页面成功!', + success: true, + }; + } + + // 获取方案演示项列表 + public async getDemoItemListForProgramme( + params: GetDemoItemsPageForProgrammeDto, + ) { + const { programmeId } = params; + // 查方案演示项 + let demoItemsIdList; + let total; + try { + const SQL = + 'SELECT demoItemsList FROM demo_programmes WHERE id = ? AND isDelete = 0;'; + const [rows, results] = await this.database.DB.execute(SQL, [ + programmeId, + ]); + if (rows.length == 0) { + return { + data: {}, + message: '未找到演示方案!', + success: false, + }; + } + total = JSON.parse(rows[0].demoItemsList).length; + demoItemsIdList = JSON.parse(rows[0].demoItemsList); + if (demoItemsIdList.length == 0) { + return { + data: [], + message: '查找演示方案演示项列表成功!', + success: true, + }; + } + } catch (e) { + return { + data: e, + message: '查找演示方案演示项列表出现错误!', + success: false, + }; + } + let demoList; + try { + const setl = demoItemsIdList.join(','); + const SQL = `SELECT * FROM demo_items WHERE id IN (${setl})`; + const [row] = await this.database.DB.execute(SQL, []); + demoList = row; + } catch (e) { + return { + data: e, + message: '查找演示方案演示项列表出现错误!', + success: false, + }; + } + demoList = demoList.map((i) => { + i.itemUrl = '/api/rgvsale/staticFile/' + i.itemUrl; + return i; + }); + const newDemoList = []; + demoItemsIdList.map((i) => { + newDemoList.push( + demoList[ + demoList.findIndex((j) => { + return i == j.id; + }) + ], + ); + }); + return { + data: newDemoList, + message: '查找演示方案演示项列表成功!', + success: true, + }; + } + + // 新增演示方案 + public async createProductsProgramme(body: CreateProgrammeDto, userInfo) { + const { industryId, productId, programmeName, demoItemsList } = body; + const { userId } = userInfo; + try { + // 重名校验 + const SQL = `SELECT id FROM demo_programmes WHERE industryId = ? AND productsInfoId = ? AND programmeName = ? AND createuser = ? AND isDelete = 0;`; + const [row] = await this.database.DB.execute(SQL, [ + industryId, + productId, + programmeName, + userId, + ]); + if (row.length != 0) { + return { + data: {}, + message: '新增方案失败,方案重名!', + success: false, + }; + } + } catch (e) { + return { + data: e, + message: '新增方案失败,方案名称查重失败!', + success: false, + }; + } + try { + const createtime = new Date(); + const SQL = `INSERT INTO demo_programmes (productsInfoId, industryId, programmeName, demoItemsList, createtime, createuser) VALUES (?, ?, ?, ?, ?, ?)`; + const [row] = await this.database.DB.execute(SQL, [ + productId, + industryId, + programmeName, + JSON.stringify(demoItemsList), + createtime, + userId, + ]); + } catch (e) { + return { + data: e, + message: '新增方案出现错误!', + success: false, + }; + } + return { + data: {}, + message: '新增方案成功!', + success: true, + }; + } + + // 删除演示方案 + public async deleteProductsProgramme(body: DeleteProgrammeDto) { + try { + const [rows] = await this.database.DB.execute( + `UPDATE demo_programmes SET isDelete = 1 WHERE id = ?;`, + [body.programmeId], + ); + } catch (e) { + return { + data: e, + message: '删除方案出现错误!', + success: false, + }; + } + return { + data: {}, + message: '删除方案成功!', + success: true, + }; + } + + // 编辑演示方案 + public async editProductsProgramme( + body: EditProgrammeDto, + userInfo: UserInfoDto, + ) { + const { + industryId, + productId, + programmeName, + demoItemsList, + programmeId, + } = body; + const { userId } = userInfo; + try { + // 重名校验 + const SQL = `SELECT id FROM demo_programmes WHERE industryId = ? AND productsInfoId = ? AND programmeName = ? AND createuser = ? AND id != ? AND isDelete = 0;`; + const [row] = await this.database.DB.execute(SQL, [ + industryId, + productId, + programmeName, + userId, + programmeId, + ]); + if (row.length != 0) { + return { + data: {}, + message: '编辑方案失败,方案重名!', + success: false, + }; + } + } catch (e) { + return { + data: e, + message: '编辑方案失败,方案名称查重失败!', + success: false, + }; + } + try { + const SQL = `UPDATE demo_programmes SET productsInfoId = ?, industryId =?, programmeName = ?, demoItemsList = ? WHERE id = ?;`; + const [row] = await this.database.DB.execute(SQL, [ + productId, + industryId, + programmeName, + JSON.stringify(demoItemsList), + programmeId, + ]); + } catch (e) { + return { + data: e, + message: '编辑方案出现错误!', + success: false, + }; + } + return { + data: {}, + message: '编辑方案成功!', + success: true, + }; + } + + // 排序方案演示项 + public async editProductsProgrammeForDemoItemsListRank( + body: EditDemoItemsListRankDto, + ) { + const { programmeId, demoItemId, offset } = body; + let demoItemsList; + try { + const SQL = `SELECT demoItemsList FROM demo_programmes WHERE id = ? AND isDelete = 0;`; + const [row] = await this.database.DB.execute(SQL, [programmeId]); + if (row.length != 1) { + return { + data: {}, + message: '未找到演示方案!', + success: false, + }; + } else { + demoItemsList = JSON.parse(row[0].demoItemsList); + } + } catch (e) { + return { + data: e, + message: '编辑演示方案演示项顺序出现错误!', + success: false, + }; + } + if (!demoItemsList.includes(demoItemId)) { + return { + data: {}, + message: '编辑演示方案演示项顺序失败,未找到关联的演示项!', + success: false, + }; + } + const index = demoItemsList.indexOf(demoItemId); + if (offset == 0) { + if (index == demoItemsList.length - 1) { + return { + data: {}, + message: '该演示项已在最后,无法向后排序!', + success: false, + }; + } + const afterItem = demoItemsList[index + 1]; + demoItemsList.splice(index, 1, afterItem); + demoItemsList.splice(index + 1, 1, demoItemId); + } else if (offset == 1) { + if (index == 0) { + return { + data: {}, + message: '该演示项已在最前,无法向前排序!', + success: false, + }; + } + const beforeItem = demoItemsList[index - 1]; + demoItemsList.splice(index - 1, 1, demoItemId); + demoItemsList.splice(index, 1, beforeItem); + } else { + return { + data: {}, + message: '编辑演示方案演示项顺序失败,无法识别的偏移量!', + success: false, + }; + } + try { + const SQL = `UPDATE demo_programmes SET demoItemsList = ? WHERE id = ?;`; + const [row] = await this.database.DB.execute(SQL, [ + JSON.stringify(demoItemsList), + programmeId, + ]); + } catch (e) { + return { + data: e, + message: '编辑演示方案演示项顺序出现错误!', + success: false, + }; + } + return { + data: {}, + message: '编辑演示方案演示项顺序成功!', + success: true, + }; + } + + // 删除方案演示项 + public async deleteDemoItemForProgramme( + body: DeleteDemoItemForProgrammeDto, + ) { + const { demoItemId, programmeId } = body; + // 获取演示项列表 + let demoItemIdList; + try { + const SQL = + 'SELECT demoItemsList FROM demo_programmes WHERE id =?;'; + const [row] = await this.database.DB.execute(SQL, [programmeId]); + if (row.length == 0) { + return { + data: {}, + message: '未找到该演示方案!', + success: false, + }; + } + demoItemIdList = JSON.parse(row[0].demoItemsList); + if (demoItemIdList.length == 0) { + return { + data: {}, + message: '该方案不存在演示项!', + success: false, + }; + } + } catch (e) { + return { + data: e, + message: '删除方案演示项出现错误!', + success: false, + }; + } + const index = demoItemIdList.indexOf(demoItemId); + if (index > -1) { + demoItemIdList.splice(index, 1); + } + try { + const SQL = `UPDATE demo_programmes SET demoItemsList = ? WHERE id = ?;`; + const [row] = await this.database.DB.execute(SQL, [ + JSON.stringify(demoItemIdList), + programmeId, + ]); + } catch (e) { + return { + data: e, + message: '删除方案演示项出现错误!', + success: false, + }; + } + return { + data: {}, + message: '删除方案演示项成功!', + success: true, + }; + } + //#endregion + + //#region 演示现场 场景 + + // 获取我的演示现场 + public async getSceneListAndTree(userInfo: UserInfoDto) { + const { userId } = userInfo; + function ErrReturn(e, message = '获取演示现场出现错误!') { + return { + data: e, + message, + success: false, + }; + } + // 查演示现场 + let allDemoScenes; + try { + const SQL = + 'SELECT * FROM demo_scenes WHERE createuser = ? AND isDelete = 0 ORDER BY id DESC;'; + const [rows] = await this.database.DB.execute(SQL, [userId]); + if (rows.length == 0) { + return { + data: { + productTree: null, + industryTree: null, + programmeTree: null, + demoSceneList: null, + }, + success: true, + message: '获取演示现场成功!', + }; + } + allDemoScenes = rows; + } catch (e) { + return ErrReturn(e); + } + // 数据中的方案ID列表 + const programmeIdList = Array.from( + new Set(allDemoScenes.map((i) => i.programmeId)), + ); + let programmeList; + // 查演示方案 + try { + const setl = programmeIdList.join(','); + const SQL = `SELECT id, programmeName, productsInfoId, industryId, demoItemsList FROM demo_programmes WHERE id IN (${setl});`; + const [rows] = await this.database.DB.execute(SQL, []); + programmeList = rows; + if (rows.length == 0) + return ErrReturn( + {}, + `未找到相应的演示方案, 方案ID:${programmeIdList}!`, + ); + } catch (e) { + return ErrReturn(e); + } + // 产品中的产品和行业 + const productIdList = Array.from( + new Set(programmeList.map((i) => i.productsInfoId)), + ); + const industryIdList = Array.from( + new Set(programmeList.map((i) => i.industryId)), + ); + let productList, industryList; + // 查产品 + try { + const setl = productIdList.join(','); + const SQL = `SELECT id, productsName, productsUrl FROM products_info WHERE id IN (${setl});`; + const [rows] = await this.database.DB.execute(SQL, []); + productList = rows; + if (rows.length == 0) + return ErrReturn( + {}, + `未找到相应的产品, 产品ID:${productIdList}!`, + ); + } catch (e) { + return ErrReturn(e); + } + // 查行业 + try { + const setl = industryIdList.join(','); + const SQL = `SELECT id, industryName, productsInfoId FROM products_industry WHERE id IN (${setl});`; + const [rows] = await this.database.DB.execute(SQL, []); + industryList = rows; + if (rows.length == 0) + return ErrReturn( + {}, + `未找到相应的行业,行业ID:${industryIdList}!`, + ); + } catch (e) { + return ErrReturn(e); + } + // 查账户 + let allAccount = []; + try { + const setl = productIdList.join(','); + const SQL = `SELECT id, productsInfoId, accountName, accountPass, accountRole FROM products_account WHERE productsInfoId IN (${setl}) AND isDelete = 0;`; + const [row, result] = await this.database.DB.execute(SQL, []); + allAccount = row; + } catch (e) { + return ErrReturn(e); + } + // 为方案展开产品和行业 + programmeList = programmeList.map((i) => { + const accountList = allAccount.filter( + (j) => i.productsInfoId == j.productsInfoId, + ); + const productData = productList.filter( + (j) => j.id == i.productsInfoId, + ); + const industryData = industryList.filter( + (j) => j.id == i.industryId, + ); + return { + ...i, + accountList, + productName: productData[0]?.productsName, + productsUrl: productData[0]?.productsUrl, + industryName: industryData[0]?.industryName, + AXID: ( + new Date().getTime().toString() + + Math.random() * 100000 + ).toString(), + label: i.programmeName, + }; + }); + // 为现场展开方案 + allDemoScenes = allDemoScenes.map((i) => { + const { + productName, + industryName, + programmeName, + demoItemsList, + productsInfoId, + industryId, + productsUrl, + } = programmeList.filter((j) => j.id == i.programmeId)[0]; + return { + ...i, + productName, + industryName, + programmeName, + productsUrl, + demoItemsList: JSON.parse(demoItemsList), + industryId, + productId: productsInfoId, + AXID: ( + new Date().getTime().toString() + + Math.random() * 100000 + ).toString(), + label: i.sceneName, + }; + }); + // 获取第一个演示项 + const demoItemsIdListForFirst = Array.from( + new Set(allDemoScenes.map((i) => i.demoItemsList[0])), + ).filter((i) => i !== undefined); + let demoItemList; + // 查演示项内容 + try { + const setl = demoItemsIdListForFirst.join(','); + const SQL = `SELECT id, itemName, itemUrl, accumulate FROM demo_items WHERE id IN (${setl});`; + const [rows] = await this.database.DB.execute(SQL, []); + demoItemList = rows; + } catch (e) { + return ErrReturn(e); + } + // 展开演示项 + allDemoScenes = allDemoScenes.map((i) => { + const demoItemData = demoItemList.filter( + (j) => j.id == i.demoItemsList[0], + ); + if (demoItemData.length == 0) { + return { + ...i, + demoItemData: { + id: '', + itemName: '', + itemUrl: '', + }, + }; + } else { + return { + ...i, + demoItemData: { + id: demoItemData[0].id, + itemName: demoItemData[0].itemName, + itemUrl: + '/api/rgvsale/staticFile/' + + demoItemData[0].itemUrl, + accumulate: demoItemData[0].accumulate, + }, + }; + } + }); + // 按方案成树 + const programmeTree = programmeList.map((i) => { + return { + ...i, + children: allDemoScenes.filter((j) => i.id == j.programmeId), + }; + }); + // 按行业成树 + const industryTree = industryList.map((i) => { + return { + ...i, + children: programmeTree.filter((j) => i.id == j.industryId), + AXID: ( + new Date().getTime().toString() + + Math.random() * 100000 + ).toString(), + label: i.industryName, + }; + }); + // 按产品分 + const productTree = productList.map((i) => { + return { + ...i, + children: industryTree.filter((j) => i.id == j.productsInfoId), + AXID: ( + new Date().getTime().toString() + + Math.random() * 100000 + ).toString(), + label: i.productsName, + }; + }); + + return { + data: { + productTree, + industryTree, + programmeTree, + demoSceneList: allDemoScenes, + }, + message: '获取演示现场成功!', + success: true, + }; + } + + // 根据ID获取演示现场 + public async getListById(params: DeleteSceneDto) { + const { sceneId } = params; + function ErrReturn(e, message = '获取演示现场出现错误!') { + return { + data: e, + message, + success: false, + }; + } + // 查演示现场 + let allDemoScenes; + try { + const SQL = + 'SELECT * FROM demo_scenes WHERE id = ? AND isDelete = 0 ORDER BY id DESC;'; + const [rows] = await this.database.DB.execute(SQL, [sceneId]); + if (rows.length == 0) { + return { + data: {}, + success: true, + message: '获取演示现场成功!', + }; + } + allDemoScenes = rows; + } catch (e) { + return ErrReturn(e); + } + // 获取方案 + // 数据中的方案ID列表 + let programme; + // 查演示方案 + try { + const SQL = `SELECT id, programmeName, productsInfoId, industryId, demoItemsList FROM demo_programmes WHERE id = ?;`; + const [rows] = await this.database.DB.execute(SQL, [ + allDemoScenes[0].programmeId, + ]); + programme = rows; + if (rows.length == 0) + return ErrReturn( + {}, + `未找到相应的演示方案, 方案ID:${allDemoScenes[0].programmeId}!`, + ); + } catch (e) { + return ErrReturn(e); + } + // 查账户 + let allAccount = []; + try { + const SQL = `SELECT id, productsInfoId, accountName, accountPass, accountRole FROM products_account WHERE productsInfoId = ? AND isDelete = 0;`; + const [row, result] = await this.database.DB.execute(SQL, [ + allDemoScenes[0].programmeId, + ]); + allAccount = row; + } catch (e) { + return ErrReturn(e); + } + // 产品中的产品和行业 + let product, industry; + // 查产品 + try { + const SQL = `SELECT id, productsName, productsUrl FROM products_info WHERE id = ?;`; + const [rows] = await this.database.DB.execute(SQL, [ + programme[0].productsInfoId, + ]); + product = rows; + if (rows.length == 0) + return ErrReturn( + {}, + `未找到相应的产品, 产品ID:${programme[0].productsInfoId}!`, + ); + } catch (e) { + return ErrReturn(e); + } + // 查行业 + try { + const SQL = `SELECT id, industryName, productsInfoId FROM products_industry WHERE id = ?;`; + const [rows] = await this.database.DB.execute(SQL, [ + programme[0].industryId, + ]); + industry = rows; + if (rows.length == 0) + return ErrReturn( + {}, + `未找到相应的行业,行业ID:${programme[0].industryId}!`, + ); + } catch (e) { + return ErrReturn(e); + } + // 获取演示项 + const demoItemsIdList = JSON.parse(programme[0].demoItemsList); + let demoItemList; + if (demoItemsIdList.length == 0) { + demoItemList = []; + } else { + try { + const setl = demoItemsIdList.join(','); + const SQL = `SELECT id, itemName, itemUrl, accumulate FROM demo_items WHERE id IN (${setl});`; + const [rows] = await this.database.DB.execute(SQL, []); + demoItemList = rows.map((i) => { + return { + AXID: ( + new Date().getTime().toString() + + Math.random() * 100000 + ).toString(), + label: i.itemName, + id: i.id, + itemName: i.itemName, + itemUrl: '/api/rgvsale/staticFile/' + i.itemUrl, + accumulate: i.accumulate, + isComplete: JSON.parse( + allDemoScenes[0].completeDemo, + ).includes(i.id), + }; + }); + const newDemoList = []; + demoItemsIdList.map((i) => { + newDemoList.push( + demoItemList[ + demoItemList.findIndex((j) => { + return i == j.id; + }) + ], + ); + }); + demoItemList = newDemoList; + } catch (e) { + console.log(e); + return ErrReturn(e); + } + } + allDemoScenes = allDemoScenes[0]; + allDemoScenes.AXID = ( + new Date().getTime().toString() + + Math.random() * 100000 + ).toString(); + allDemoScenes.label = programme[0].programmeName; + allDemoScenes.industryName = industry[0].industryName; + allDemoScenes.industryId = industry[0].id; + allDemoScenes.programmeName = programme[0].programmeName; + allDemoScenes.productName = product[0].productsName; + allDemoScenes.productsUrl = product[0].productsUrl; + allDemoScenes.productId = product[0].id; + allDemoScenes.children = demoItemList; + allDemoScenes.completeDemo = JSON.parse(allDemoScenes.completeDemo); + allDemoScenes.accountList = allAccount; + return { + data: [allDemoScenes], + message: '获取演示现场成功!', + success: true, + }; + } + + // 创建演示现场 + public async createScene(body: CreateScenesDto, userInfo: UserInfoDto) { + const { programmeId, expectedStarttime, targetCustomers } = body; + const { userId } = userInfo; + // 查找方案名称 + let programmeName, sceneName; + try { + const SQL = `SELECT programmeName FROM demo_programmes WHERE id = ? AND isDelete = 0;`; + const [rows] = await this.database.DB.execute(SQL, [programmeId]); + if (rows.length == 0) { + return { + data: {}, + message: '创建现场失败,不存在该演示方案!', + success: false, + }; + } + programmeName = rows[0].programmeName; + } catch (e) { + return { data: e, message: '创建现场出现错误!', success: false }; + } + try { + const SQL = `SELECT id FROM demo_scenes WHERE targetCustomers = ? AND programmeId = ? AND createuser = ?;`; + const [rows] = await this.database.DB.execute(SQL, [ + targetCustomers, + programmeId, + userId, + ]); + sceneName = + programmeName + '-' + targetCustomers + '-' + (rows.length + 1); + } catch (e) { + return { data: e, message: '创建现场出现错误!', success: false }; + } + try { + const createTime = new Date(); + const [rows] = await this.database.DB.execute( + `INSERT INTO demo_scenes (sceneName, expectedStartTime, programmeId, targetCustomers, completeDemo, createtime, createuser) VALUES (?, ?, ?, ?, ?, ?, ?);`, + [ + sceneName, + expectedStarttime, + programmeId, + targetCustomers, + '[]', + createTime, + userInfo.userId, + ], + ); + return { + data: rows, + message: '创建现场成功!', + success: true, + }; + } catch (e) { + return { + data: e, + message: '创建现场出现错误!', + success: false, + }; + } + } + + // 删除演示现场 + public async deleteScene(body: DeleteSceneDto) { + const { sceneId } = body; + try { + const [rows] = await this.database.DB.execute( + `UPDATE demo_scenes SET isDelete = 1 WHERE id = ?;`, + [sceneId], + ); + } catch (e) { + return { + data: e, + message: '删除演示现场出现错误!', + success: false, + }; + } + return { + data: {}, + message: '删除演示现场成功!', + success: true, + }; + } + + // 增加演示项点击次数 + public async addDemoItemAccumulateForScene( + body: AddDemoItemAccumulateForSceneDto, + ) { + const { demoItemId, sceneId } = body; + // 获取已经演示的演示项 + let completeDemo; + try { + const SQL = `SELECT * FROM demo_scenes WHERE id = ?`; + const [rows] = await this.database.DB.execute(SQL, [sceneId]); + if (rows.length == 0) { + return { + data: {}, + message: '未找到演示现场!', + success: false, + }; + } + completeDemo = JSON.parse(rows[0].completeDemo); + } catch (e) { + return { + data: e, + message: '修改演示项演示状态出现错误!', + success: false, + }; + } + if (completeDemo.includes(demoItemId)) { + return { + data: {}, + message: '改演示项已经为演示过状态!', + success: false, + }; + } + completeDemo.push(demoItemId); + try { + const SQL = `UPDATE demo_scenes SET completeDemo = ? WHERE id = ?;`; + const [rows] = await this.database.DB.execute(SQL, [ + JSON.stringify(completeDemo), + sceneId, + ]); + const SQL2 = `UPDATE demo_items SET accumulate = accumulate + 1 WHERE id = ?`; + const [rows2] = await this.database.DB.execute(SQL2, [demoItemId]); + } catch (e) { + return { + data: e, + message: '修改演示项演示状态出现错误!', + success: false, + }; + } + return { + data: {}, + message: '修改演示项演示状态成功!', + success: true, + }; + } + //#endregion + + //#region 问题 + // 获取问题分页 + public async getScenesProblemList(params: GetScenesProblemPageDto) { + let { + productId, + programmeId, + sceneId, + search, + isUse, + pageNum, + pageSize, + } = params; + function ErrReturn(e, message = '获取问题页面出现错误!') { + console.log(e); + return { + data: e.toString(), + message, + success: false, + }; + } + // 根据产品查方案 + let programmeIdList = null; + if (productId) { + try { + const SQL = `SELECT id FROM demo_programmes WHERE productsInfoId = ?`; + const [rows] = await this.database.DB.execute(SQL, [productId]); + programmeIdList = rows; + } catch (e) { + return ErrReturn(e); + } + } + if (programmeIdList != null && programmeIdList.length == 0) { + return { + data: { total: 0, pageNum, pageSize, rowData: [] }, + success: true, + message: '获取问题页面成功!', + }; + } + // 根据行业查方案 + // 根据方案查现场 + let sceneIdList = null; + try { + if (programmeId) { + // 使用单个方案ID + const SQL = `SELECT id FROM demo_scenes WHERE programmeId = ?`; + const [rows] = await this.database.DB.execute(SQL, [ + programmeId, + ]); + sceneIdList = rows; + } else if (programmeIdList != null) { + // 使用方案ID列表 + const setl = programmeIdList.map((i) => i.id).join(','); + const SQL = `SELECT id FROM demo_scenes WHERE programmeId IN (${setl})`; + const [rows] = await this.database.DB.execute(SQL, []); + sceneIdList = rows; + } + } catch (e) { + return ErrReturn(e); + } + if (sceneIdList != null && sceneIdList.length == 0) { + return { + data: { total: 0, pageNum, pageSize, rowData: [] }, + success: true, + message: '获取问题页面成功!', + }; + } + // 根据现场查问题 + let problemIdList = null; + try { + if (sceneId) { + const SQL = `SELECT id FROM demo_scenes_problem WHERE scenesId = ?`; + const [rows] = await this.database.DB.execute(SQL, [sceneId]); + problemIdList = rows; + } else if (sceneIdList != null) { + const setl = sceneIdList.map((i) => i.id).join(','); + const SQL = `SELECT id FROM demo_scenes_problem WHERE scenesId IN (${setl})`; + const [rows] = await this.database.DB.execute(SQL, []); + problemIdList = rows; + } + } catch (e) { + return ErrReturn(e); + } + if (problemIdList != null && problemIdList.length == 0) { + return { + data: { total: 0, pageNum, pageSize, rowData: [] }, + success: true, + message: '获取问题页面成功!', + }; + } + if (pageNum == 0 || !pageNum) pageNum = 1; + if (pageSize == 0 || !pageSize) pageSize = 10; + let pageSQL, pageSQLParams, total, SQL, SQLParams, rowData; + const problemIdSQL = + problemIdList != null + ? `AND id IN (${problemIdList.map((i) => i.id)})` + : ``; + if (search && isUse != undefined) { + pageSQL = `SELECT COUNT(*) FROM demo_scenes_problem WHERE isDelete = 0 ${problemIdSQL} AND isUse = ? AND (targetCustomers LIKE '%${search}%' OR targetCustomersRole LIKE '%${search}%' OR problemContent LIKE '%${search}%')`; + pageSQLParams = [isUse]; + } else if (search && isUse == undefined) { + pageSQL = `SELECT COUNT(*) FROM demo_scenes_problem WHERE isDelete = 0 ${problemIdSQL} AND (targetCustomers LIKE '%${search}%' OR targetCustomersRole LIKE '%${search}%' OR problemContent LIKE '%${search}%')`; + pageSQLParams = []; + } else if (!search && isUse != undefined) { + pageSQL = `SELECT COUNT(*) FROM demo_scenes_problem WHERE isDelete = 0 ${problemIdSQL} AND isUse = ?`; + pageSQLParams = [isUse]; + } else if (!search && isUse == undefined) { + pageSQL = `SELECT COUNT(*) FROM demo_scenes_problem WHERE isDelete = 0 ${problemIdSQL}`; + pageSQLParams = []; + } + SQL = pageSQL.replace('COUNT(*)', '*') + ' ORDER BY id DESC limit ?,?'; + SQLParams = [...pageSQLParams, (pageNum - 1) * pageSize, pageSize]; + try { + const [rows, results] = await this.database.DB.execute( + pageSQL, + pageSQLParams, + ); + total = rows[0]['COUNT(*)']; + const [datarows, dataresults] = await this.database.DB.execute( + SQL, + SQLParams, + ); + rowData = datarows; + if (rowData.length == 0) { + return { + data: { + total, + pageNum, + pageSize, + rowData: [], + }, + success: true, + message: '获取问题页面成功!', + }; + } + } catch (e) { + return ErrReturn(e); + } + // 查演示项 + let demoItemIdList, demoItemDataList; + demoItemIdList = rowData.map((i) => i.demoItemId); + try { + const setl = demoItemIdList.join(','); + const aSQL = `SELECT id, itemName FROM demo_items WHERE id IN (${setl})`; + const [rows] = await this.database.DB.execute(aSQL, []); + demoItemDataList = rows; + if (rows.length == 0) { + return ErrReturn( + {}, + '数据错误,未找到相应演示项,演示项ID' + demoItemIdList, + ); + } + } catch (e) { + return ErrReturn(e); + } + // 查现场 + let newScenesIdIdList, scenesDataList; + newScenesIdIdList = rowData.map((i) => i.scenesId); + try { + const setl = newScenesIdIdList.join(','); + const aSQL = `SELECT id, sceneName, programmeId FROM demo_scenes WHERE id IN (${setl})`; + const [rows] = await this.database.DB.execute(aSQL, []); + scenesDataList = rows; + if (rows.length == 0) { + return ErrReturn( + {}, + '数据错误,未找到相应演示现场,现场ID' + newScenesIdIdList, + ); + } + } catch (e) { + return ErrReturn(e); + } + // 查方案 + let newProgrammeIdList, programmeDataList; + newProgrammeIdList = scenesDataList.map((i) => i.programmeId); + try { + const setl = newProgrammeIdList.join(','); + const aSQL = `SELECT id, programmeName, productsInfoId, industryId FROM demo_programmes WHERE id IN (${setl})`; + const [rows] = await this.database.DB.execute(aSQL, []); + programmeDataList = rows; + if (rows.length == 0) { + return ErrReturn( + {}, + '数据错误,未找到相应方案,方案ID' + newProgrammeIdList, + ); + } + } catch (e) { + return ErrReturn(e); + } + // 查产品 + let newProductIdList, productDataList; + newProductIdList = programmeDataList.map((i) => i.productsInfoId); + try { + const setl = newProductIdList.join(','); + const aSQL = `SELECT id, productsName FROM products_info WHERE id IN (${setl})`; + const [rows] = await this.database.DB.execute(aSQL, []); + productDataList = rows; + if (rows.length == 0) { + return ErrReturn( + {}, + '数据错误,未找到相应产品,产品ID' + newProductIdList, + ); + } + } catch (e) { + return ErrReturn(e); + } + // 为方案展开产品 + programmeDataList = programmeDataList.map((i) => { + const aData = productDataList.filter( + (j) => j.id == i.productsInfoId, + ); + if (aData.length == 0) { + return ErrReturn( + {}, + '数据错误,未找到相应产品,产品ID' + i.productsInfoId, + ); + } + return { + ...i, + productName: aData[0].productsName, + }; + }); + // 为现场展开方案 + scenesDataList = scenesDataList.map((i) => { + const aData = programmeDataList.filter( + (j) => j.id == i.programmeId, + ); + if (aData.length == 0) { + return ErrReturn( + {}, + '数据错误,未找到相应方案,方案ID' + i.programmeId, + ); + } + return { + ...i, + programmeData: aData[0], + }; + }); + // 为问题展开现场 + rowData = rowData.map((i) => { + const aData = scenesDataList.filter((j) => j.id == i.scenesId); + if (aData.length == 0) { + return ErrReturn( + {}, + '数据错误,未找到相应现场,现场ID' + i.scenesId, + ); + } + return { + ...i, + sceneId: aData[0].id, + sceneName: aData[0].sceneName, + programmeId: aData[0].programmeId, + programmeName: aData[0].programmeData.programmeName, + productId: aData[0].programmeData.productsInfoId, + productName: aData[0].programmeData.productName, + industryId: aData[0].programmeData.industryId, + }; + }); + // 为问题展开演示项 + rowData = rowData.map((i) => { + const aData = demoItemDataList.filter((j) => j.id == i.demoItemId); + if (aData.length == 0) { + return ErrReturn( + {}, + '数据错误,未找到相应演示项,演示项ID' + i.demoItemId, + ); + } + return { + ...i, + demoItemName: aData[0].itemName, + }; + }); + const returnData = { + data: { + total, + pageNum, + pageSize, + rowData: [], + }, + success: true, + message: '获取问题页面成功!', + }; + if (rowData.length != 0) { + returnData.data.rowData = rowData; + } + return returnData; + } + + // 创建问题 + public async createScenesProblem( + body: CreateScenesProblemDto, + userInfo: UserInfoDto, + ) { + const { + targetCustomers, + targetCustomersRole, + problemContent, + sceneId, + demoItemId, + } = body; + const { userId } = userInfo; + try { + const createtime = new Date(); + const SQL = `INSERT INTO demo_scenes_problem (problemContent, scenesId, targetCustomers, targetCustomersRole, createuser, createtime, demoItemId) VALUES (?, ?, ?, ?, ?, ?, ?);`; + this.database.DB.execute(SQL, [ + problemContent, + sceneId, + targetCustomers, + targetCustomersRole, + userId, + createtime, + demoItemId, + ]); + } catch (e) { + return { + data: e, + message: '创建问题出现错误!', + success: false, + }; + } + return { + data: {}, + message: '创建问题成功!', + success: true, + }; + } + + // 删除问题 + public async deleteScenesProblem(body: DeleteScenesProblemDto) { + const { problemId } = body; + try { + const [rows] = await this.database.DB.execute( + `UPDATE demo_scenes_problem SET isDelete = 1 WHERE id = ?;`, + [problemId], + ); + } catch (e) { + return { + data: e, + message: '删除演示现场出现错误!', + success: false, + }; + } + return { data: {}, message: '删除问题成功!', success: true }; + } + + // 编辑问题 + public async editScenesProblem(body: EditScenesProblemDto) { + const { + problemContent, + targetCustomers, + targetCustomersRole, + problemId, + sceneId, + demoItemId, + } = body; + try { + const SQL = `UPDATE demo_scenes_problem SET problemContent = ?, targetCustomers =?, targetCustomersRole = ?, scenesId = ?, demoItemId = ? WHERE id = ?;`; + const [row] = await this.database.DB.execute(SQL, [ + problemContent, + targetCustomers, + targetCustomersRole, + sceneId, + demoItemId, + problemId, + ]); + } catch (e) { + return { + data: e, + message: '编辑问题出现错误!', + success: false, + }; + } + return { + data: {}, + message: '编辑问题成功!', + success: true, + }; + } + + // 修改问题利用状态 + public async changeScenesProblemUseState(body: ChangeUseStateDto) { + const { problemId } = body; + try { + const SQL = `UPDATE demo_scenes_problem SET isUse = 1 WHERE id = ?;`; + const [row] = await this.database.DB.execute(SQL, [problemId]); + } catch (e) { + return { + data: e, + message: '修改问题利用状态出现错误!', + success: false, + }; + } + return { + data: {}, + message: '修改问题利用状态成功!', + success: true, + }; + } + + //#endregion +} diff --git a/08=rgvScleNestjs/test/app.e2e-spec.ts b/08=rgvScleNestjs/test/app.e2e-spec.ts new file mode 100644 index 0000000..ce86fb8 --- /dev/null +++ b/08=rgvScleNestjs/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { AppModule } from './../src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/08=rgvScleNestjs/test/jest-e2e.json b/08=rgvScleNestjs/test/jest-e2e.json new file mode 100644 index 0000000..e9d912f --- /dev/null +++ b/08=rgvScleNestjs/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/08=rgvScleNestjs/test/testToken.js b/08=rgvScleNestjs/test/testToken.js new file mode 100644 index 0000000..0a1bb08 --- /dev/null +++ b/08=rgvScleNestjs/test/testToken.js @@ -0,0 +1,14 @@ +import jwt from 'jsonwebtoken' + +// const token = 'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjVjMDdlNzRjLTFiYzctNDAzYy05NjUxLTI5YjgzZGM5ZGE4MSJ9.bC2MO_7dzBeuMH33z7l3Wlovl489aja1B1D3SB4ukJmGye_RDZCy5rmDw0tPGsNpbeYryxBG9OgWZSxEAKX5Kg' +// +const secretkey = 'abcdefghijklmnopqrstuvwxyz' +console.log(jwt); +const a = jwt.sign({ secretkey },secretkey, { expiresIn: '30m' }) +// console.log(a); + +const token = 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjVlOWQ1ZTMzLTI0MjEtNDJkYy1iZmU5LTI5Y2M1YjIxOWU4ZCJ9.VmZzLm2si5d51oe_ZPq9sB7ZF7GLuttjSjxQHdxQg49W4QU6PnLFzhAIeKYx0l4mfKj4uL4_IKyqPsm4t6znHg' +jwt.verify(token, secretkey, (error, data)=>{ + console.log(error); + console.log(data); +}) \ No newline at end of file diff --git a/08=rgvScleNestjs/tsconfig.build.json b/08=rgvScleNestjs/tsconfig.build.json new file mode 100644 index 0000000..64f86c6 --- /dev/null +++ b/08=rgvScleNestjs/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/08=rgvScleNestjs/tsconfig.json b/08=rgvScleNestjs/tsconfig.json new file mode 100644 index 0000000..d5a45aa --- /dev/null +++ b/08=rgvScleNestjs/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es2017", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false, + "paths": { + "@/*": [ + "src/*" + ], + "@CFG/*": [ + "config/*" + ] + } + }, +} diff --git a/09=real-time-communication/.gitignore b/09=real-time-communication/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/09=real-time-communication/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/09=real-time-communication/Client/.eslintrc.cjs b/09=real-time-communication/Client/.eslintrc.cjs new file mode 100644 index 0000000..4dcb439 --- /dev/null +++ b/09=real-time-communication/Client/.eslintrc.cjs @@ -0,0 +1,20 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + settings: { react: { version: '18.2' } }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/09=real-time-communication/Client/.gitignore b/09=real-time-communication/Client/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/09=real-time-communication/Client/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/09=real-time-communication/Client/README.md b/09=real-time-communication/Client/README.md new file mode 100644 index 0000000..f768e33 --- /dev/null +++ b/09=real-time-communication/Client/README.md @@ -0,0 +1,8 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh diff --git a/09=real-time-communication/Client/index.html b/09=real-time-communication/Client/index.html new file mode 100644 index 0000000..bcc7893 --- /dev/null +++ b/09=real-time-communication/Client/index.html @@ -0,0 +1,13 @@ + + + + + + + 实时通信 + + +
      + + + diff --git a/09=real-time-communication/Client/package.json b/09=real-time-communication/Client/package.json new file mode 100644 index 0000000..308ad29 --- /dev/null +++ b/09=real-time-communication/Client/package.json @@ -0,0 +1,29 @@ +{ + "name": "client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint client --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "localforage": "^1.10.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.15.0", + "sass": "^1.66.1" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.3", + "eslint": "^8.45.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "vite": "^4.4.5" + } +} diff --git a/09=real-time-communication/Client/pnpm-lock.yaml b/09=real-time-communication/Client/pnpm-lock.yaml new file mode 100644 index 0000000..7719d15 --- /dev/null +++ b/09=real-time-communication/Client/pnpm-lock.yaml @@ -0,0 +1,2326 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + localforage: + specifier: ^1.10.0 + version: 1.10.0 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-router-dom: + specifier: ^6.15.0 + version: 6.15.0(react-dom@18.2.0)(react@18.2.0) + sass: + specifier: ^1.66.1 + version: 1.66.1 + +devDependencies: + '@types/react': + specifier: ^18.2.15 + version: 18.2.21 + '@types/react-dom': + specifier: ^18.2.7 + version: 18.2.7 + '@vitejs/plugin-react': + specifier: ^4.0.3 + version: 4.0.4(vite@4.4.9) + eslint: + specifier: ^8.45.0 + version: 8.48.0 + eslint-plugin-react: + specifier: ^7.32.2 + version: 7.33.2(eslint@8.48.0) + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.48.0) + eslint-plugin-react-refresh: + specifier: ^0.4.3 + version: 0.4.3(eslint@8.48.0) + vite: + specifier: ^4.4.5 + version: 4.4.9(sass@1.66.1) + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.13 + chalk: 2.4.2 + dev: true + + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.22.11: + resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helpers': 7.22.11 + '@babel/parser': 7.22.13 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.11 + '@babel/types': 7.22.11 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.22.10: + resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.22.10: + resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-module-imports@7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.22.11: + resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.11 + '@babel/types': 7.22.11 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.22.13: + resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.22.13: + resolution: {integrity: sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.22.13 + '@babel/types': 7.22.11 + dev: true + + /@babel/traverse@7.22.11: + resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.13 + '@babel/types': 7.22.11 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.22.11: + resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: true + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.48.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.8.0: + resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.21.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.48.0: + resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.11: + resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@remix-run/router@1.8.0: + resolution: {integrity: sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==} + engines: {node: '>=14.0.0'} + dev: false + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: true + + /@types/react-dom@18.2.7: + resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + dependencies: + '@types/react': 18.2.21 + dev: true + + /@types/react@18.2.21: + resolution: {integrity: sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + dev: true + + /@types/scheduler@0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + dev: true + + /@vitejs/plugin-react@4.0.4(vite@4.4.9): + resolution: {integrity: sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.11) + react-refresh: 0.14.0 + vite: 4.4.9(sass@1.66.1) + transitivePeerDependencies: + - supports-color + dev: true + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + + /array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + is-string: 1.0.7 + dev: true + + /array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.tosorted@1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: true + + /arraybuffer.prototype.slice@1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + + /asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 + dev: true + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001524 + electron-to-chromium: 1.4.505 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: true + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /caniuse-lite@1.0.30001524: + resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /electron-to-chromium@1.4.505: + resolution: {integrity: sha512-0A50eL5BCCKdxig2SsCXhpuztnB9PfUgRMojj5tMvt8O54lbwz3t6wNgnpiTRosw5QjlJB7ixhVyeg8daLQwSQ==} + dev: true + + /es-abstract@1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.1 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-array-concat: 1.0.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + dev: true + + /es-iterator-helpers@1.0.14: + resolution: {integrity: sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-set-tostringtag: 2.0.1 + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + iterator.prototype: 1.1.0 + safe-array-concat: 1.0.0 + dev: true + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.48.0 + dev: true + + /eslint-plugin-react-refresh@0.4.3(eslint@8.48.0): + resolution: {integrity: sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==} + peerDependencies: + eslint: '>=7' + dependencies: + eslint: 8.48.0 + dev: true + + /eslint-plugin-react@7.33.2(eslint@8.48.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.14 + eslint: 8.48.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.1 + string.prototype.matchall: 4.0.9 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.48.0: + resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/regexpp': 4.8.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.48.0 + '@humanwhocodes/config-array': 0.11.11 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.21.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.1.0 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.1.0: + resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: '>=12.0.0'} + dependencies: + flatted: 3.2.7 + keyv: 4.5.3 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.21.0: + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /immutable@4.3.4: + resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: true + + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /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.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + dev: true + + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /iterator.prototype@1.1.0: + resolution: {integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==} + dependencies: + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + has-tostringtag: 1.0.0 + reflect.getprototypeof: 1.0.3 + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + object.assign: 4.1.4 + object.values: 1.1.7 + dev: true + + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + dependencies: + immediate: 3.0.6 + dev: false + + /localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + dependencies: + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /postcss@8.4.29: + resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-router-dom@6.15.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.8.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.15.0(react@18.2.0) + dev: false + + /react-router@6.15.0(react@18.2.0): + resolution: {integrity: sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.8.0 + react: 18.2.0 + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /reflect.getprototypeof@1.0.3: + resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve@2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.28.1: + resolution: {integrity: sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-array-concat@1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + dev: true + + /sass@1.66.1: + resolution: {integrity: sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.3.4 + source-map-js: 1.0.2 + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /string.prototype.matchall@4.0.9: + resolution: {integrity: sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 + dev: true + + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + + /vite@4.4.9(sass@1.66.1): + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.29 + rollup: 3.28.1 + sass: 1.66.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.11 + dev: true + + /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.2 + dev: true + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/09=real-time-communication/Client/public/vite.svg b/09=real-time-communication/Client/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/09=real-time-communication/Client/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/09=real-time-communication/Client/src/App.jsx b/09=real-time-communication/Client/src/App.jsx new file mode 100644 index 0000000..2504e15 --- /dev/null +++ b/09=real-time-communication/Client/src/App.jsx @@ -0,0 +1,11 @@ +import { useState } from 'react' +import {useRoutes} from "react-router-dom"; +import {routerList} from "./route/index.jsx"; + +function App() { + const [count, setCount] = useState(0) + + return useRoutes(routerList) +} + +export default App diff --git a/09=real-time-communication/Client/src/assets/index.scss b/09=real-time-communication/Client/src/assets/index.scss new file mode 100644 index 0000000..894f0a2 --- /dev/null +++ b/09=real-time-communication/Client/src/assets/index.scss @@ -0,0 +1,22 @@ +html,body,#root{ + position: relative; + height: 100%; + width: 100%; + margin: 0; + padding: 0; +} +#root{ + display: flex; + overflow: hidden; + & > div{ + position: relative; + overflow: hidden; + } + & > div:first-child{ + flex-shrink: 0; + width: 240px; + } + & > div:last-child{ + flex: 1; + } +} diff --git a/09=real-time-communication/Client/src/main.jsx b/09=real-time-communication/Client/src/main.jsx new file mode 100644 index 0000000..5a56dad --- /dev/null +++ b/09=real-time-communication/Client/src/main.jsx @@ -0,0 +1,13 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { BrowserRouter } from 'react-router-dom' +import App from "./App.jsx"; +import './assets/index.scss' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + + + , +) diff --git a/09=real-time-communication/Client/src/route/index.jsx b/09=real-time-communication/Client/src/route/index.jsx new file mode 100644 index 0000000..061e511 --- /dev/null +++ b/09=real-time-communication/Client/src/route/index.jsx @@ -0,0 +1,37 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @文件描述: index.jsx | 路由表 +// | @创建时间: 2023-08-30 15:43 +// | @更新时间: 2023-08-30 15:43 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import { Navigate } from 'react-router-dom' +import Home from "../views/Home/index.jsx"; +import Signin from "../views/Signin/index.jsx"; +import WebSocketClient from "../views/WebSocket/index.jsx"; + +export const routerList = [ + { + path:'/', + element: + }, + { + path:'/signin', + element: + }, + { + path:'/home', + element: , + children:[ + { + path:'websocket', + element: + }, + ] + }, +] diff --git a/09=real-time-communication/Client/src/views/Home/index.jsx b/09=real-time-communication/Client/src/views/Home/index.jsx new file mode 100644 index 0000000..8029b89 --- /dev/null +++ b/09=real-time-communication/Client/src/views/Home/index.jsx @@ -0,0 +1,45 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @文件描述: Home.jsx | +// | @创建时间: 2023-08-30 15:52 +// | @更新时间: 2023-08-30 15:52 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import {Outlet, NavLink, useLocation} from "react-router-dom"; +import css from './index.module.scss' +import {useEffect, useState} from "react"; + +export default function Home(){ + // @ host - String - 描述:ws链接地址 + const [host, setHost] = useState(''); + // @ nickname - String - 描述:ws昵称 + const [nickname, setNickName] = useState(''); + // @ location - String - 描述:当前路由信息 + const [location, setLocation] = useState(useLocation()); + useEffect(() => { + setHost(window.localStorage.getItem('wsHost')); + setNickName(window.localStorage.getItem('wsNickname')) + }, [0]); + return <> +
      +
      +
      个人信息
      +
      昵称: {nickname}
      +
      链接地址: {host}
      +
      +
      +
      服务
      + isActive ? css.choose : ''}>WebSocket +
      +
      +
      +
      {location?.pathname && location?.pathname?.split('/').slice(-1).toString().toUpperCase()}
      +
      +
      + +} diff --git a/09=real-time-communication/Client/src/views/Home/index.module.scss b/09=real-time-communication/Client/src/views/Home/index.module.scss new file mode 100644 index 0000000..c0a8033 --- /dev/null +++ b/09=real-time-communication/Client/src/views/Home/index.module.scss @@ -0,0 +1,76 @@ +.left{ + position: relative; + overflow: hidden; + height: 100%; + display: flex; + flex-direction: column; + box-sizing: border-box; + padding: 10px; + & > div.info{ + position: relative; + flex-shrink: 0; + overflow: hidden; + border-radius: 10px; + background: #00033322; + box-sizing: border-box; + padding: 10px; + &>header{ + position: relative; + line-height: 3em; + text-align: center; + font-size: 18px; + } + & > div{ + position: relative; + line-height: 2em; + font-size: 14px; + } + } + & > div.server{ + position: relative; + flex: 1; + overflow: hidden; + background: aquamarine; + margin-top: 10px; + border-radius: 10px; + padding: 10px; + &>header{ + position: relative; + line-height: 3em; + text-align: center; + font-size: 18px; + } + } + + + .choose{ + all: unset; + cursor: pointer; + background: darkmagenta; + color: #fefefe; + } +} + +.right{ + position: relative; + overflow: hidden; + height: 100%; + padding: 10px; + box-sizing: border-box; + margin: 10px 10px 10px 0; + border-radius: 10px; + background: #eeeeee99; + display: flex; + flex-direction: column; + & > header{ + position: relative; + flex-shrink: 0; + line-height: 3em; + font-size: 18px; + font-weight: bold; + } + & > div{ + position: relative; + flex: 1; + } +} diff --git a/09=real-time-communication/Client/src/views/MessageWindow/index.jsx b/09=real-time-communication/Client/src/views/MessageWindow/index.jsx new file mode 100644 index 0000000..334098c --- /dev/null +++ b/09=real-time-communication/Client/src/views/MessageWindow/index.jsx @@ -0,0 +1,55 @@ +import css from './index.module.scss' +import {useEffect, useState} from "react"; +export default function MessageWindow(props){ + // @ inputMessage - String - 描述:输入内容 + const [inputMessage, setInputMessage] = useState(''); + // @ messageList - Object[] - 描述:消息列表 + const [messageList, setMessageList] = useState([]); + useEffect(() => { + setMessageList(props.messageList) + }, [props.messageList]) + + // = 函数名: handleInputMessageChange + // = 描述: 响应消息内容输入 + // = 参数: event + // = 返回值: undefined + // = 创建人: Nier + // = 创建时间: 2023-08-30 19:41:26 - + function handleInputMessageChange(event) { + setInputMessage(event.target.value) + } + + // = 函数名: handleSendMessage + // = 描述: 发送消息 + // = 参数: null + // = 返回值: undefined + // = 创建人: Nier + // = 创建时间: 2023-08-30 19:42:04 - + function handleSendMessage() { + props?.sendMessage(inputMessage) + setInputMessage('') + } + return
      +
      +
      +
      + { + messageList.map(item =>
      +
      +
      +
      {item.nickname}
        |   +
      {item.timeId}
      +
      +
      {item.message}
      +
      +
      ) + } +
      +
      +
      + +
      发送
      +
      +
      +
      +} diff --git a/09=real-time-communication/Client/src/views/MessageWindow/index.module.scss b/09=real-time-communication/Client/src/views/MessageWindow/index.module.scss new file mode 100644 index 0000000..ff299e8 --- /dev/null +++ b/09=real-time-communication/Client/src/views/MessageWindow/index.module.scss @@ -0,0 +1,110 @@ +.messageWindow{ + position: relative; + height: 100%; + width: 100%; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + & > div.container{ + position: relative; + min-width: 800px; + max-width: 1200px; + width: auto; + overflow: hidden; + height: 80%; + min-height: 700px; + max-height: 900px; + display: flex; + flex-direction: column; + background: #9D44C099; + border-radius: 10px; + box-sizing: border-box; + padding: 15px; + box-shadow: 0 0 20px -5px #33333333; + & > div.body{ + position: relative; + flex: 1; + background: #F7E987; + border-radius: 10px; + box-shadow: 0 0 10px -5px #33333399 inset; + margin-bottom: 15px; + padding: 15px; + overflow: hidden; + & > div.container{ + position: relative; + max-height: 100%; + box-sizing: border-box; + overflow: auto; + &>div.messageBox{ + position: relative; + + & > div{ + position: relative; + border-radius: 10px 10px 10px 0; + padding: 10px; + box-sizing: border-box; + box-shadow: 0 0 10px 2px #33333333; + background: #1BB74Bcc; + width:fit-content; + width:-webkit-fit-content; + width:-moz-fit-content; + cursor: pointer; + color: #fefefe; + margin: 10px 0; + & > div:first-child{ + position: relative; + display: flex; + } + } + } + &>div.myMessageBox{ + display: flex; + justify-content: end; + & > div{ + border-radius: 10px 10px 0 10px ; + background: darkmagenta; + } + } + } + } + & > div.footer{ + position: relative; + height: 140px; + flex-shrink: 0; + background: #fcfcfc; + border-radius: 10px; + box-sizing: border-box; + box-shadow: 0 6px 20px -2px #33333333; + padding: 15px; + & > textarea{ + border:unset; + outline: unset; + resize: unset; + position: relative; + display: block; + width: 100%; + background: #fcfcfc; + height: 100%; + overflow: auto; + } + & > div.sendButton{ + position: absolute; + padding: 5px 15px; + bottom: 15px; + right: 15px; + background: #1BB74B; + border-radius: 5px; + cursor: pointer; + user-select: none; + transition: all ease-in-out 200ms; + color: #fefefe; + //font-weight: 600; + font-size: 16px; + &:hover{ + box-shadow: 0 0 10px 1px #33333333; + } + } + } + } +} diff --git a/09=real-time-communication/Client/src/views/Signin/index.jsx b/09=real-time-communication/Client/src/views/Signin/index.jsx new file mode 100644 index 0000000..bbc53bc --- /dev/null +++ b/09=real-time-communication/Client/src/views/Signin/index.jsx @@ -0,0 +1,57 @@ +import css from './index.module.scss' +import {useEffect, useState} from "react"; +import { useNavigate} from 'react-router-dom' + +export default function Signin(){ + const navigate = useNavigate() + // @ host - String - 描述:webSocket连接地址 + const [host, setHost] = useState('') + // @ nickname - String - 描述:昵称 + const [nickname, setNickname] = useState(''); + useEffect(() => { + // @ storageHost - String - 描述:来自localStorage的ws链接地址 + const storageHost = window.localStorage.getItem('wsHost'); + // @ storageNickname - String - 描述:来自localStorage的ws昵称 + const storageNickname =window.localStorage.getItem('wsNickname'); + storageHost && setHost(storageHost) + storageNickname && setNickname(storageNickname) + }, [0]); + // = 函数名: handleHostChange + // = 描述: 响应修改host输入 + // = 参数: None + // = 返回值: undefined + // = 创建人: Nier + // = 创建时间: 2023-08-30 16:42:16 - + function handleHostChange(event) { + setHost(event.target.value) + } + + // = 函数名: handleChangeNickname + // = 描述: 响应修改nickName输入 + // = 参数: None + // = 返回值: undefined + // = 创建人: Nier + // = 创建时间: 2023-08-30 16:42:51 - + function handleChangeNickname(event) { + setNickname(event.target.value) + } + + // = 函数名: handleConfirmHost + // = 描述: 确认host地址 + // = 参数: None + // = 返回值: undefined + // = 创建人: Nier + // = 创建时间: 2023-08-30 16:42:19 - + function handleConfirmHost() { + window.localStorage.setItem('wsHost', host) + window.localStorage.setItem('wsNickname', nickname) + navigate('/home') + } + return
      +
      +
      +
      +
      确认连接
      +
      +
      +} diff --git a/09=real-time-communication/Client/src/views/Signin/index.module.scss b/09=real-time-communication/Client/src/views/Signin/index.module.scss new file mode 100644 index 0000000..92a1b2c --- /dev/null +++ b/09=real-time-communication/Client/src/views/Signin/index.module.scss @@ -0,0 +1,45 @@ +.signin{ + position: relative; + height: 100%; + width: 100%; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + & > div{ + position: relative; + input{ + all: unset; + width: 300px; + background: #00033322; + padding: 10px 10px; + font-size: 20px; + font-weight: bold; + border-radius: 5px; + text-align: center; + } + &>.input{ + position: relative; + margin: 20px 0; + } + & > .button{ + position: relative; + margin: 0 auto; + /*div宽度适应文字*/ + width:fit-content; + width:-webkit-fit-content; + width:-moz-fit-content; + margin-top: 40px; + padding: 10px 20px; + border-radius: 5px; + background: darkmagenta; + font-weight: bold; + color: #fefefe; + cursor: pointer; + transition: all ease-in-out 300ms; + &:hover{ + box-shadow: 0 10px 20px -8px #33333366; + } + } + } +} diff --git a/09=real-time-communication/Client/src/views/WebSocket/index.jsx b/09=real-time-communication/Client/src/views/WebSocket/index.jsx new file mode 100644 index 0000000..f772995 --- /dev/null +++ b/09=real-time-communication/Client/src/views/WebSocket/index.jsx @@ -0,0 +1,72 @@ +import {useEffect, useLayoutEffect, useState, useRef} from "react"; +import localforage from 'localforage'; +import MessageWindow from "../MessageWindow/index.jsx"; + +export default function WebSocketClient(){ + // @ nickname - String - 描述:WebSocket客户端用户名 + const [nickname, setNickname] = useState(window.localStorage.getItem('wsNickname')) + // @ ws - WebSocket - 描述:WebSocket客户端 + const [ws, setWs] = useState(null) + // @ wsState - Boolean - 描述:websocket状态 + const [wsState, setWsState] = useState(false); + // @ webSocketDB - LocalForage - 描述:本地WebSocket消息数据库 + const [webSocketDB, setWebSocketDB] = useState(null); + // @ messageList - Object[] - 描述:实时消息列表 + const [messageList, setMessageList] = useState([]); + + useEffect(() => { + const socket = ws === null && new WebSocket(`ws://${window.localStorage.getItem('wsHost')}:10001`); + const db = localforage.createInstance({ + name: "websocket" + }); + const msgList = [] + db.iterate((value, key, iterationNumber) => { + msgList.push({ + timeId: key, + ...value + }) + }).then(resd => { + setMessageList(msgList) + }) + socket.onopen = event => { + setWsState(true) + } + socket.onerror = event =>{ + console.error('Error',event) + } + socket.onclose = event => { + setWsState(false) + setWs(null) + } + setWs(socket) + setWebSocketDB(db) + return () => { + socket.readyState === 1 &&socket.close() + } + }, [0]) + + if(ws){ + ws.onmessage = event => { + const msg = JSON.parse(event.data) + msg.nickname == nickname ? msg.isMe = true : msg.isMe = false; + setMessageList([...messageList,msg]) + webSocketDB.setItem(msg.timeId, msg) + } + } + + // = 函数名: handleSendMessage + // = 描述: 发送WebSocket消息 + // = 参数: message | String + // = 返回值: undefined + // = 创建人: Nier + // = 创建时间: 2023-08-30 19:58:30 - + function handleSendMessage(message) { + ws.send(JSON.stringify({ + message, + timeId: new Date().getTime().toString() + parseInt(Math.random() * 10000000), + nickname + })) + } + + return +} diff --git a/09=real-time-communication/Client/vite.config.js b/09=real-time-communication/Client/vite.config.js new file mode 100644 index 0000000..decc5e2 --- /dev/null +++ b/09=real-time-communication/Client/vite.config.js @@ -0,0 +1,9 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + server: { + host: "0.0.0.0",} +}) diff --git a/09=real-time-communication/README.md b/09=real-time-communication/README.md new file mode 100644 index 0000000..727afda --- /dev/null +++ b/09=real-time-communication/README.md @@ -0,0 +1,3 @@ +# HotoKiss + +实时通信方案,当时给前端做的贡献 \ No newline at end of file diff --git a/09=real-time-communication/Server/app.js b/09=real-time-communication/Server/app.js new file mode 100644 index 0000000..b50b3b5 --- /dev/null +++ b/09=real-time-communication/Server/app.js @@ -0,0 +1,15 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @文件描述: app.js | 实时通信服务端 +// | @创建时间: 2023-08-30 14:57 +// | @更新时间: 2023-08-30 14:57 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import {httpWebSocket} from "./ws.js"; +// http WebSocket +httpWebSocket() diff --git a/09=real-time-communication/Server/sse.js b/09=real-time-communication/Server/sse.js new file mode 100644 index 0000000..27cd43e --- /dev/null +++ b/09=real-time-communication/Server/sse.js @@ -0,0 +1,11 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @文件描述: sse +// | @创建时间: 2023-09-27 15:59 +// | @更新时间: 2023-09-27 15:59 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ diff --git a/09=real-time-communication/Server/ws.js b/09=real-time-communication/Server/ws.js new file mode 100644 index 0000000..89e7a9f --- /dev/null +++ b/09=real-time-communication/Server/ws.js @@ -0,0 +1,85 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @文件描述: ws.js | 通过WebSocket建立服务 +// | @创建时间: 2023-08-30 15:08 +// | @更新时间: 2023-08-30 15:08 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +// 引入WebSocketServer +import WebSocket, { WebSocketServer } from 'ws'; +// 文件操作 +import { createServer } from 'https'; +import { readFileSync } from 'fs'; + +// = 函数名: httpWebSocket +// = 描述: 使用http模式建立WebSocket服务 +// = 参数: None +// = 返回值: undefined +// = 创建人: Nier +// = 创建时间: 2023-08-30 15:12:57 - +async function httpWebSocket() { + // @ option - Object - 描述:webSocket配置项 + const option = { + // 创建服务器 必须提供 port、server、noServer其中任意一个 否则报错 + port:10001, // 类型:Number 服务器端口号 + host:'10.10.10.10', // 类型:String 服务器ip(主机名) + backlog:50, // 类型:Number 最大等待连接队列的长度 + // server // 类型:http.Server|https.Server 预先创建的http或https的服务器 + // path:'message', // 只接受与此路径匹配的连接。 + // noServer:false, // 类型:Boolean 不启用服务器模式 + //clientTracking // 指定是否跟踪客户端 + maxPayload:4096, // 允许的最大消息大小(以字节为单位),默认为 100 MiB(104857600 字节)。 + } + const wss = new WebSocketServer(option,() => { + console.log(`HTTP WebSocket 已启动: ws://${option.host}:${option.port}`) + }); + wss.on('connection', function connection(ws) { + console.log('Conn') + ws.on('error', console.error); + ws.on('message', function message(data, isBinary) { + wss.clients.forEach(function each(client) { + if (client.readyState === WebSocket.OPEN) { + client.send(data, { binary: isBinary }); + } + }); + }); + ws.onclose = event => { + console.log('Close') + } + }); +} + +// = 函数名: httpsWebSocket +// = 描述: 使用https模式建立WebSocket服务 +// = 参数: None +// = 返回值: undefined +// = 创建人: Nier +// = 创建时间: 2023-08-30 15:13:30 - +function httpsWebSocket() { + const server = createServer({ + cert: readFileSync('/path/to/cert.pem'), + key: readFileSync('/path/to/key.pem') + }); + const wss = new WebSocketServer({ server, port: 10002 }); + + wss.on('connection', function connection(ws) { + ws.on('error', console.error); + + ws.on('message', function message(data) { + console.log('received: %s', data); + }); + + ws.send('something'); + }); +} + + +export { + httpWebSocket, + httpsWebSocket +} diff --git a/09=real-time-communication/package.json b/09=real-time-communication/package.json new file mode 100644 index 0000000..75dcff6 --- /dev/null +++ b/09=real-time-communication/package.json @@ -0,0 +1,18 @@ +{ + "name": "real-time-communication", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start:server": "node Server/app.js", + "start:client": "cd Client && npm run dev" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "ws": "^8.13.0" + } +} diff --git a/09=real-time-communication/pnpm-lock.yaml b/09=real-time-communication/pnpm-lock.yaml new file mode 100644 index 0000000..9600a30 --- /dev/null +++ b/09=real-time-communication/pnpm-lock.yaml @@ -0,0 +1,25 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + ws: + specifier: ^8.13.0 + version: 8.13.0 + +packages: + + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false diff --git a/09=real-time-communication/实时通信方案.md b/09=real-time-communication/实时通信方案.md new file mode 100644 index 0000000..c4bd7d8 --- /dev/null +++ b/09=real-time-communication/实时通信方案.md @@ -0,0 +1,184 @@ +# 实时通信方案 + +- [WebSockets](https://developer.mozilla.org/zh-CN/docs/Web/API/WebSockets_API) +- [Server-sent Event(SSE)](https://developer.mozilla.org/zh-CN/docs/Web/API/Server-sent_events) +- 长链接(服务器端轮询) +- 短链接(客户端轮询) + +> [网页端IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket (baidu.com)](https://baijiahao.baidu.com/s?id=1700709358061982511&wfr=spider&for=pc) + +> [Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE (taodudu.cc)](http://www.taodudu.cc/news/show-614593.html?action=onClick) + +> [详解Web端通信方式的演进:从Ajax、JSONP 到 SSE、Websocket (360doc.com)](http://www.360doc.com/content/22/0525/15/32573_1033094047.shtml) + +## 建设介绍 + +1. 采用工具 + +后端:ws ^8.13.0 + +前端:socket.io ^4.7.2 + +2. demo操作 + +```bash +# 启动server +npm i +npm run start:server + +# 启动客户端 +cd client +npm i +npm run start:client + +# 进入页面输入昵称和ServerIP即可开始聊天 +``` + +## WebSocket + +> WebSocket是客户端和服务器之间的可以双向通信的全双工通信协议。 + +1. 特点 + +(1)建立在 TCP 协议之上,服务器端的实现比较容易。(建立通信时采用http协议) + +(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。 + +(3)数据格式比较轻量,性能开销小,通信高效。 + +(4)可以发送文本,也可以发送二进制数据(blob对象或Arraybuffer对象) + +(5)收到的数据类型 可以使用binaryType 指定, 显式指定收到的二进制数据类型 + +(6)没有同源限制,客户端可以与任意服务器通信。 + +(7)协议标识符是ws(握手http)(如果加密,则为wss(tcp +TLS)),服务器网址就是 URL。 + +2. 使用 + +```js +const socket = new WebSocket(`ws://hostname:port/path`); +socket.onopen = event => { + // 当socket与服务器练级成功时触发 +} +socket.onerror = event =>{ + // 当socket出现错误时触发,包括网络错误,断开连接,服务器错误等 + console.error('Error',event) +} +socket.onclose = event => { + // 当socket断开连接时触发 + // WebSocket没有断线重连机制,如需重连,在此方法内编写重连逻辑 +} +ws.onmessage = event => { + const msg = event.data + // 当接收到服务器发送的消息时触发 + ws.send('消息内容');// 这里可以选择二进制数据发送 +} +``` + +## SSE + +> SSE的本质其实就是一个HTTP的长连接,只不过它给客户端发送的不是一次性的数据包,而是一个stream流,格式为text/event-stream。所以客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。 + +1. 特点 + +1)SSE 使用 HTTP 协议,现有的服务器软件都支持。WebSocket 是一个独立协议。 + +2)SSE 属于轻量级,使用简单;WebSocket 协议相对复杂。 + +3)SSE 默认支持断线重连,WebSocket 需要自己实现。 + +4)SSE 一般只用来传送文本,二进制数据需要编码后传送,WebSocket 默认支持传送二进制数据。 + +5)SSE 支持自定义发送的消息类型。 + +2. 缺点 + +1)客户端无法发送消息,需要通过接口单独请求 + +3. 使用 + +```js +const eventSource = new EventSource('/api/system/msg/connect?id=' + userId, { + headers: { + 'Content-Type': 'text/event-stream', + 'Authorization': 'token' + } +}); +eventSource.addEventListener("open", function (e) { + console.log('open successfully') +}) +/* +* message:后端返回信息,格式可以和后端协商 +*/ +eventSource.addEventListener("message", function (e) { + console.log(e.data) +}) +/* +* error:错误 +*/ +eventSource.addEventListener("error", function (err) { + // console.log(err) + // 类似的返回信息验证,这里是实例 + err && err.status === 401 && console.log('not authorized') +}) +``` + +## 长链接 + +> 客户端和服务端建立连接后不进行断开,之后客户端再次访问这个服务器上的内容时,继续使用这一条连接通道。 + +## 短链接 + +> 客户端和服务端建立连接,发送完数据后立马断开连接。下次要取数据,需要再次建立连接。 +> +> Http长连接和TCP长连接的区别在于: TCP 的长连接需要自己去维护一套心跳策略。而Http只需要在请求头加入keep-alive:true即可实现长连接。 + +## Socket.IO + +> Socket.IO 是一个库,可以在客户端和服务器之间实现低延迟, 双向和基于事件的通信。 + +1. 特点 + +1)它建立在 WebSocket 协议之上,并提供额外的保证,如果无法建立WebSocket连接,连接将回退到HTTP长轮询或自动重新连接。 + +2)自动重新连接 + +3)数据包缓冲。当客户端断开连接时,数据包会自动缓冲,并在重新连接时发送。 + +```js +import { io } from "https://cdn.socket.io/4.3.2/socket.io.esm.min.js"; +const socket = io("http://127.0.0.1:3000") + +socket.on("connect", () => { + //监听连接是否成功 + console.log("链接成功"); +}); +socket.on("disconnect", (reason) => { + //监听连接异常中断 + console.log("中断", reason); +}); + +socket.on("message_event", (data) => { + // "message_event"时后端定义的发送字段 + console.log("接收到的消息", data); +}) + +// 前端主动断开链接 +socket.close() +socket.disconnect() + +socket.on('connect',() => { + // 与服务器连接成功 + console.log('socket链接成功!'+socket.id) +}) +// 其他事件 +// connect:连接成功 +// connecting:正在连接 +// disconnect:断开连接 +// connect_failed:连接失败 +// error:错误发生,并且无法被其他事件类型所处理 +// reconnect_failed:重连失败 +// reconnect:成功重连 +// reconnecting:正在重连 +``` diff --git a/10=paccommand/.gitignore b/10=paccommand/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/10=paccommand/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/10=paccommand/README.md b/10=paccommand/README.md new file mode 100644 index 0000000..d8b5d8a --- /dev/null +++ b/10=paccommand/README.md @@ -0,0 +1,3 @@ +# HotoKiss + +仿照黑客的命令行输入 \ No newline at end of file diff --git a/10=paccommand/app.js b/10=paccommand/app.js new file mode 100644 index 0000000..94089cc --- /dev/null +++ b/10=paccommand/app.js @@ -0,0 +1,44 @@ +const Koa = require('koa') +const app = new Koa() +const views = require('koa-views') +const json = require('koa-json') +const onerror = require('koa-onerror') +const bodyparser = require('koa-bodyparser') +const logger = require('koa-logger') + +const index = require('./routes/index') +const users = require('./routes/users') + +// error handler +onerror(app) + +// middlewares +app.use(bodyparser({ + enableTypes:['json', 'form', 'text'] +})) +app.use(json()) +app.use(logger()) +app.use(require('koa-static')(__dirname + '/public')) + +app.use(views(__dirname + '/views', { + extension: 'ejs' +})) + +// logger +app.use(async (ctx, next) => { + const start = new Date() + await next() + const ms = new Date() - start + console.log(`${ctx.method} ${ctx.url} - ${ms}ms`) +}) + +// routes +app.use(index.routes(), index.allowedMethods()) +app.use(users.routes(), users.allowedMethods()) + +// error-handling +app.on('error', (err, ctx) => { + console.error('server error', err, ctx) +}); + +module.exports = app diff --git a/10=paccommand/bin/www b/10=paccommand/bin/www new file mode 100644 index 0000000..48ef91e --- /dev/null +++ b/10=paccommand/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('demo:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT || '3000'); +// app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app.callback()); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/10=paccommand/package.json b/10=paccommand/package.json new file mode 100644 index 0000000..470da12 --- /dev/null +++ b/10=paccommand/package.json @@ -0,0 +1,27 @@ +{ + "name": "X71291", + "version": "0.1.0", + "private": true, + "scripts": { + "start": "node bin/www", + "dev": ".\\node_modules\\.bin\\nodemon bin\\www", + "prd": "pm2 start bin/www", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "debug": "^4.1.1", + "ejs": "~2.3.3", + "koa": "^2.7.0", + "koa-bodyparser": "^4.2.1", + "koa-convert": "^1.2.0", + "koa-json": "^2.0.2", + "koa-logger": "^3.2.0", + "koa-onerror": "^4.1.0", + "koa-router": "^7.4.0", + "koa-static": "^5.0.0", + "koa-views": "^6.2.0" + }, + "devDependencies": { + "nodemon": "^1.19.1" + } +} \ No newline at end of file diff --git a/10=paccommand/pnpm-lock.yaml b/10=paccommand/pnpm-lock.yaml new file mode 100644 index 0000000..7b81618 --- /dev/null +++ b/10=paccommand/pnpm-lock.yaml @@ -0,0 +1,2354 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + debug: + specifier: ^4.1.1 + version: 4.3.4 + ejs: + specifier: ~2.3.3 + version: 2.3.4 + koa: + specifier: ^2.7.0 + version: 2.14.2 + koa-bodyparser: + specifier: ^4.2.1 + version: 4.4.1 + koa-convert: + specifier: ^1.2.0 + version: 1.2.0 + koa-json: + specifier: ^2.0.2 + version: 2.0.2 + koa-logger: + specifier: ^3.2.0 + version: 3.2.1 + koa-onerror: + specifier: ^4.1.0 + version: 4.2.0 + koa-router: + specifier: ^7.4.0 + version: 7.4.0 + koa-static: + specifier: ^5.0.0 + version: 5.0.0 + koa-views: + specifier: ^6.2.0 + version: 6.3.1(ejs@2.3.4) + +devDependencies: + nodemon: + specifier: ^1.19.1 + version: 1.19.4 + +packages: + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 20.4.1 + dev: true + + /@types/node@20.4.1: + resolution: {integrity: sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==} + dev: true + + /@types/responselike@1.0.0: + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + dependencies: + '@types/node': 20.4.1 + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /ansi-align@2.0.0: + resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} + dependencies: + string-width: 2.1.1 + dev: true + + /ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@2.0.0(supports-color@5.5.0): + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + dependencies: + micromatch: 3.1.10(supports-color@5.5.0) + normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: true + + /assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: true + + /async-each@1.0.6: + resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} + dev: true + + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.0 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /binary-extensions@1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} + dev: true + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + requiresBuild: true + dependencies: + file-uri-to-path: 1.0.0 + dev: true + optional: true + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: false + + /boxen@1.3.0: + resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} + engines: {node: '>=4'} + dependencies: + ansi-align: 2.0.0 + camelcase: 4.1.0 + chalk: 2.4.2 + cli-boxes: 1.0.0 + string-width: 2.1.1 + term-size: 1.2.0 + widest-line: 2.0.1 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /braces@2.3.2(supports-color@5.5.0): + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2(supports-color@5.5.0) + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.0 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.3.2 + dev: false + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: false + + /camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + dev: true + + /capture-stack-trace@1.0.2: + resolution: {integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==} + engines: {node: '>=0.10.0'} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chokidar@2.1.8(supports-color@5.5.0): + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + dependencies: + anymatch: 2.0.0(supports-color@5.5.0) + async-each: 1.0.6 + braces: 2.3.2(supports-color@5.5.0) + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1(supports-color@5.5.0) + upath: 1.2.0 + optionalDependencies: + fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color + dev: true + + /ci-info@1.6.0: + resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} + dev: true + + /class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /cli-boxes@1.0.0: + resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} + engines: {node: '>=0.10.0'} + dev: true + + /co-body@6.1.0: + resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} + dependencies: + inflation: 2.0.0 + qs: 6.11.2 + raw-body: 2.5.2 + type-is: 1.6.18 + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: false + + /component-emitter@1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + dev: false + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: false + + /configstore@3.1.5: + resolution: {integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==} + engines: {node: '>=4'} + dependencies: + dot-prop: 4.2.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + unique-string: 1.0.0 + write-file-atomic: 2.4.3 + xdg-basedir: 3.0.0 + dev: true + + /consolidate@0.15.1(ejs@2.3.4): + resolution: {integrity: sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==} + engines: {node: '>= 0.10.0'} + peerDependencies: + arc-templates: ^0.5.3 + atpl: '>=0.7.6' + babel-core: ^6.26.3 + bracket-template: ^1.1.5 + coffee-script: ^1.12.7 + dot: ^1.1.3 + dust: ^0.3.0 + dustjs-helpers: ^1.7.4 + dustjs-linkedin: ^2.7.5 + eco: ^1.1.0-rc-3 + ect: ^0.5.9 + ejs: ^3.1.5 + haml-coffee: ^1.14.1 + hamlet: ^0.3.3 + hamljs: ^0.6.2 + handlebars: ^4.7.6 + hogan.js: ^3.0.2 + htmling: ^0.0.8 + jade: ^1.11.0 + jazz: ^0.0.18 + jqtpl: ~1.1.0 + just: ^0.1.8 + liquid-node: ^3.0.1 + liquor: ^0.0.5 + lodash: ^4.17.20 + marko: ^3.14.4 + mote: ^0.2.0 + mustache: ^3.0.0 + nunjucks: ^3.2.2 + plates: ~0.4.11 + pug: ^3.0.0 + qejs: ^3.0.5 + ractive: ^1.3.12 + razor-tmpl: ^1.3.1 + react: ^16.13.1 + react-dom: ^16.13.1 + slm: ^2.0.0 + squirrelly: ^5.1.0 + swig: ^1.4.2 + swig-templates: ^2.0.3 + teacup: ^2.0.0 + templayed: '>=0.2.3' + then-jade: '*' + then-pug: '*' + tinyliquid: ^0.2.34 + toffee: ^0.3.6 + twig: ^1.15.2 + twing: ^5.0.2 + underscore: ^1.11.0 + vash: ^0.13.0 + velocityjs: ^2.0.1 + walrus: ^0.10.1 + whiskers: ^0.4.0 + peerDependenciesMeta: + arc-templates: + optional: true + atpl: + optional: true + babel-core: + optional: true + bracket-template: + optional: true + coffee-script: + optional: true + dot: + optional: true + dust: + optional: true + dustjs-helpers: + optional: true + dustjs-linkedin: + optional: true + eco: + optional: true + ect: + optional: true + ejs: + optional: true + haml-coffee: + optional: true + hamlet: + optional: true + hamljs: + optional: true + handlebars: + optional: true + hogan.js: + optional: true + htmling: + optional: true + jade: + optional: true + jazz: + optional: true + jqtpl: + optional: true + just: + optional: true + liquid-node: + optional: true + liquor: + optional: true + lodash: + optional: true + marko: + optional: true + mote: + optional: true + mustache: + optional: true + nunjucks: + optional: true + plates: + optional: true + pug: + optional: true + qejs: + optional: true + ractive: + optional: true + razor-tmpl: + optional: true + react: + optional: true + react-dom: + optional: true + slm: + optional: true + squirrelly: + optional: true + swig: + optional: true + swig-templates: + optional: true + teacup: + optional: true + templayed: + optional: true + then-jade: + optional: true + then-pug: + optional: true + tinyliquid: + optional: true + toffee: + optional: true + twig: + optional: true + twing: + optional: true + underscore: + optional: true + vash: + optional: true + velocityjs: + optional: true + walrus: + optional: true + whiskers: + optional: true + dependencies: + bluebird: 3.7.2 + ejs: 2.3.4 + dev: false + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /cookies@0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: false + + /copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: true + + /copy-to@2.0.1: + resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==} + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /create-error-class@3.0.2: + resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==} + engines: {node: '>=0.10.0'} + dependencies: + capture-stack-trace: 1.0.2 + dev: true + + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /crypto-random-string@1.0.0: + resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} + engines: {node: '>=4'} + dev: true + + /debug@2.6.9(supports-color@5.5.0): + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + supports-color: 5.5.0 + dev: true + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: false + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.6 + dev: true + + /define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + dev: true + + /define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + isobject: 3.0.1 + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /dot-prop@4.2.1: + resolution: {integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==} + engines: {node: '>=4'} + dependencies: + is-obj: 1.0.1 + dev: true + + /duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + dev: true + + /editorconfig@0.15.3: + resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} + hasBin: true + dependencies: + commander: 2.20.3 + lru-cache: 4.1.5 + semver: 5.7.2 + sigmund: 1.0.1 + dev: false + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /ejs@2.3.4: + resolution: {integrity: sha512-Sz9SBmJzRer4QZAAgRDVOl0t6YVJcZUd3ACwaCs7aiIzX/eOd212DqWWRT26Zzu6pMkIKGlBo2iyVHzKnjqrgg==} + engines: {node: '>=0.10.0'} + deprecated: Critical security bugs fixed in 2.5.5 + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /expand-brackets@2.1.4(supports-color@5.5.0): + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9(supports-color@5.5.0) + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2(supports-color@5.5.0) + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + + /extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /extglob@2.0.4(supports-color@5.5.0): + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4(supports-color@5.5.0) + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2(supports-color@5.5.0) + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + requiresBuild: true + dev: true + optional: true + + /fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: false + + /fsevents@1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.17.0 + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: false + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: false + + /get-paths@0.0.7: + resolution: {integrity: sha512-0wdJt7C1XKQxuCgouqd+ZvLJ56FQixKoki9MrFaO4EriqzXOiH9gbukaDE1ou08S8Ns3/yDzoBAISNPqj6e6tA==} + engines: {node: '>=6.4'} + dependencies: + pify: 4.0.1 + dev: false + + /get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + dev: true + + /get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: true + + /glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + dev: true + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: false + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /got@6.7.1: + resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} + engines: {node: '>=4'} + dependencies: + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.0 + create-error-class: 3.0.2 + duplexer3: 0.1.5 + get-stream: 3.0.0 + is-redirect: 1.0.0 + is-retry-allowed: 1.2.0 + is-stream: 1.1.0 + lowercase-keys: 1.0.1 + safe-buffer: 5.2.1 + timed-out: 4.0.1 + unzip-response: 2.0.1 + url-parse-lax: 1.0.0 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: true + + /has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: false + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: false + + /http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: false + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: false + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /humanize-number@0.0.2: + resolution: {integrity: sha512-un3ZAcNQGI7RzaWGZzQDH47HETM4Wrj6z6E4TId8Yeq9w5ZKUVB1nrT2jwFheTUjEmqcgTjXDc959jum+ai1kQ==} + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} + engines: {node: '>=4'} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflation@2.0.0: + resolution: {integrity: sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==} + engines: {node: '>= 0.8.0'} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + /is-accessor-descriptor@0.1.6: + resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-accessor-descriptor@1.0.0: + resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /is-binary-path@1.0.1: + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + engines: {node: '>=0.10.0'} + dependencies: + binary-extensions: 1.13.1 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + /is-ci@1.2.1: + resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} + hasBin: true + dependencies: + ci-info: 1.6.0 + dev: true + + /is-data-descriptor@0.1.4: + resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-data-descriptor@1.0.0: + resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /is-descriptor@0.1.6: + resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 0.1.6 + is-data-descriptor: 0.1.4 + kind-of: 5.1.0 + dev: true + + /is-descriptor@1.0.2: + resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 1.0.0 + is-data-descriptor: 1.0.0 + kind-of: 6.0.3 + dev: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-installed-globally@0.1.0: + resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} + engines: {node: '>=4'} + dependencies: + global-dirs: 0.1.1 + is-path-inside: 1.0.1 + dev: true + + /is-npm@1.0.0: + resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-path-inside@1.0.1: + resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} + engines: {node: '>=0.10.0'} + dependencies: + path-is-inside: 1.0.2 + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-redirect@1.0.0: + resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} + engines: {node: '>=0.10.0'} + dev: true + + /is-retry-allowed@1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + dev: false + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /js-beautify@1.14.8: + resolution: {integrity: sha512-4S7HFeI9YfRvRgKnEweohs0tgJj28InHVIj4Nl8Htf96Y6pHg3+tJrmo4ucAM9f7l4SHbFI3IvFAZ2a1eQPbyg==} + engines: {node: '>=12'} + hasBin: true + dependencies: + config-chain: 1.1.13 + editorconfig: 0.15.3 + glob: 8.1.0 + nopt: 6.0.0 + dev: false + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: false + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: false + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + + /kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /koa-bodyparser@4.4.1: + resolution: {integrity: sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==} + engines: {node: '>=8.0.0'} + dependencies: + co-body: 6.1.0 + copy-to: 2.0.1 + type-is: 1.6.18 + dev: false + + /koa-compose@3.2.1: + resolution: {integrity: sha512-8gen2cvKHIZ35eDEik5WOo8zbVp9t4cP8p4hW4uE55waxolLRexKKrqfCpwhGVppnB40jWeF8bZeTVg99eZgPw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: false + + /koa-convert@1.2.0: + resolution: {integrity: sha512-K9XqjmEDStGX09v3oxR7t5uPRy0jqJdvodHa6wxWTHrTfDq0WUNnYTOOUZN6g8OM8oZQXprQASbiIXG2Ez8ehA==} + engines: {node: '>= 4'} + dependencies: + co: 4.6.0 + koa-compose: 3.2.1 + dev: false + + /koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: false + + /koa-is-json@1.0.0: + resolution: {integrity: sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==} + dev: false + + /koa-json@2.0.2: + resolution: {integrity: sha512-8+dz0T2ekDuNN1svYoKPCV2txotQ3Ufg8Fn5bft1T48MPJWiC/HKmkk+3xj9EC/iNZuFYeLRazN2h2o3RSUXuQ==} + dependencies: + koa-is-json: 1.0.0 + streaming-json-stringify: 3.1.0 + dev: false + + /koa-logger@3.2.1: + resolution: {integrity: sha512-MjlznhLLKy9+kG8nAXKJLM0/ClsQp/Or2vI3a5rbSQmgl8IJBQO0KI5FA70BvW+hqjtxjp49SpH2E7okS6NmHg==} + engines: {node: '>= 7.6.0'} + dependencies: + bytes: 3.1.2 + chalk: 2.4.2 + humanize-number: 0.0.2 + passthrough-counter: 1.0.0 + dev: false + + /koa-onerror@4.2.0: + resolution: {integrity: sha512-D15tp5rxevHqqcvOiEDbtQolG6z3NpBNupz3EUZz43pjYv5SGMom2Xz1FKM8oTya56+aq+hejPW/iBrNnC/UGQ==} + engines: {node: '>= 8.0.0'} + dependencies: + escape-html: 1.0.3 + stream-wormhole: 1.1.0 + dev: false + + /koa-router@7.4.0: + resolution: {integrity: sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==} + engines: {node: '>= 4'} + dependencies: + debug: 3.2.7(supports-color@5.5.0) + http-errors: 1.8.1 + koa-compose: 3.2.1 + methods: 1.1.2 + path-to-regexp: 1.8.0 + urijs: 1.19.11 + transitivePeerDependencies: + - supports-color + dev: false + + /koa-send@5.0.1: + resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} + engines: {node: '>= 8'} + dependencies: + debug: 4.3.4 + http-errors: 1.8.1 + resolve-path: 1.4.0 + transitivePeerDependencies: + - supports-color + dev: false + + /koa-static@5.0.0: + resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} + engines: {node: '>= 7.6.0'} + dependencies: + debug: 3.2.7(supports-color@5.5.0) + koa-send: 5.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /koa-views@6.3.1(ejs@2.3.4): + resolution: {integrity: sha512-weIaPs2cCHWT2qK8qHRmwlZ29xRCvUVy1v/z12AGavVV5j4QIU0W/Y7OVBBu1sTkcO9dDJ25ajGYHGZ/aY43IQ==} + deprecated: This package is deprecated, please use the new fork @ladjs/koa-views. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/koa-views for updates and release changelog + dependencies: + consolidate: 0.15.1(ejs@2.3.4) + debug: 4.3.4 + get-paths: 0.0.7 + koa-send: 5.0.1 + mz: 2.7.0 + pretty: 2.0.0 + transitivePeerDependencies: + - arc-templates + - atpl + - babel-core + - bracket-template + - coffee-script + - dot + - dust + - dustjs-helpers + - dustjs-linkedin + - eco + - ect + - ejs + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jade + - jazz + - jqtpl + - just + - liquid-node + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - pug + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - slm + - squirrelly + - supports-color + - swig + - swig-templates + - teacup + - templayed + - then-jade + - then-pug + - tinyliquid + - toffee + - twig + - twing + - underscore + - vash + - velocityjs + - walrus + - whiskers + dev: false + + /koa@2.14.2: + resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.8.0 + debug: 4.3.4 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /latest-version@3.1.0: + resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} + engines: {node: '>=4'} + dependencies: + package-json: 4.0.1 + dev: true + + /lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + dev: true + + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + /make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + + /micromatch@3.1.10(supports-color@5.5.0): + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2(supports-color@5.5.0) + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4(supports-color@5.5.0) + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13(supports-color@5.5.0) + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2(supports-color@5.5.0) + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nan@2.17.0: + resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + requiresBuild: true + dev: true + optional: true + + /nanomatch@1.2.13(supports-color@5.5.0): + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2(supports-color@5.5.0) + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /nodemon@1.19.4: + resolution: {integrity: sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==} + engines: {node: '>=4'} + hasBin: true + requiresBuild: true + dependencies: + chokidar: 2.1.8(supports-color@5.5.0) + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.2 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + update-notifier: 2.5.0 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: 1.1.0 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false + + /object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: false + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /package-json@4.0.1: + resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} + engines: {node: '>=4'} + dependencies: + got: 6.7.1 + registry-auth-token: 3.4.0 + registry-url: 3.1.0 + semver: 5.7.2 + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: true + + /passthrough-counter@1.0.0: + resolution: {integrity: sha512-Wy8PXTLqPAN0oEgBrlnsXPMww3SYJ44tQ8aVrGAI4h4JZYCS0oYqsPqtPR8OhJpv6qFbpbB7XAn0liKV7EXubA==} + dev: false + + /path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + dev: true + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: false + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: false + + /posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: true + + /prepend-http@1.0.4: + resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} + engines: {node: '>=0.10.0'} + dev: true + + /pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.14.8 + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: false + + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readdirp@2.2.1(supports-color@5.5.0): + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} + dependencies: + graceful-fs: 4.2.11 + micromatch: 3.1.10(supports-color@5.5.0) + readable-stream: 2.3.8 + transitivePeerDependencies: + - supports-color + dev: true + + /regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /registry-auth-token@3.4.0: + resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==} + dependencies: + rc: 1.2.8 + safe-buffer: 5.2.1 + dev: true + + /registry-url@3.1.0: + resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} + engines: {node: '>=0.10.0'} + dependencies: + rc: 1.2.8 + dev: true + + /remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: true + + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true + + /resolve-path@1.4.0: + resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} + engines: {node: '>= 0.8'} + dependencies: + http-errors: 1.6.3 + path-is-absolute: 1.0.1 + dev: false + + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /semver-diff@2.1.0: + resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} + engines: {node: '>=0.10.0'} + dependencies: + semver: 5.7.2 + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + /set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: false + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: false + + /sigmund@1.0.1: + resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon@0.8.2(supports-color@5.5.0): + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9(supports-color@5.5.0) + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: false + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /stream-wormhole@1.1.0: + resolution: {integrity: sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==} + engines: {node: '>=4.0.0'} + dev: false + + /streaming-json-stringify@3.1.0: + resolution: {integrity: sha512-axtfs3BDxAsrZ9swD163FBrXZ8dhJJp6kUI6C97TvUZG9RHKfbg9nFbXqEheFNOb3IYMEt2ag9F62sWLFUZ4ug==} + dependencies: + json-stringify-safe: 5.0.1 + readable-stream: 2.3.8 + dev: false + + /string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: true + + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /term-size@1.2.0: + resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} + engines: {node: '>=4'} + dependencies: + execa: 0.7.0 + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + dev: true + + /to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: false + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /unique-string@1.0.0: + resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} + engines: {node: '>=4'} + dependencies: + crypto-random-string: 1.0.0 + dev: true + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /unzip-response@2.0.1: + resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} + engines: {node: '>=4'} + dev: true + + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: true + + /update-notifier@2.5.0: + resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==} + engines: {node: '>=4'} + dependencies: + boxen: 1.3.0 + chalk: 2.4.2 + configstore: 3.1.5 + import-lazy: 2.1.0 + is-ci: 1.2.1 + is-installed-globally: 0.1.0 + is-npm: 1.0.0 + latest-version: 3.1.0 + semver-diff: 2.1.0 + xdg-basedir: 3.0.0 + dev: true + + /urijs@1.19.11: + resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} + dev: false + + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /url-parse-lax@1.0.0: + resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} + engines: {node: '>=0.10.0'} + dependencies: + prepend-http: 1.0.4 + dev: true + + /use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /widest-line@2.0.1: + resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} + engines: {node: '>=4'} + dependencies: + string-width: 2.1.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /xdg-basedir@3.0.0: + resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} + engines: {node: '>=4'} + dev: true + + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + /ylru@1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + dev: false diff --git a/10=paccommand/public/javascripts/index.js b/10=paccommand/public/javascripts/index.js new file mode 100644 index 0000000..5eb0e22 --- /dev/null +++ b/10=paccommand/public/javascripts/index.js @@ -0,0 +1,151 @@ +window.onload = () => { + const body = document.body; + let username, password + + // 开局提示 + const welcomeElement = document.createElement('div'); + body.append(welcomeElement); + const welcomeText = `Welcome To XY.\nYou Are About To Enter The Top Management Interface.`; + renderText(welcomeText, welcomeElement, () => { + // 询问是否继续 + const askElement = document.createElement('div'); + body.append(askElement); + const askText = 'Can Verify Your Identity Now? (Yes / No):' + renderText(askText, askElement, () => { + // 确认输入 + const answerElement = document.createElement('div'); + body.append(answerElement); + inputText(answerElement, text => { + const answer = text.toLowerCase() + if(answer == 'y' || answer == 'yes'){ + // 用户名提示 + const userText = 'USERNAME: ' + const usernameElement = document.createElement('div'); + const userHeaderElement = document.createElement('span'); + const userBodyElement = document.createElement('span'); + body.append(usernameElement) + usernameElement.append(userHeaderElement) + usernameElement.append(userBodyElement) + renderText(userText, userHeaderElement, () => { + inputText(userBodyElement, usernameText => { + username = usernameText + // 密码提示 + const passwdText = 'PASSWORD: ' + const passwdElement = document.createElement('div'); + const passwdHeaderElement = document.createElement('span'); + const passwdBodyElement = document.createElement('span'); + body.append(passwdElement) + passwdElement.append(passwdHeaderElement) + passwdElement.append(passwdBodyElement) + renderText(passwdText, passwdHeaderElement, () => { + inputText(passwdBodyElement, passwdText => { + password = passwdText + Entry() + }, null, true) + }, 0, 0) + }, null) + }, 0, 0) + }else{ + setTimeout(() => { + window.close() + }, 3000) + console.log('Window On Close in 3000ms!') + return; + } + }, true) + }, 0, 0) + }) +} + +function renderText(text, element, callback, startWait = 2000, endWait= 1000){ + const textElement = document.createElement('span'); + const cursorElement = document.createElement('span'); + cursorElement.classList.add('welecomeTextCursor'); + cursorElement.innerHTML = ' ' + + element.append(textElement, cursorElement) + const max = text.length + let nowLetter = 1 + setTimeout(() => { + const setTextInterval = setInterval(() => { + const spanElement = document.createElement('span'); + const nowText = text[nowLetter - 1] + if(nowText == ' '){ + spanElement.innerHTML = ' ' + }else{ + spanElement.innerText = nowText + } + + spanElement.classList.add('welecomeText'); + textElement.append(spanElement) + if(nowLetter == max){ + clearInterval(setTextInterval) + setTimeout(() => { + cursorElement.remove() + callback() + }, endWait) + }else{ + nowLetter++ + } + }, 30) + }, startWait) + +} + +function inputText(element, callback, letter, passwd){ + const textElement = document.createElement('span'); + const cursorElement = document.createElement('span'); + cursorElement.classList.add('inputTextCursor'); + cursorElement.innerHTML = ' '; + + element.append(textElement, cursorElement) + + const store = { + key: '', + string: '' + } + + document.body.addEventListener('keyup', getKeyWord) + if(!letter){ + letter = 'QWERTYUIOPASDFGHJKLZXCVBNM1234567890*@#&' + 'QWERTYUIOPASDFGHJKLZXCVBNM'.toLowerCase().split('') + }else{ + letter = ['Y','y','E','e','S','s','N','n','O','o'] + } + function getKeyWord(){ + if(letter && letter.includes(event.key)){ + store.key = event.key; + store.string = store.string + event.key + } + if(event.key == 'Backspace'){ + store.string = store.string.slice(0, store.string.length - 1) + } + if(event.key == 'Enter'){ + if(store.string.length==0){ + + }else{ + cursorElement.remove() + callback(store.string) + document.body.removeEventListener('keyup', getKeyWord) + } + } + if(passwd){ + textElement.innerText = new Array(store.string.length).fill('*').join('') + }else{ + textElement.innerText = store.string + } + } +} + + +function Entry(){ + if(true){ + const entryMessageElement = document.createElement('div') + document.body.append(entryMessageElement) + renderText('About To Enter The System!', entryMessageElement, () => { + const loadingElement = document.createElement('div') + loadingElement.classList.add('loading') + document.body.append(loadingElement) + }, 0, 0) + + } +} diff --git a/10=paccommand/public/stylesheets/style.css b/10=paccommand/public/stylesheets/style.css new file mode 100644 index 0000000..661448d --- /dev/null +++ b/10=paccommand/public/stylesheets/style.css @@ -0,0 +1,102 @@ +html, body { + position: relative; + height: 100%; + width: 100%; + overflow: hidden; + margin: 0; + padding: 0; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; + background: #000; + font-family: Consolas, NotoSans; + user-select: none; +} +body{ + padding: 10px; + box-sizing: border-box; +} +span{ + color: #46F372; +} +i{ + color: #46F372; + font-weight: bold; +} +.welecomeText{ + position: relative; + line-height: 1.3em; +} +.welecomeTextCursor{ + position: relative; + background: #46F372; + color: #46F372; + margin-left: 2px; + animation: show-hide-welcome 500ms infinite; +} +.inputTextCursor{ + position: relative; + margin-left: 2px; + border-bottom: 4px solid #46F372; + box-sizing: border-box; + animation: show-hide-answer 500ms infinite; +} + +@keyframes show-hide-welcome { + 0% { + color: #46F372; + background: #46F372; + } + 50%{ + color: #46F372; + background: #46F372; + } + 100% { + color: #46F37200; + background: #46F37200; + } + 70% { + color: #46F37200; + background: #46F37200; + } +} +@keyframes show-hide-answer { + 0% { + border-bottom: 4px solid #46F372; + } + 50%{ + border-bottom: 4px solid #46F372; + } + 100% { + border-bottom: 4px solid #46F37200; + } + 70% { + border-bottom: 4px solid #46F37200; + } +} + +.loading{ + position: absolute; + bottom: 1px; + left: 0; + height: 5px; + width: 100px; + background: #46F372; + animation: loadingSS 1400ms forwards linear; + z-index: 1000; +} + +@keyframes loadingSS { + from{ + width: 0; + } + to{ + width: 100%; + } +} + +.inputHide{ + position: absolute; + height: 0; + width: 0; + top:0; + left: 0; +} \ No newline at end of file diff --git a/10=paccommand/routes/index.js b/10=paccommand/routes/index.js new file mode 100644 index 0000000..07019c1 --- /dev/null +++ b/10=paccommand/routes/index.js @@ -0,0 +1,19 @@ +const router = require('koa-router')() + +router.get('/', async (ctx, next) => { + await ctx.render('index', { + title: 'X71291' + }) +}) + +router.get('/string', async (ctx, next) => { + ctx.body = 'koa2 string' +}) + +router.get('/json', async (ctx, next) => { + ctx.body = { + title: 'koa2 json' + } +}) + +module.exports = router diff --git a/10=paccommand/routes/users.js b/10=paccommand/routes/users.js new file mode 100644 index 0000000..c650166 --- /dev/null +++ b/10=paccommand/routes/users.js @@ -0,0 +1,13 @@ +const router = require('koa-router')() + +router.prefix('/users') + +router.get('/', function (ctx, next) { + ctx.body = 'this is a users response!' +}) + +router.get('/bar', function (ctx, next) { + ctx.body = 'this is a users/bar response' +}) + +module.exports = router diff --git a/10=paccommand/views/error.ejs b/10=paccommand/views/error.ejs new file mode 100644 index 0000000..7cf94ed --- /dev/null +++ b/10=paccommand/views/error.ejs @@ -0,0 +1,3 @@ +

      <%= message %>

      +

      <%= error.status %>

      +
      <%= error.stack %>
      diff --git a/10=paccommand/views/index.ejs b/10=paccommand/views/index.ejs new file mode 100644 index 0000000..325e07f --- /dev/null +++ b/10=paccommand/views/index.ejs @@ -0,0 +1,13 @@ + + + + + + + + <%= title %> + + + + \ No newline at end of file diff --git a/11-01=fastify-template/.gitignore b/11-01=fastify-template/.gitignore new file mode 100644 index 0000000..52962c2 --- /dev/null +++ b/11-01=fastify-template/.gitignore @@ -0,0 +1,58 @@ +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + +# 0x +profile-* + +# mac files +.DS_Store + +# vim swap files +*.swp + +# webstorm +.idea + +# vscode +.vscode +*code-workspace + +# clinic +profile* +*clinic* +*flamegraph* diff --git a/11-01=fastify-template/app.js b/11-01=fastify-template/app.js new file mode 100644 index 0000000..a16d603 --- /dev/null +++ b/11-01=fastify-template/app.js @@ -0,0 +1,75 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: fastify-template +// | @文件描述: app.js - +// | @创建时间: 2023-12-16 18:09 +// | @更新时间: 2023-12-16 18:09 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +const ENV = process.argv[2]?.trim().toLowerCase() || 'production' +const isDev = ENV == 'development' || ENV == 'dev' || ENV == 'develop' +import Fastify from "fastify"; +import logger from "./logger.js"; +import root from "./routes/index.js"; + +const fastify = new Fastify({ + logger: { + base: null, + // timestamp: false, + transport:{ + target: 'pino-pretty', + options: isDev && { + // translateTime: 'HH:MM:ss Z', + ignore: 'pid,hostname', + }, + }, + serializers: { + res (reply) { + // The default + return `statusCode: ${reply.statusCode}` + }, + req (request) { + return request.ip + ':' + request.socket.remotePort + ' ==> ' + request.method.toUpperCase() + ' - ' + request.hostname + request.url; + } + } + } +}); + +fastify.decorate('logger',logger) + +// 请求拦截 +fastify.addHook('onRequest', function (request, reply, done) { + // isDev && (this.logger.debug(`<== ${request.method.toUpperCase()} - ${request.routeOptions.url}`)); + // isDev && (request.startTime = performance.now()); + done(); +}) + +// 响应拦截 +fastify.addHook('onResponse', function (request, reply, done){ + // isDev && (this.logger.debug(`==> ${(performance.now() - request.startTime).toFixed(4)}ms `)) + done(); +}); + +fastify.register(root, {prefix: '/api'}) + +async function start(){ + try { + const a = await fastify.listen({ + port: 3000, + host: '0.0.0.0', + }) + // console.log(fastify.printPlugins()) + console.log(fastify.printRoutes({ commonPrefix: false })); + // console.log(fastify.printRoutes({ method: 'GET' })); + }catch (e) { + console.error('项目启动失败', e) + } +} + + +start() diff --git a/11-01=fastify-template/book/hooks.md b/11-01=fastify-template/book/hooks.md new file mode 100644 index 0000000..9f9cf7d --- /dev/null +++ b/11-01=fastify-template/book/hooks.md @@ -0,0 +1,213 @@ +Fastify 提供了多种钩子(hooks),允许您在不同的生命周期阶段介入服务器的行为。它们在处理请求和响应时非常有用,例如验证请求、日志记录、执行清理或统计任务等。 + +下面是 Fastify 所有的生命周期钩子列表,按照它们在请求生命周期中的执行顺序排列: + +### 应用层面的钩子 + +1. `onRequest(req, reply, done)` + - 在路由解析之前执行(但在请求被解析之后,例如 HTTP 方法、URL 和头部)。 + - 可以用来执行验证、解密等任务。 + +2. `preParsing(req, reply, payload, done)` + - 在解析 HTTP 请求之前执行(例如,解析请求体之前)。 + - 允许您操作原始请求对象和有效载荷。 + +3. `preValidation(req, reply, done)` + - 在执行路由处理程序之前、请求校验之前执行。 + - 适合执行权限校验等任务。 + +4. `preHandler(req, reply, done)` + - 在执行路由处理程序之前执行。 + - 可用于修改请求或回复,或在实际处理程序运行前做准备工作。 + +### 路由层面的钩子 + +在路由声明时,可以指定以下钩子,它们仅在应用于该路由的请求中执行: + +1. `preValidation(req, reply, done)` + - 类似于应用层面的 preValidation 钩子,但只作用于特定路由。 + +2. `preHandler(req, reply, done)` + - 类似于应用层面的 preHandler 钩子,但只作用于特定路由。 + +### 异常处理钩子 + +1. `onError(req, reply, error, done)` + - 当处理程序或钩子抛出异常时执行。 + - 用于自定义错误处理逻辑。 + +### 回复生命周期钩子 + +1. `onSend(req, reply, payload, done)` + - 在将回复发送给客户端之前执行。 + - 可以用来修改回复的有效载荷。 + +2. `onResponse(req, reply, done)` + - 当响应完全发送给客户端后执行。 + - 适用于清理资源或记录日志。 + +### 关闭钩子 + +1. `onClose(instance, done)` + - 在服务器关闭时执行。 + - 通常用于关闭数据库连接、清理资源等。 + +这些钩子都遵循 `fastify` 的 "错误优先回调" 约定,即 `done` 回调函数的第一个参数是一个错误对象,如果有错误的话。如果一切正常,您只需调用 `done()`,没有任何参数或者传入 `null`。 + +要使用这些钩子,通常您会将它们注册为 Fastify 插件,或者直接应用在 Fastify 实例上。例如: + +```javascript +// 注册一个 onRequest 钩子 +fastify.addHook('onRequest', (req, reply, done) => { + // 钩子逻辑 + done(); +}); +``` + +对于路由特定的钩子,您将它们添加到路由声明中,如下所示: + +```javascript +fastify.route({ + method: 'GET', + url: '/', + preHandler: (req, reply, done) => { + // 路由特定的钩子逻辑 + done(); + }, + handler: (req, reply) => { + // 路由处理程序 + reply.send({ hello: 'world' }); + } +}); +``` + +钩子可以是非常强大的工具,它们提供了对 Fastify 应用程序的细粒度控制,允许您优雅地集成自定义逻辑和中间件。 + + + + + + +在 Fastify 中,您可以通过在路由声明中直接添加钩子来将它们作用于特定的路由。当您声明路由时,Fastify 允许您指定 `preValidation`、`preHandler`、`preSerialization`、`onError`、`onSend` 和 `onResponse` 这些生命周期钩子。 + +这里有一个例子,展示了如何给特定路由添加钩子: + +```javascript +fastify.route({ + method: 'GET', + url: '/special', + preHandler: (request, reply, done) => { + // ... 在这个特定路由之前执行一些逻辑 + done(); + }, + handler: (request, reply) => { + // ... 处理路由请求 + reply.send({ hello: 'world' }); + }, + onSend: (request, reply, payload, done) => { + // ... 在回复发送到客户端之前修改回复内容 + done(); + } +}); +``` + +在这个例子中,`preHandler` 钩子函数在处理 GET 请求到 `/special` 路由之前运行,而 `onSend` 钩子在响应发送之前运行,可以用于修改响应 payload。 + +每个钩子函数都会接受不同的参数,根据所执行的任务,这些参数提供了对请求 (`request`)、回复 (`reply`)、有效载载荷 (`payload`) 等的访问权。钩子函数最后需要调用 `done` 函数来通知 Fastify 钩子已完成执行,如果出现错误,可以将错误作为 `done` 函数的第一个参数传递。如果一切顺利,那么只需调用 `done()` 或 `done(null)` 即可。 + +如果您需要在一个特定的路由上应用多个同类型的钩子,您可以传递一个钩子函数的数组: + +```javascript +fastify.route({ + method: 'GET', + url: '/special', + preHandler: [ + (request, reply, done) => { + // 第一个 preHandler 钩子 + done(); + }, + (request, reply, done) => { + // 第二个 preHandler 钩子 + done(); + } + ], + handler: (request, reply) => { + // ...处理路由请求 + reply.send({ hello: 'world' }); + } +}); +``` + +在这个例子中,当请求 `/special` 路由时,将按照数组中的顺序执行两个 `preHandler` 钩子函数。 + +通过将钩子绑定到特定路由上,您可以为每个路由精细地控制流程,并按需集成权限检查、请求数据修改、响应的自定义处理等逻辑。 + + + + + + + + +在 Fastify 中,如果多个路由有部分共同的路径,并且你想对这些具有共同路径的路由应用特定的钩子,你可以使用两种主要方法: + +1. **通过插件和前缀注册钩子**:你可以创建一个插件,为这个插件设置一个路径前缀(路由的共同部分),然后在这个插件内注册全局钩子(这将仅应用于插件范围内的路由)。 + + 以下是使用插件来注册一个钩子的示例: + + ```javascript + const fastify = require('fastify')({ logger: true }); + + // 插件定义 + fastify.register(function (instance, options, done) { + // 这里的钩子将仅作用于 '/api' 前缀路径下的路由 + instance.addHook('preHandler', async (request, reply) => { + // ... 在该插件下所有路由的处理器之前执行逻辑 + }); + + instance.get('/feature1', async (request, reply) => { + // ... 处理该路由的请求 + return { feature: '1' }; + }); + + instance.get('/feature2', async (request, reply) => { + // ... 处理该路由的请求 + return { feature: '2' }; + }); + + done(); + }, { prefix: '/api' }); + + // 启动服务器 + fastify.listen(3000, err => { + if (err) throw err; + console.log(`Server listening on ${fastify.server.address().port}`); + }); + ``` + + 在这个例子中,所有前缀为 `/api` 的路由都将执行在 `addHook` 中定义的 `preHandler` 钩子。 + +2. **条件性地在钩子中检查路由路径**:你还可以在一个全局钩子中检查请求的路径,根据请求的路由路径来做出条件性的反应,这种方法没有上面那种结构化,但在某些情况下可能有用。 + + 以下是使用条件性钩子的示例: + + ```javascript + // 全局钩子 + fastify.addHook('preHandler', async (request, reply) => { + // 查看请求路径是否匹配特定模式 + if (request.raw.url.startsWith('/api')) { + // ... 在所有 '/api' 路径下的路由之前执行逻辑 + } + }); + + // 非`/api`前缀的路由 + fastify.get('/other', async (request, reply) => { + // 这个路由不会受到上述全局钩子影响 + // 除非在上面的条件检查中同时包括此路径 + return { hello: 'world' }; + }); + ``` + + 在这个例子中,全局 `preHandler` 钩子对所有路由生效,但是它内部检查请求的 URL 是不是以 `/api` 开头,仅对符合该条件的路径执行额外的逻辑。 + +通常,对于维护性和可读性而言,使用插件和前缀注册钩子的方法更为推荐,因为它将相关的路由和钩子逻辑组织在一起,并避免了全局状态的潜在冲突。 diff --git a/11-01=fastify-template/book/register.md b/11-01=fastify-template/book/register.md new file mode 100644 index 0000000..3642b12 --- /dev/null +++ b/11-01=fastify-template/book/register.md @@ -0,0 +1,51 @@ +在 Fastify 中, `register` 函数用于注册插件。插件可以是一组封装的路由、服务、插件或者是装饰器等。使用 `register` 可以为应用添加新的功能或改变其默认行为。`register` 函数接受两个参数:插件本身及一个可选的选项对象。 + +### 1. 插件 (Plugin) + +第一个参数是插件本身,它可以是一个异步函数,该函数接受三个参数: +- `fastify` 实例:当前服务器实例的引用。 +- `options`:传递给插件的选项对象。 +- `done`:一个回调函数,用于声明插件的注册完成。 + +### 2. 选项 (Options) + +第二个参数是一个可选的选项对象,用于提供给插件额外的配置。 + +一个 `register` 调用的基本结构如下: + +```javascript +fastify.register( + plugin, // 插件函数 + options // 可选的配置对象 +); +``` + +`options` 对象可以含有以下属性: + +- `prefix`:一个字符串值,为插件内所有路由添加前缀,很有用当你需要版本化 API 或者有多个相似的路由集合。 +- 其他自定义属性:这些属性将传递给插件函数内的 `options` 参数,可以根据插件的需求来设定。不同的插件可能需要不同的选项。 + +### 示例: + +```javascript +fastify.register( + require('fastify-plugin'), + { prefix: '/api/v1' } // 为这个插件下的所有路由设置前缀 +); + +// 或者使用 async/await 语法 +fastify.register(async (instance, opts) => { + instance.get('/route', async (request, reply) => { + return { hello: 'world' }; + }); +}, { prefix: '/api/v1' }); +``` + +在第二个例子中,我们定义了一个匿名插件函数并将其注册到 Fastify 实例中,并通过 `options` 对象设置了一个 `prefix`。这意味着,插件内部定义的所有路由都将自动添加 `/api/v1` 作为路径前缀。 + +### 注意: + +- `fastify-plugin`:这是一个可以保证插件注册的声明周期钩子和装饰器在父作用域中也同样可见的工具,通常用于那些需要全局可访问的插件。 +- 插件隔离:Fastify 实例是通过原型链继承创建的,这表示每个插件拥有自己的封装作用域。插件内的装饰器、钩子等,不会影响到其他插件或主应用,除非使用了 `fastify-plugin`。 + +参考 [Fastify 插件文档](https://www.fastify.io/docs/latest/Reference/Plugins/) 可以提供更详细的信息和高级配置选项。 diff --git a/11-01=fastify-template/book/router.md b/11-01=fastify-template/book/router.md new file mode 100644 index 0000000..9c3be1c --- /dev/null +++ b/11-01=fastify-template/book/router.md @@ -0,0 +1,238 @@ +在Fastify中,可以通过路由拆分来组织和维护大型应用的代码。路由拆分通常意味着你将相关的路由处理函数放到单独的文件或模块中,并在应用中相应地注册它们。下面是如何做到路由拆分的一般步骤: + +1. 创建一个路由文件或模块。 +2. 在该文件中定义路由。 +3. 导出这些路由。 +4. 在你的主应用文件中注册这些路由。 + +### 例子:创建和使用路由模块 + +以下给出一个非常基础的例子来演示如何拆分路由。 + +#### user-routes.js +```javascript +// user-routes.js +async function routes(fastify, options) { + fastify.get('/users', async (request, reply) => { + // 处理获取用户的逻辑... + return { users: [] }; + }); + + fastify.get('/users/:id', async (request, reply) => { + // 处理获取单个用户的逻辑... + const { id } = request.params; + return { user: id }; + }); +} + +module.exports = routes; +``` + +#### item-routes.js +```javascript +// item-routes.js +async function routes(fastify, options) { + fastify.get('/items', async (request, reply) => { + // 处理获取物品的逻辑... + return { items: [] }; + }); + + fastify.get('/items/:id', async (request, reply) => { + // 处理获取单个物品的逻辑... + const { id } = request.params; + return { item: id }; + }); +} + +module.exports = routes; +``` + +#### 主应用文件(比如app.js或server.js) +```javascript +// app.js +const fastify = require('fastify')({ logger: true }); + +// 注册路由模块 +fastify.register(require('./user-routes')); +fastify.register(require('./item-routes')); + +// 启动服务器 +fastify.listen({ port: 3000, host: '0.0.0.0' }, (err, address) => { + if (err) { + fastify.log.error(err); + process.exit(1); + } + console.log(`Server listening on ${address}`); +}); +``` + +在这个例子中,我们有两个路由模块(`user-routes.js` 和 `item-routes.js`),它们被导入到主应用文件 `app.js` 中,使用 `fastify.register` 方法来注册。每个路由文件处理特定路径的请求,并有自己的路由处理函数。这种方式使得代码结构更清晰,并且容易维护,特别是当应用程序规模变大时。 + +为了更好的代码组织,你甚至可以进一步把路由处理函数分离到独立的控制器文件中。但以上示例提供了一个如何开始拆分路由的基础结构。 + + + + +*** + + +如果你想进一步组织你的代码,尤其是对于大型应用程序,以下是一些可以考虑的额外步骤: + +### 1. 分离控制器 + +可以创建一个控制器目录,用于存放处理路由逻辑的函数。这能让你的路由定义更加简洁,因为控制器将包含大部分业务逻辑。 + +**controllers/userController.js** +```javascript +async function getUsers(request, reply) { + // 处理逻辑... + return { users: [] }; +} + +async function getUserById(request, reply) { + const { id } = request.params; + // 处理逻辑... + return { user: id }; +} + +module.exports = { + getUsers, + getUserById, +}; +``` + +然后,在路由文件中,你可以导入并使用这些控制器函数: + +**routes/user-routes.js** +```javascript +const userController = require('../controllers/userController'); + +async function routes(fastify, options) { + fastify.get('/users', userController.getUsers); + fastify.get('/users/:id', userController.getUserById); +} + +module.exports = routes; +``` + +### 2. 路由前缀 + +当注册路由时,可以为一组路由指定一个公共前缀。Fastify 允许你在注册插件时提供一个 `prefix` 选项,该选项会应用于该插件中定义的所有路由。 + +```javascript +fastify.register(require('./user-routes'), { prefix: '/users' }); +fastify.register(require('./item-routes'), { prefix: '/items' }); +``` + +这将相应地更改 `user-routes.js` 和 `item-routes.js` 中的路径定义,因为你不再需要在每个路由路径中包含 `/users` 或 `/items`。 + +### 3. 插件化 + +为了进一步的模块化,可以将某些功能片段封装为插件。Fastify 天然支持插件架构,以便于封装和共享代码。例如,可以创建一个为特定资源服务的插件,将路由处理和相关功能封装在内。 + +**plugins/users.js** +```javascript +const userRoutes = require('../routes/user-routes'); + +async function usersPlugin(fastify, options) { + fastify.decorate('someUtility', () => {/* ... */}); + fastify.register(userRoutes); +} + +module.exports = usersPlugin; +``` + +注册插件: + +**app.js** +```javascript +fastify.register(require('./plugins/users'), { prefix: '/users' }); +``` + +### 4. 结构化错误处理和验证 + +Fastify 提供了丰富的钩子(hooks)和插件来处理错误和验证请求。你可以创建共享的钩子和模式,在你的应用中使用它们,以保持代码的一致性和减少重复。 + +### 5. 使用 `fastify-cli` 工具 + +Fastify 社区还提供了 `fastify-cli` 命令行工具,用于快速地搭建和管理 Fastify 项目。它可以自动为你生成项目结构,包括路由、插件和其他配置,从而让你更容易地按照最佳实践组织代码。 + +通过使用上述步骤,你将能够创建一个更加模块化、易于维护和可扩展的 Fastify 应用程序。 + + +*** + + +在 Fastify 中,可以使用钩子(Hooks)来执行拦截和验证操作。钩子可以在请求的生命周期的不同阶段被触发,例如在请求被路由之前(`onRequest`)、在执行路由处理函数之前(`preValidation`、`preHandler`)、在发送响应之前(`onSend`)等等。 + +若要针对不同的路由模块执行不同的拦截验证,你可以在每个路由模块中分别声明这些钩子。这样,只有当请求达到特定模块的路由时,相应的钩子才会被触发。以下是如何为不同的路由模块添加特定逻辑的示例: + +### 创建一个带有 onRequest 钩子的路由模块 + +```javascript +// routes/user-routes.js +module.exports = async function (fastify, options) { + // 在 '/users' 路径及其子路径上应用 onRequest 钩子 + fastify.addHook('onRequest', async (request, reply) => { + // 添加一些用户身份验证逻辑 + if (!request.headers['auth-token']) { + throw new Error('Missing auth token!'); + } + // 检查 auth-token 是否有效... + }); + + // 用户路由 + fastify.get('/users', async (request, reply) => { + // 返回用户列表 + }); + + fastify.get('/users/:id', async (request, reply) => { + // 返回单个用户 + }); +}; +``` + +### 创建另一个带有 preHandler 钩子的路由模块 + +```javascript +// routes/item-routes.js +module.exports = async function (fastify, options) { + // 在 '/items' 路径及其子路径上应用 preHandler 钩子 + fastify.addHook('preHandler', async (request, reply) => { + // 添加一些权限检查逻辑 + const userRole = request.user.role; // 假设我们已经在earlier hook中设置了用户 + if (userRole !== 'admin') { + throw new Error('Unauthorized!'); + } + // 执行其它必要的权限检查... + }); + + // 物品路由 + fastify.get('/items', async (request, reply) => { + // 返回物品列表 + }); + + fastify.get('/items/:id', async (request, reply) => { + // 返回单个物品详情 + }); +}; +``` + +在主应用文件中,你需要注册上述路由模块: + +```javascript +// app.js +const fastify = require('fastify')(); + +// 注册用户路由模块,'onRequest' 钩子将适用于此路由及其子路由 +fastify.register(require('./routes/user-routes'), { prefix: '/users' }); + +// 注册物品路由模块,'preHandler' 钩子将适用于此路由及其子路由 +fastify.register(require('./routes/item-routes'), { prefix: '/items' }); + +// 运行服务器... +``` + +在这个例子中,用户相关的路由会检查请求头中是否包含 `auth-token`,而物品相关的路由则会在路由处理之前检查用户的角色。这种方式能够让你按模块进行细粒度的拦截和验证控制,同时保持代码的整洁和模块化。 + +值得注意的是,钩子内部抛出的错误将被 Fastify 捕获,并作为 HTTP 错误被发送给客户端。这样,你可以根据需要定制错误响应。此外,Fastify 还允许你通过 `fastify.decorateRequest` 和 `fastify.decorateReply` 方法给 `request` 和 `reply` 对象添加自定义属性和方法,进一步增强拦截和验证的能力。 diff --git a/11-01=fastify-template/logger.js b/11-01=fastify-template/logger.js new file mode 100644 index 0000000..cddd302 --- /dev/null +++ b/11-01=fastify-template/logger.js @@ -0,0 +1,91 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: fastify-template +// | @文件描述: pino.js - +// | @创建时间: 2023-12-16 18:25 +// | @更新时间: 2023-12-16 18:25 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Pino from 'pino' +import pretty from 'pino-pretty' +import fs from 'fs' +import rfs from 'rotating-file-stream' + + +// 目录用于存放日志文件 +const logDirectory = 'logs'; +fs.existsSync(logDirectory) || fs.mkdirSync(logDirectory); + +const debugStream = rfs.createStream('debug.log', { + interval: '1d', // 滚动时间 60s,1m,1h,1d,1w + path: logDirectory + '/debug', + size: '10M', // 用于指定单个日志文件的最大大小,如果该值超过限制,将自动创建一个新文件。如果未指定此项,则文件不会被分割。 B K M G + rotate: 7, // 保留日志文件的最大数量 + // compress: 'gzip', +}); +const warnStream = rfs.createStream('warn.log', { + interval: '1d', // 滚动时间 60s,1m,1h,1d,1w + path: logDirectory + '/warn', + size: '10M', // 用于指定单个日志文件的最大大小,如果该值超过限制,将自动创建一个新文件。如果未指定此项,则文件不会被分割。 B K M G + rotate: 7, // 保留日志文件的最大数量 + // compress: 'gzip', +}); + +const streams = [ + // {stream: fs.createWriteStream('logs/info.stream.out')}, + {level: 'trace', stream: process.stdout }, + {level: 'debug', stream: debugStream}, + {level: 'warn', stream: warnStream} +] + + + +const logger = new Pino({ + // name: 'pino', // 记录器的名称。当设置时,会向记录的每个JSON行添加一个 name 字段。 | Default: undefined | name (String) + level: 'trace', // 最低日志记录等级 默认值Info | Default: 'info' | level (String) + // customLevels: { + // foo: 35 + // }, // 自定义日志记录等级 | Default: undefined | customLevels (Object) + useOnlyCustomLevels: false, // 是否只使用自定义日志等级 | Default: false | useOnlyCustomLevels (Boolean) + depthLimit: 5, // 嵌套对象的深度 | Default: 5 | depthLimit (Number) + edgeLimit: 100, // * 看不懂 在使用循环引用记录特定对象/数组时限制属性/元素字符串化的选项。 | Default: 100 | edgeLimit (Number) + // msgPrefix: 'ACE', // 消息前缀 | Default: undefined | msgPrefix (String) + base: { + // A: '大王' + },// 基础消息 + formatters: { + level: (label) => { + return { + level: label.toUpperCase().padEnd(5, ' ') + } + } + }, + enabled: true, // 启用日志 | Default: true | enabled (Boolean) + crlf: false,// 设置为 true 以使用 \r\n 而不是 \n 记录换行分隔的JSON。 | Default: false | crlf (Boolean) + timestamp: () => `,"time":"${new Date(Date.now()).toISOString()}"`, // 启用或禁用在日志消息中包含时间戳。如果提供了一个函数,它必须同步返回时间的部分JSON字符串表示,例如 ,"time":1493426328206 (这是默认值)。 | Default: true | timestamp (Boolean | Function) + messageKey: 'MSG', // JSON对象中“message”的字符串键。 | Default: 'msg' | messageKey (String) + errorKey: 'ERROR', // JSON对象中“error”的字符串键。 | Default: 'err' | errorKey (String) + nestedKey: null, // 冲突字段的Key。 | Default: null | nestedKey (String) +}, Pino.multistream(streams, { + // levels: { + // silent: Infinity, + // fatal: 60, + // error: 50, + // warn: 50, + // info: 30, + // debug: 20, + // trace: 10 + // }, // 将自定义日志级别定义作为对象传递给实例。 + // dedupe: true, // 设置为 true ,只向级别更高的流发送日志。默认值: false +})) +// +// logger.info('AAAA') +// logger.trace('C') +// logger.debug('B') + +export default logger diff --git a/11-01=fastify-template/package.json b/11-01=fastify-template/package.json new file mode 100644 index 0000000..986724a --- /dev/null +++ b/11-01=fastify-template/package.json @@ -0,0 +1,21 @@ +{ + "name": "fastify-template", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node app.js development", + "server": "node app.js production" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "fastify": "^4.25.1", + "pino": "^8.17.1", + "pino-pretty": "^10.3.0", + "rotating-file-stream": "^3.1.1" + } +} diff --git a/11-01=fastify-template/pnpm-lock.yaml b/11-01=fastify-template/pnpm-lock.yaml new file mode 100644 index 0000000..2bc62e3 --- /dev/null +++ b/11-01=fastify-template/pnpm-lock.yaml @@ -0,0 +1,500 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + fastify: + specifier: ^4.25.1 + version: 4.25.1 + pino: + specifier: ^8.17.1 + version: 8.17.1 + pino-pretty: + specifier: ^10.3.0 + version: 10.3.0 + rotating-file-stream: + specifier: ^3.1.1 + version: 3.1.1 + +packages: + + /@fastify/ajv-compiler@3.5.0: + resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + fast-uri: 2.3.0 + dev: false + + /@fastify/deepmerge@1.3.0: + resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} + dev: false + + /@fastify/error@3.4.1: + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + dev: false + + /@fastify/fast-json-stringify-compiler@4.3.0: + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + dependencies: + fast-json-stringify: 5.9.1 + dev: false + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + + /abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + dev: false + + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: false + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: false + + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: false + + /avvio@8.2.1: + resolution: {integrity: sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==} + dependencies: + archy: 1.0.0 + debug: 4.3.4 + fastq: 1.15.0 + transitivePeerDependencies: + - supports-color + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + + /dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + dev: false + + /fast-copy@3.0.1: + resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + dev: false + + /fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false + + /fast-json-stringify@5.9.1: + resolution: {integrity: sha512-NMrf+uU9UJnTzfxaumMDXK1NWqtPCfGoM9DYIE+ESlaTQqjlANFBy0VAbsm6FB88Mx0nceyi18zTo5kIEUlzxg==} + dependencies: + '@fastify/deepmerge': 1.3.0 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + fast-deep-equal: 3.1.3 + fast-uri: 2.3.0 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.3.0 + dev: false + + /fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + dependencies: + fast-decode-uri-component: 1.0.1 + dev: false + + /fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + dev: false + + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: false + + /fast-uri@2.3.0: + resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==} + dev: false + + /fastify@4.25.1: + resolution: {integrity: sha512-D8d0rv61TwqoAS7lom2tvIlgVMlx88lLsiwXyWNjA7CU/LC/mx/Gp2WAlC0S/ABq19U+y/aRvYFG5xLUu2aMrg==} + dependencies: + '@fastify/ajv-compiler': 3.5.0 + '@fastify/error': 3.4.1 + '@fastify/fast-json-stringify-compiler': 4.3.0 + abstract-logging: 2.0.1 + avvio: 8.2.1 + fast-content-type-parse: 1.1.0 + fast-json-stringify: 5.9.1 + find-my-way: 7.7.0 + light-my-request: 5.11.0 + pino: 8.17.1 + process-warning: 3.0.0 + proxy-addr: 2.0.7 + rfdc: 1.3.0 + secure-json-parse: 2.7.0 + semver: 7.5.4 + toad-cache: 3.4.1 + transitivePeerDependencies: + - supports-color + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: false + + /find-my-way@7.7.0: + resolution: {integrity: sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==} + engines: {node: '>=14'} + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 2.0.0 + dev: false + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: false + + /help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false + + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: false + + /json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + dependencies: + fast-deep-equal: 3.1.3 + dev: false + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /light-my-request@5.11.0: + resolution: {integrity: sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==} + dependencies: + cookie: 0.5.0 + process-warning: 2.3.2 + set-cookie-parser: 2.6.0 + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + dependencies: + readable-stream: 4.4.2 + split2: 4.2.0 + dev: false + + /pino-pretty@10.3.0: + resolution: {integrity: sha512-JthvQW289q3454mhM3/38wFYGWPiBMR28T3CpDNABzoTQOje9UKS7XCJQSnjWF9LQGQkGd8D7h0oq+qwiM3jFA==} + hasBin: true + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.1 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.1.0 + pump: 3.0.0 + readable-stream: 4.4.2 + secure-json-parse: 2.7.0 + sonic-boom: 3.7.0 + strip-json-comments: 3.1.1 + dev: false + + /pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + dev: false + + /pino@8.17.1: + resolution: {integrity: sha512-YoN7/NJgnsJ+fkADZqjhRt96iepWBndQHeClmSBH0sQWCb8zGD74t00SK4eOtKFi/f8TUmQnfmgglEhd2kI1RQ==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.3.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.1.0 + pino-std-serializers: 6.2.2 + process-warning: 2.3.2 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.7.0 + thread-stream: 2.4.1 + dev: false + + /process-warning@2.3.2: + resolution: {integrity: sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==} + dev: false + + /process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + dev: false + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: false + + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: false + + /readable-stream@4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: false + + /real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + dev: false + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /ret@0.2.2: + resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} + engines: {node: '>=4'} + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: false + + /rotating-file-stream@3.1.1: + resolution: {integrity: sha512-PNF1iDkxcZG+T87uUzLlcO4aquTCyY8yl+Q/OTK4dMwhwWDYWU4ZATYeIXHmYVGIzqZ2MrpY4WIkYc9Bsc3Nzw==} + engines: {node: '>=14.0'} + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safe-regex2@2.0.0: + resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} + dependencies: + ret: 0.2.2 + dev: false + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + + /secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + dev: false + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + dev: false + + /sonic-boom@3.7.0: + resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} + dependencies: + atomic-sleep: 1.0.0 + dev: false + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: false + + /thread-stream@2.4.1: + resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} + dependencies: + real-require: 0.2.0 + dev: false + + /toad-cache@3.4.1: + resolution: {integrity: sha512-T0m3MxP3wcqW0LaV3dF1mHBU294sgYSm4FOpa5eEJaYO7PqJZBOjZEQI1y4YaKNnih1FXCEYTWDS9osCoTUefg==} + engines: {node: '>=12'} + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false diff --git a/11-01=fastify-template/routes/index.js b/11-01=fastify-template/routes/index.js new file mode 100644 index 0000000..37fb933 --- /dev/null +++ b/11-01=fastify-template/routes/index.js @@ -0,0 +1,32 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: fastify-template +// | @文件描述: index.js - +// | @创建时间: 2023-12-16 22:41 +// | @更新时间: 2023-12-16 22:41 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import user from "./user/index.js"; +export default function root(fastify, options, done){ + + fastify.decorate('a', 'xsaxsa') + fastify.get('/', function (request, reply){ + console.log(this.a) + return {root: true} + }) + + fastify.get('/getName', function (request, reply){ + return {root: true} + }) + + fastify.register(user, { + prefix: 'user' + }) + + done() +} diff --git a/11-01=fastify-template/routes/user/index.js b/11-01=fastify-template/routes/user/index.js new file mode 100644 index 0000000..e8ae5d3 --- /dev/null +++ b/11-01=fastify-template/routes/user/index.js @@ -0,0 +1,24 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: fastify-template +// | @文件描述: index.js - +// | @创建时间: 2023-12-16 22:52 +// | @更新时间: 2023-12-16 22:52 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +export default function (fastify, options, done){ + fastify.get('/',function (request, reply){ + console.log(this.a) + return '/api/user' + }) + fastify.get('/getName',function (request, reply){ + return '/api/user/getName' + }) + + + done() +} diff --git a/11=initkoa/.eslintrc.cjs b/11=initkoa/.eslintrc.cjs new file mode 100644 index 0000000..ce0bb13 --- /dev/null +++ b/11=initkoa/.eslintrc.cjs @@ -0,0 +1,65 @@ +module.exports = { + "env": { + "browser": true, + "es2021": true, + "es2022": true, + "es2023": true, + }, + "extends": ["eslint:recommended"], + "overrides": [ + { + "env": { + "node": true + }, + "files": [ + ".eslintrc.{js,cjs}" + ], + "parserOptions": { + "sourceType": "script" + } + } + ], + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + indent: ['error', 4, { "SwitchCase": 1 }], // 用于指定代码缩进的方式,这里配置为使用四个空格进行缩进。 + // 'linebreak-style': [0, 'error', 'windows'], // 用于指定换行符的风格,这里配置为使用 Windows 风格的换行符(\r\n)。 + quotes: ['error', 'single'], // 用于指定字符串的引号风格,这里配置为使用单引号作为字符串的引号。 + semi: ['error', 'always'], //用于指定是否需要在语句末尾添加分号,这里配置为必须始终添加分号。 + "no-console": 2,//禁止使用console + "no-const-assign": 2,//禁止修改const声明的变量 + "no-empty": 2,//块语句中的内容不能为空 + "no-extra-parens": 2,//禁止非必要的括号 + "no-extra-semi": 2,//禁止多余的冒号 + "no-fallthrough": 1,//禁止switch穿透 + "no-func-assign": 2,//禁止重复的函数声明 + "no-inline-comments": 2,//禁止行内备注 + "no-irregular-whitespace": 2,//不能有不规则的空格 + "no-mixed-spaces-and-tabs": [2, false],//禁止混用tab和空格 + "no-multi-spaces": 1,//不能用多余的空格 + "no-multiple-empty-lines": [1, {"max": 2}],//空行最多不能超过2行 + "no-nested-ternary": 0,//禁止使用嵌套的三目运算 + "no-redeclare": 2,//禁止重复声明变量 + "no-shadow": 2,//外部作用域中的变量不能与它所包含的作用域中的变量或参数同名 + "no-trailing-spaces": 2,//一行结束后面不要有空格 + "no-unexpected-multiline": 2,//避免多行表达式 + "no-unused-vars": [2, {"vars": "all", "args": "after-used"}],//不能有声明后未被使用的变量或参数 + "no-use-before-define": 2,//未定义前不能使用 + "no-var": 2,//禁用var,用let和const代替 + "arrow-parens": 0,//箭头函数用小括号括起来 + "array-bracket-spacing": [2, "never"],//是否允许非空数组里面有多余的空格 + "camelcase": 2,//强制驼峰法命名 + "comma-style": [2, "last"],//逗号风格,换行时在行首还是行尾 + "comma-spacing": ["error", {"before": false, "after": true}],//对象字面量中冒号的前后空格 + "key-spacing": ["error", { "beforeColon": false, "afterColon": true }],// 冒号后面有空格 + "lines-around-comment": 0,//行前/行后备注 + "array-bracket-spacing": ["error", "always"],// 检查数组字面量中的元素之间的空格。 + }, + "globals": { + global: true, + Buffer: true, + process: true + } +} diff --git a/11=initkoa/.gitignore b/11=initkoa/.gitignore new file mode 100644 index 0000000..d6fd664 --- /dev/null +++ b/11=initkoa/.gitignore @@ -0,0 +1,131 @@ +# ---> Node +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* \ No newline at end of file diff --git a/11=initkoa/.prettierrc.json b/11=initkoa/.prettierrc.json new file mode 100644 index 0000000..f4f39af --- /dev/null +++ b/11=initkoa/.prettierrc.json @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "tabWidth": 4 +} diff --git a/11=initkoa/README.md b/11=initkoa/README.md new file mode 100644 index 0000000..bff335f --- /dev/null +++ b/11=initkoa/README.md @@ -0,0 +1,9 @@ +# HotoKiss + +koa的初始化模板 + +后端: + +1. AJV参数验证 +2. winston日志 +3. koa的学习 diff --git a/11=initkoa/bootstrap.js b/11=initkoa/bootstrap.js new file mode 100644 index 0000000..bffe073 --- /dev/null +++ b/11=initkoa/bootstrap.js @@ -0,0 +1,83 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: bootstrap.js - Koa项目启动文件 +// | @创建时间: 2023-11-25 21:17 +// | @更新时间: 2023-11-25 21:17 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import devConfig from '#root/development.env.js'; +import prodConfig from '#root/production.env.js'; +import startApp from '#home/app.js'; +import winston from "winston"; +import {logger, colorizer} from "#common/logger/index.js"; +// | 获取ENV +const ENV = process.env.NODE_ENV && process.env.NODE_ENV.toLowerCase().trim(); + +if (ENV === 'development' || ENV === undefined) { + global.config = devConfig; + logger.add(new winston.transports.Console({ + format:winston.format.combine( + winston.format.printf( + (i) => { + return colorizer.colorize( + i.level, + i.message + ); + }, + ), + ) + })) +} else if (ENV === 'production') { + global.config = prodConfig; +} else { + throw new Error(`未识别的环境变量${ENV}`); +} +global.logger = logger +global.ENV = ENV; + +// = 函数名: checkPort +// = 描述: 检测服务端口是否正常 +// = 参数: None +// = 返回值: undefined +// = 创建人: nie +// = 创建时间: 2023-11-25 21:49:22 - +function checkPort() { + if ( + typeof global.config.port !== 'number' || + global.config.port > 65536 || + global.config.port < 3000 + ) { + throw new Error(`服务监听端口不合法:${global.config.port}`); + } +} +checkPort(); + +// = 函数名: checkAppName +// = 描述: 检测服务名是否正常 +// = 参数: None +// = 返回值: undefined +// = 创建人: nie +// = 创建时间: 2023-11-25 21:51:03 - +function checkAppName() { + if (!global.config.appName) { + throw new Error(`服务名不存在:${global.config.appName}`); + } +} +checkAppName() +process.stdout.write('\u001b[2J\u001b[0;0H'); +try { + const app = startApp(); + app.listen(global.config.port); + console.log( + `Web服务 ${global.config.appName} 启动成功,访问: http://127.0.0.1:${global.config.port}`, + ); + logger.info( `Web服务 ${global.config.appName} 启动成功,访问: http://127.0.0.1:${global.config.port}`) +} catch (e) { + console.error(e); + throw new Error(`Web服务启动失败`); +} diff --git a/11=initkoa/development.env.js b/11=initkoa/development.env.js new file mode 100644 index 0000000..dca18da --- /dev/null +++ b/11=initkoa/development.env.js @@ -0,0 +1,22 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: development.env.js - +// | @创建时间: 2023-11-25 21:36 +// | @更新时间: 2023-11-25 21:36 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import prodConfig from "#root/production.env.js"; + +const config = { + port: 3000, +} + +const devConfig = {...prodConfig, ...config} + +export default devConfig diff --git a/11=initkoa/package.json b/11=initkoa/package.json new file mode 100644 index 0000000..8566f43 --- /dev/null +++ b/11=initkoa/package.json @@ -0,0 +1,48 @@ +{ + "name": "initkoa", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "app.js", + "imports": { + "#root/*": "./*", + "#home/*": "./src/*", + "#routes/*": "./src/routes/*", + "#common/*": "./src/common/*", + "#config": "./config/config.js", + "#task/*": "./src/task/*", + "#workers/*": "./src/workers/*", + "#protocol/*": "./src/protocol/*", + "#processes/*": "./src/processes/*" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "format": "prettier --write \"src/**/*.js\"", + "start": "cross-env NODE_ENV=production node bootstrap.js", + "start:dev": "cross-env NODE_ENV=development nodemon bootstrap.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "ajv": "^8.12.0", + "koa": "^2.14.2", + "koa-body": "^6.0.1", + "koa-compress": "^5.1.1", + "koa-json-error": "^3.1.2", + "koa-logger": "^3.2.1", + "koa-ratelimit": "^5.0.1", + "koa-router": "^12.0.1", + "koa-useragent": "^4.1.0", + "winston": "^3.11.0", + "winston-daily-rotate-file": "^4.7.1" + }, + "devDependencies": { + "cross-env": "^7.0.3", + "eslint": "^8.52.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0", + "nodemon": "^3.0.1", + "prettier": "^3.0.3" + } +} diff --git a/11=initkoa/pnpm-lock.yaml b/11=initkoa/pnpm-lock.yaml new file mode 100644 index 0000000..c25aac1 --- /dev/null +++ b/11=initkoa/pnpm-lock.yaml @@ -0,0 +1,2106 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + ajv: + specifier: ^8.12.0 + version: 8.12.0 + koa: + specifier: ^2.14.2 + version: 2.14.2 + koa-body: + specifier: ^6.0.1 + version: 6.0.1 + koa-compress: + specifier: ^5.1.1 + version: 5.1.1 + koa-json-error: + specifier: ^3.1.2 + version: 3.1.2 + koa-logger: + specifier: ^3.2.1 + version: 3.2.1 + koa-ratelimit: + specifier: ^5.0.1 + version: 5.0.1 + koa-router: + specifier: ^12.0.1 + version: 12.0.1 + koa-useragent: + specifier: ^4.1.0 + version: 4.1.0 + winston: + specifier: ^3.11.0 + version: 3.11.0 + winston-daily-rotate-file: + specifier: ^4.7.1 + version: 4.7.1(winston@3.11.0) + +devDependencies: + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + eslint: + specifier: ^8.52.0 + version: 8.54.0 + eslint-config-prettier: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.54.0) + eslint-plugin-prettier: + specifier: ^5.0.0 + version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0) + nodemon: + specifier: ^3.0.1 + version: 3.0.1 + prettier: + specifier: ^3.0.3 + version: 3.1.0 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@colors/colors@1.6.0: + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + dev: false + + /@dabh/diagnostics@2.0.3: + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + dev: false + + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.54.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.2 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 + dev: true + + /@types/accepts@1.3.7: + resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + dependencies: + '@types/node': 20.10.0 + dev: false + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.10.0 + dev: false + + /@types/co-body@6.1.3: + resolution: {integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==} + dependencies: + '@types/node': 20.10.0 + '@types/qs': 6.9.10 + dev: false + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 20.10.0 + dev: false + + /@types/content-disposition@0.5.8: + resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} + dev: false + + /@types/cookies@0.7.10: + resolution: {integrity: sha512-hmUCjAk2fwZVPPkkPBcI7jGLIR5mg4OVoNMBwU6aVsMm/iNPY7z9/R+x2fSwLt/ZXoGua6C5Zy2k5xOo9jUyhQ==} + dependencies: + '@types/connect': 3.4.38 + '@types/express': 4.17.21 + '@types/keygrip': 1.0.6 + '@types/node': 20.10.0 + dev: false + + /@types/express-serve-static-core@4.17.41: + resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} + dependencies: + '@types/node': 20.10.0 + '@types/qs': 6.9.10 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: false + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.17.41 + '@types/qs': 6.9.10 + '@types/serve-static': 1.15.5 + dev: false + + /@types/formidable@2.0.6: + resolution: {integrity: sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==} + dependencies: + '@types/node': 20.10.0 + dev: false + + /@types/http-assert@1.5.5: + resolution: {integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==} + dev: false + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + dev: false + + /@types/keygrip@1.0.6: + resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} + dev: false + + /@types/koa-compose@3.2.8: + resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} + dependencies: + '@types/koa': 2.13.12 + dev: false + + /@types/koa@2.13.12: + resolution: {integrity: sha512-vAo1KuDSYWFDB4Cs80CHvfmzSQWeUb909aQib0C0aFx4sw0K9UZFz2m5jaEP+b3X1+yr904iQiruS0hXi31jbw==} + dependencies: + '@types/accepts': 1.3.7 + '@types/content-disposition': 0.5.8 + '@types/cookies': 0.7.10 + '@types/http-assert': 1.5.5 + '@types/http-errors': 2.0.4 + '@types/keygrip': 1.0.6 + '@types/koa-compose': 3.2.8 + '@types/node': 20.10.0 + dev: false + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: false + + /@types/mime@3.0.4: + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + dev: false + + /@types/node@20.10.0: + resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==} + dependencies: + undici-types: 5.26.5 + dev: false + + /@types/qs@6.9.10: + resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==} + dev: false + + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: false + + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.10.0 + dev: false + + /@types/serve-static@1.15.5: + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/mime': 3.0.4 + '@types/node': 20.10.0 + dev: false + + /@types/triple-beam@1.3.5: + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + dev: false + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: false + + /async-ratelimiter@1.3.12: + resolution: {integrity: sha512-W7WWxWMjJ+XEZCyQhEWGrskqDgz3k2UWM/aUlatSl3ejFLwpM/G90AYSgkHHXeY2S53fiP204GITnmIxrJMsSQ==} + engines: {node: '>= 8'} + dev: false + + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.52 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.3.2 + dev: false + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /co-body@6.1.0: + resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} + dependencies: + inflation: 2.1.0 + qs: 6.11.2 + raw-body: 2.5.2 + type-is: 1.6.18 + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + dev: false + + /colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + dev: false + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /cookies@0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: false + + /cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-config-prettier@9.0.0(eslint@8.54.0): + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.54.0 + dev: true + + /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0): + resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.54.0 + eslint-config-prettier: 9.0.0(eslint@8.54.0) + prettier: 3.1.0 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.5 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.54.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /express-useragent@1.0.15: + resolution: {integrity: sha512-eq5xMiYCYwFPoekffMjvEIk+NWdlQY9Y38OsTyl13IvA728vKT+q/CSERYWzcw93HGBJcIqMIsZC5CZGARPVdg==} + engines: {node: '>=4.5'} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + dev: false + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /file-stream-rotator@0.6.1: + resolution: {integrity: sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==} + dependencies: + moment: 2.29.4 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + dev: false + + /formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + dependencies: + dezalgo: 1.0.4 + hexoid: 1.0.0 + once: 1.4.0 + qs: 6.11.2 + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + + /hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + dev: false + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: false + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: false + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /humanize-number@0.0.2: + resolution: {integrity: sha512-un3ZAcNQGI7RzaWGZzQDH47HETM4Wrj6z6E4TId8Yeq9w5ZKUVB1nrT2jwFheTUjEmqcgTjXDc959jum+ai1kQ==} + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflation@2.1.0: + resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} + engines: {node: '>= 0.8.0'} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /koa-body@6.0.1: + resolution: {integrity: sha512-M8ZvMD8r+kPHy28aWP9VxL7kY8oPWA+C7ZgCljrCMeaU7uX6wsIQgDHskyrAr9sw+jqnIXyv4Mlxri5R4InIJg==} + dependencies: + '@types/co-body': 6.1.3 + '@types/formidable': 2.0.6 + '@types/koa': 2.13.12 + co-body: 6.1.0 + formidable: 2.1.2 + zod: 3.22.4 + dev: false + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: false + + /koa-compress@5.1.1: + resolution: {integrity: sha512-UgMIN7ZoEP2DuoSQmD6CYvFSLt0NReGlc2qSY4bO4Oq0L56OiD9pDG41Kj/zFmVY/A3Wvmn4BqKcfq5H30LGIg==} + engines: {node: '>= 12'} + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + http-errors: 1.8.1 + koa-is-json: 1.0.0 + dev: false + + /koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: false + + /koa-is-json@1.0.0: + resolution: {integrity: sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==} + dev: false + + /koa-json-error@3.1.2: + resolution: {integrity: sha512-nqfNwD4W+hYaJijFl+6qNSQJHbTS4vp+gXTdXl5U8YK2PVNzCF0HnLZwyKHaMeBebhanAgmfheQv96wLDjLRxg==} + engines: {node: '>=6.0.0'} + dependencies: + lodash.compact: 3.0.1 + lodash.curry: 4.1.1 + dev: false + + /koa-logger@3.2.1: + resolution: {integrity: sha512-MjlznhLLKy9+kG8nAXKJLM0/ClsQp/Or2vI3a5rbSQmgl8IJBQO0KI5FA70BvW+hqjtxjp49SpH2E7okS6NmHg==} + engines: {node: '>= 7.6.0'} + dependencies: + bytes: 3.1.2 + chalk: 2.4.2 + humanize-number: 0.0.2 + passthrough-counter: 1.0.0 + dev: false + + /koa-ratelimit@5.0.1: + resolution: {integrity: sha512-H7IEkNS/b18Uwtm3RIvAK3orJE8ew8wEBsnezlQWz7GTWqEnDtbTNfTedVXjj07gyh8gWTkEdODEXRquGCBqmg==} + engines: {node: '>= 10'} + dependencies: + async-ratelimiter: 1.3.12 + debug: 4.3.4 + ms: 2.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /koa-router@12.0.1: + resolution: {integrity: sha512-gaDdj3GtzoLoeosacd50kBBTnnh3B9AYxDThQUo4sfUyXdOhY6ku1qyZKW88tQCRgc3Sw6ChXYXWZwwgjOxE0w==} + engines: {node: '>= 12'} + dependencies: + debug: 4.3.4 + http-errors: 2.0.0 + koa-compose: 4.1.0 + methods: 1.1.2 + path-to-regexp: 6.2.1 + transitivePeerDependencies: + - supports-color + dev: false + + /koa-useragent@4.1.0: + resolution: {integrity: sha512-x/HUDZ1zAmNNh5hA9hHbPm9p3UVg2prlpHzxCXQCzbibrNS0kmj7MkCResCbAbG7ZT6FVxNSMjR94ZGamdMwxA==} + engines: {node: '>=7.6.0'} + dependencies: + express-useragent: 1.0.15 + dev: false + + /koa@2.14.2: + resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.8.0 + debug: 4.3.4 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + dev: false + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.compact@3.0.1: + resolution: {integrity: sha512-2ozeiPi+5eBXW1CLtzjk8XQFhQOEMwwfxblqeq6EGyTxZJ1bPATqilY0e6g2SLQpP4KuMeuioBhEnWz5Pr7ICQ==} + dev: false + + /lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /logform@2.6.0: + resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.2 + safe-stable-stringify: 2.4.3 + triple-beam: 1.4.1 + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /moment@2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /nodemon@3.0.1: + resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.5.4 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /object-hash@2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} + dev: false + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + dependencies: + fn.name: 1.1.0 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: false + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /passthrough-counter@1.0.0: + resolution: {integrity: sha512-Wy8PXTLqPAN0oEgBrlnsXPMww3SYJ44tQ8aVrGAI4h4JZYCS0oYqsPqtPR8OhJpv6qFbpbB7XAn0liKV7EXubA==} + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + dev: false + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: false + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.2 + dev: true + + /text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: false + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /winston-daily-rotate-file@4.7.1(winston@3.11.0): + resolution: {integrity: sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==} + engines: {node: '>=8'} + peerDependencies: + winston: ^3 + dependencies: + file-stream-rotator: 0.6.1 + object-hash: 2.2.0 + triple-beam: 1.4.1 + winston: 3.11.0 + winston-transport: 4.6.0 + dev: false + + /winston-transport@4.6.0: + resolution: {integrity: sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==} + engines: {node: '>= 12.0.0'} + dependencies: + logform: 2.6.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + dev: false + + /winston@3.11.0: + resolution: {integrity: sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.5 + is-stream: 2.0.1 + logform: 2.6.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.4.3 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.6.0 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /ylru@1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false diff --git a/11=initkoa/production.env.js b/11=initkoa/production.env.js new file mode 100644 index 0000000..c7fa852 --- /dev/null +++ b/11=initkoa/production.env.js @@ -0,0 +1,33 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: production.env.js - +// | @创建时间: 2023-11-25 21:36 +// | @更新时间: 2023-11-25 21:36 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + + +const prodConfig = { + appName: 'koa web application', + port: 3000, + zip: true, + upfile:{ + maxFileSize: 200 * 1024 * 1024, + hashAlgorithm: false, // md5 sha1 sha256 sha512 + }, + request:{ + maxFieldsSize: 2 * 1024 * 1024,// 请求体大小 + }, + ratelimit:{ + status: true, + duration: 60 * 1000, + max: 100, + }, +} + +export default prodConfig diff --git a/11=initkoa/src/app.js b/11=initkoa/src/app.js new file mode 100644 index 0000000..734868d --- /dev/null +++ b/11=initkoa/src/app.js @@ -0,0 +1,102 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: app.js - Koa项目的入口文件 +// | @创建时间: 2023-11-25 20:58 +// | @更新时间: 2023-11-25 20:58 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Koa from 'koa'; +import koaLogger from 'koa-logger'; +import compress from 'koa-compress'; +import ratelimit from 'koa-ratelimit'; +import handleError from 'koa-json-error'; +import { koaBody } from 'koa-body'; +import { userAgent } from 'koa-useragent'; + +import rootRouter from '#routes/index.js'; + +export default function startApp() { + const app = new Koa(); + if (global.ENV === 'development') { + // | 开启自带日志 + app.use(koaLogger()); + } + + if (config.ratelimit.status) { + // | 限制同一用户的频繁请求 + app.use( + ratelimit({ + driver: 'memory', // 存储限流数据的驱动,这里使用内存驱动 + db: new Map(), // 存储被限制的客户端信息的数据结构 + duration: config.ratelimit.duration, // 时间窗口,单位毫秒 + max: config.ratelimit.max, // 时间窗口内允许的最大请求数量 + id: (ctx) => ctx.ip, // 提取每个请求的唯一标识符,默认使用请求的 IP 地址 + }), + ); + } + + app.use( + handleError({ + format: (err) => { + // 返回错误的格式 + return { + code: err.status, + message: err.message, + result: ENV === 'development' && err.stack, + }; + }, + postFormat: (err, obj) => { + //根据不同环境,返回不同格式的错误信息 + const { result, ...rest } = obj; + return process.env.NODE_ENV == 'production' ? rest : obj; + }, + }), + ); + + if (global.zip === true) { + // | koa-compress 是一个 Koa 中间件,用于压缩 HTTP 响应。使用该中间件可减少 HTTP 响应的大小,从而提升应用程序的性能。 + app.use(compress()); + } + app.use(userAgent); + + app.use( + koaBody({ + multipart: true, // 支持文件上传 + encoding: 'gzip', + formidable: { + // uploadDir:path.join(__dirname,'public/upload/'), // 设置文件上传目录 + keepExtensions: true, // 保持文件的后缀 + maxFileSize: config.upfile.maxFileSize, // 文件上传大小 + maxFieldsSize: config.request.maxFieldsSize, // 除文件外的数据大小 + onFileBegin: (name, file) => { + // 文件上传前的设置 + }, + hashAlgorithm: config.upfile.hashAlgorithm, + }, + }), + ); + + // app.use(async (ctx, next) => { + // // console.log(ctx.request.files.file) + // // console.log(ctx.request.body) + // // console.log(ctx.userAgent) + // console.log(ctx.ip); + // ctx.throw(520, '欣赏欣赏'); + // ctx.body = 'xs'; + // }); + + app.use(rootRouter.routes()); + app.use(rootRouter.allowedMethods()); + + // console.log(rootRouter) + + // const routes = rootRouter.stack.map((route) => route.path); + + return app; +} diff --git a/11=initkoa/src/common/dto/index.js b/11=initkoa/src/common/dto/index.js new file mode 100644 index 0000000..0462d08 --- /dev/null +++ b/11=initkoa/src/common/dto/index.js @@ -0,0 +1,28 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.js - +// | @创建时间: 2023-11-26 15:41 +// | @更新时间: 2023-11-26 15:41 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import Ajv from 'ajv' + +export default function makeDTO(data, schema){ + const ajv = new Ajv(); + const validate = ajv.compile(schema); + const valid = validate(data); + const message = { + status: true, + error: null + } + if (!valid) { + message.status = false; + message.error = validate.errors + } + return message +} diff --git a/11=initkoa/src/common/logger/index.js b/11=initkoa/src/common/logger/index.js new file mode 100644 index 0000000..71ab4e1 --- /dev/null +++ b/11=initkoa/src/common/logger/index.js @@ -0,0 +1,89 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.js - +// | @创建时间: 2023-11-26 14:51 +// | @更新时间: 2023-11-26 14:51 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import winston from "winston"; +import "winston-daily-rotate-file" + + +// 自定义日志等级和颜色 +const myCustomLevels = { + levels:{ + fatal: 0, + error: 1, + warn: 2, + info: 3, + debug: 4, + trace: 5 + }, +// 字体样式:bold, dim,italic, underline, inverse, hidden, strikethrough +// 字体背景颜色:black, red, green, yellow, blue, magenta紫色, cyan青色, white, gray, grey +// 背景颜色:blackBG, redBG, greenBG, yellowBG, blueBG, magentaBG, cyanBG, whiteBG + levelsColor:{ + fatal: 'bold red cyanBG italic underline', + error: 'bold magenta', + warn: 'yellow', + info: 'green', + debug: 'cyan', + trace: 'white' + } +} +// 创建颜色方法 +export const colorizer = winston.format.colorize(); +colorizer.addColors(myCustomLevels.levelsColor) + +export const logger = winston.createLogger({ + level: 'trace', // 日志打印等级 + levels: myCustomLevels.levels,// 日志等级列表 + exitOnError: false,// 如果为false,处理异常不会导致process.exit + silent: false, // 如果为true,所有日志被抑制 + format: winston.format.combine( + winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss:SSS" }), + winston.format.printf( + (i) => { + // const splatList = Array.from(Object.getOwnPropertySymbols(i)) + // const splat = splatList && splatList.filter(item => item.toString() === 'Symbol(splat)') + // const splatName = splat.length == 1 ? splat[0] : null + // const data = splatName ? JSON.stringify([i.message, ...i[splatName]]) : JSON.stringify({message:i.message}) + return `${i.timestamp} [${i.level.padEnd(5, ' ').toUpperCase()}] ${i.message}` + }, + ), + ), + transports: [ + new winston.transports.DailyRotateFile({ + filename: "winston-logs/%DATE%-INFO--winston.log", + level: "info", + datePattern: "YYYY-MM-DD", + zippedArchive: true,// 启用压缩 + maxSize: "10m",// 单文件大小 + maxFiles: "30d",// 存储时间 + }), + new winston.transports.DailyRotateFile({ + filename: "winston-logs/%DATE%-ERROR-winston.log", + level: "error", + datePattern: "YYYY-MM-DD", + zippedArchive: true, + maxSize: "10m", + maxFiles: "365d", + }), + ], + // winston可以捕获和记录异常 + exceptionHandlers: [ + new winston.transports.File({ filename: 'winston-logs/winston-exceptions.log' }) + ], + // 捕获uncaughtRejection事件 + rejectionHandlers: [ + new winston.transports.File({ filename: 'winston-logs/rejections.log' }) + ] +}); +// 后续加入记录器,这里可以加入环境变量的判断,当为生产模式时,取消控制台的打印操作。 + diff --git a/11=initkoa/src/routes/index.dto.js b/11=initkoa/src/routes/index.dto.js new file mode 100644 index 0000000..7cc85b9 --- /dev/null +++ b/11=initkoa/src/routes/index.dto.js @@ -0,0 +1,28 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.dto.js - +// | @创建时间: 2023-11-26 15:10 +// | @更新时间: 2023-11-26 15:10 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import makeDTO from "#common/dto/index.js"; + +export default function testDTO(data){ + const schema = { + "type": "object", + "properties": { + "name": { "type": "string" }, + "age": { "type": "number" }, + "email": { "type": "string", + "pattern": "^\\S+@\\S+\\.\\S+$" } + }, + "required": ["name", "age"] + } + return makeDTO(data, schema) +} diff --git a/11=initkoa/src/routes/index.js b/11=initkoa/src/routes/index.js new file mode 100644 index 0000000..b3597ff --- /dev/null +++ b/11=initkoa/src/routes/index.js @@ -0,0 +1,41 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.js - +// | @创建时间: 2023-11-26 01:34 +// | @更新时间: 2023-11-26 01:34 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Router from 'koa-router'; + +import userRouter from '#home/routes/user/index.js'; +import testDTO from '#routes/index.dto.js'; + +// const rootRouter = new Router({ +// prefix: '/api', // 添加前缀 +// }); + +const apiRouter = new Router(); +apiRouter.get('/', async (ctx) => { + ctx.body = 'Hello /API!'; +}); +apiRouter.use('/user', userRouter.routes()); + +const rootRouter = new Router(); +rootRouter.get('/', async (ctx) => { + const data = testDTO({ + name: 'hexi', + age: 32, + email: 'expressgy', + }); + console.log(data); + ctx.body = 'Hello World!'; +}); +rootRouter.use('/api', apiRouter.routes()); + +export default rootRouter; diff --git a/11=initkoa/src/routes/user/index.js b/11=initkoa/src/routes/user/index.js new file mode 100644 index 0000000..b1df856 --- /dev/null +++ b/11=initkoa/src/routes/user/index.js @@ -0,0 +1,46 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.js - +// | @创建时间: 2023-11-26 01:42 +// | @更新时间: 2023-11-26 01:42 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Router from 'koa-router' + +const userRouter = new Router(); + +userRouter.use(async (ctx, next) => { + + console.log(1) + await next() + console.log(2) +}) + +userRouter.get('/', async ctx => { + ctx.body = 'USER' +}) + + +userRouter.get('/:id', async ctx => { + console.log(ctx.params) + console.log(ctx.query) + ctx.body = 'USER' +}) + +userRouter.post('/:id/create', async ctx => { + console.log(ctx.params) + console.log(ctx.query) + console.log(ctx.request.body) + ctx.body = 'USER' +}) + + + + +export default userRouter diff --git a/11=initkoa/test/ajvTest.js b/11=initkoa/test/ajvTest.js new file mode 100644 index 0000000..ebcc887 --- /dev/null +++ b/11=initkoa/test/ajvTest.js @@ -0,0 +1,82 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: ajvTest.js - +// | @创建时间: 2023-11-25 21:59 +// | @更新时间: 2023-11-25 21:59 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +const Ajv = require('ajv'); +const ajv = new Ajv({ allErrors: true }); + +const schema = { + type: 'object', + properties: { + name: { type: 'string' }, + age: { type: 'integer', minimum: 18 }, + }, + required: ['name', 'age'], + errorMessage: { + type: '数据应该是一个对象', // 整体 schema 错误消息 + required: '对象缺少必要属性', // 缺少必要属性错误消息 + properties: { + name: '姓名应该是一个字符串', + age: '年龄应该是一个大于或等于 18 的整数', + }, + }, +}; + +const validate = ajv.compile(schema); + +const data = { + name: 123, + age: 17, +}; + +validate(data); +if (validate.errors) { + console.log(validate.errors); // 输出自定义错误消息 +} + +// ================================ + +const Ajv = require('ajv'); +const ajv = new Ajv({ allErrors: true }); + +// 添加自定义关键字 +ajv.addKeyword('isOldEnough', { + validate: function (schema, data) { + ajv.errors = [ + { + keyword: 'isOldEnough', + message: '年龄必须大于18岁', + params: { keyword: 'isOldEnough' }, + }, + ]; + return data >= 18; + }, + errors: true, // 使用自定义的错误列表 +}); + +const schema = { + type: 'object', + properties: { + age: { type: 'integer', isOldEnough: true }, + }, + required: ['age'], +}; + +const validate = ajv.compile(schema); + +const data = { + age: 17, +}; + +validate(data); +if (validate.errors) { + console.log(validate.errors); // 输出自定义错误消息 +} diff --git a/11=initkoa/test/koa-body使用.md b/11=initkoa/test/koa-body使用.md new file mode 100644 index 0000000..ce2162f --- /dev/null +++ b/11=initkoa/test/koa-body使用.md @@ -0,0 +1,286 @@ +`koa-body` 是一个流行的 Koa 请求体解析中间件,支持解析常见的请求体数据类型,包括 JSON 数据、表单数据,以及文件上传。下面是 `koa-body` 的详细配置和使用方式: + +## 安装 + +使用 npm 安装 `koa-body` 中间件: + +``` +npm install koa-body --save +``` + +## 使用 + +要使用 `koa-body` 中间件,只需要在 Koa 应用程序中使用 `app.use` 方法将其注册,然后可以在请求处理程序和中间件中使用 `ctx.request.body` 来访问已解析的请求体数据。 + +以下是一个使用 `koa-body` 中间件的示例: + +```javascript +const Koa = require('koa'); +const koaBody = require('koa-body'); + +const app = new Koa(); + +// 将 koaBody 中间件注册到应用程序中 +app.use( + koaBody({ + multipart: true, + formidable: { + maxFileSize: 100 * 1024 * 1024, + }, + }) +); + +// 处理请求 +app.use((ctx) => { + // 访问已解析的请求体数据 + console.log(ctx.request.body); + ctx.body = 'Hello Koa'; +}); + +// 启动应用程序 +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上面的示例中,我们将 `koa-body` 中间件注册到应用程序中,并通过参数对象配置解析器。其中,`multipart` 选项是用于启用文件上传支持的选项,`formidable` 对象包括有关文件上传的配置选项,例如 `maxFileSize`,用于限制文件的大小。 + +在请求处理程序中,我们可以使用 `ctx.request.body` 访问已解析的请求体数据。 + +## 配置选项 + +下面是 `koa-body` 可用的配置选项及其默认值: + +- `form`:是否解析 `application/x-www-form-urlencoded` 格式的请求体数据,默认为 `true` +- `json`:是否解析 `application/json` 格式的请求体数据,默认为 `true` +- `text`:是否解析 `text/*` 格式的请求体数据,默认为 `true` +- `encoding`:请求体的编码方式,默认为 `'utf-8'` +- `xml`:是否解析 `application/xml` 和 `text/xml` 格式的请求体数据,默认为 `false` +- `jsonLimit`:限制解析 `application/json` 格式请求体数据的大小(以字节为单位),默认为 `1mb` +- `formLimit`:限制解析 `application/x-www-form-urlencoded` 格式的请求体数据大小(以字节为单位),默认为 `56kb` +- `textLimit`:限制解析 `text/*` 格式的请求体数据大小(以字节为单位),默认为 `56kb` +- `xmlLimit`:限制解析 `application/xml` 和 `text/xml` 格式的请求体数据大小(以字节为单位),默认为 `1mb` +- `multipart`:是否解析 `multipart/*` 格式的请求体数据(用于文件上传),默认为 `false` +- `multiples`:是否解析多个文件上传,默认为 `false` +- `onError`:错误处理程序,用于处理请求体解析错误,默认为 `ctx.throw` +- `includeUnparsed`:是否将未解析的请求体数据存储在 `ctx.request.body` 中,默认为 `false` +- `textLimit`:限制解析 `text/*` 格式的请求体数据大小(以字节为单位),默认为 `56kb` + +## 示例 + +### 解析表单数据和 JSON 数据 + +以下示例演示如何将 `koa-body` 中间件配置为仅解析表单数据和 JSON 数据: + +```javascript +const Koa = require('koa'); +const koaBody = require('koa-body'); + +const app = new Koa(); + +// 仅解析表单数据和 JSON 数据 +app.use(koaBody({ form: true, json: true })); + +app.use((ctx) => { + console.log(ctx.request.body); + ctx.body = 'Hello Koa'; +}); + +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上面的示例中,我们将 `koa-body` 中间件配置为仅解析表单数据和 JSON 数据。我们可以在请求处理程序中使用 `ctx.request.body` 访问已解析的请求体数据。 + +### 解析文件上传 + +以下示例演示如何使用 `koa-body` 中间件解析文件上传: + +```javascript +const Koa = require('koa'); +const koaBody = require('koa-body'); + +const app = new Koa(); + +// 启用文件上传支持 +app.use( + koaBody({ + multipart: true, + formidable: { + maxFileSize: 100 * 1024 * 1024, + }, + }) +); + +app.use((ctx) => { + // 文件上传信息存储在 ctx.request.files 中 + console.log(ctx.request.files); + ctx.body = 'Hello Koa'; +}); + +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上面的示例中,我们将 `koa-body` 中间件配置为启用文件上传支持,并使用 `formidable` 对象配置文件上传选项。在请求处理程序中,我们可以使用 `ctx.request.files` 访问文件上传信息。 + +### 错误处理 + +`koa-body` 中间件的默认错误处理程序是 `ctx.throw`,它会抛出一个 HTTP 400 错误响应。你可以自定义一个错误处理程序来处理请求体解析错误。 + +以下示例演示如何自定义错误处理程序: + +```javascript +const Koa = require('koa'); +const koaBody = require('koa-body'); + +const app = new Koa(); + +app.use( + koaBody({ + onError: (err, ctx) => { + ctx.throw('Body parse error', 422); + }, + }) +); + +app.use((ctx) => { + console.log(ctx.request.body); + ctx.body = 'Hello Koa'; +}); + +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上面的示例中,我们自定义了一个错误处理程序,当发生请求体解析错误时,它会抛出一个 HTTP 422 错误响应。 + +## 总结 + +`koa-body` 是一个流行的 Koa 请求体解析中间件,它支持解析常见的请求体数据类型,包括 JSON 数据、表单数据,以及文件上传。你可以通过配置选项来自定义解析器的行为,并使用 `ctx.request.body` 和 `ctx.request.files` 在请求处理程序中访问已解析的请求体数据和上传的文件信息。同时,你也可以自定义错误处理程序来处理请求体解析错误。 + + + + + + + + + + + + + + +一、需求 +之前使用 koa2 的时候,处理 post 请求使用的是 koa-bodyparser,同时如果是图片上传使用的是 koa-multer。 + +这两者的组合没什么问题,不过 koa-multer 和 koa-route(注意不是 koa-router) 存在不兼容的问题。 + +这个问题已经在这篇文章中说明了: + +使用koa-multer实现文件上传并自定义文件名和目录 +关于 koa-bodyparser 的使用,见下面文章: + +手动实现koa2 body-parser中间件及koa-boayparser的使用 +但是这两者可以通过 koa-body 代替,并且只是用 koa-body 即可。 + +koa-body 主要是下面两个依赖: + +"co-body": "^5.1.1", +"formidable": "^1.1.1" +具体的实现可以在 github 上查看 : https://github.com/dlau/koa-body + +二、koa-body 的基本使用 +在 koa2 中使用 koa-body,我使用的是全局引入,而不是路由级别的引入,因为考虑到很多地方都有 post 请求或者是文件上传请求,没必要只在路由级别引入。 + +1、安装依赖 +yarn add koa-body +## npm i koa-body -S +2、app.js +省略了 koa 的一些基本代码 + +const koaBody = require('koa-body'); +const app = new koa(); +app.use(koaBody({ +multipart:true, // 支持文件上传 +encoding:'gzip', +formidable:{ +uploadDir:path.join(__dirname,'public/upload/'), // 设置文件上传目录 +keepExtensions: true, // 保持文件的后缀 +maxFieldsSize:2 * 1024 * 1024, // 文件上传大小 +onFileBegin:(name,file) => { // 文件上传前的设置 +// console.log(`name: ${name}`); +// console.log(file); +}, +} +})); +3、有用的参数 +1)koa-body 的基本参数 + +参数名 描述 类型 默认值 +patchNode 将请求体打到原生 node.js 的ctx.req中 Boolean false +patchKoa 将请求体打到 koa 的 ctx.request 中 Boolean true +jsonLimit JSON 数据体的大小限制 String / Integer 1mb +formLimit 限制表单请求体的大小 String / Integer 56kb +textLimit 限制 text body 的大小 String / Integer 56kb +encoding 表单的默认编码 String utf-8 +multipart 是否支持 multipart-formdate 的表单 Boolean false +urlencoded 是否支持 urlencoded 的表单 Boolean true +text 是否解析 text/plain 的表单 Boolean true +json 是否解析 json 请求体 Boolean true +jsonStrict 是否使用 json 严格模式,true 会只处理数组和对象 Boolean true +formidable 配置更多的关于 multipart 的选项 Object {} +onError 错误处理 Function function(){} +stict 严格模式,启用后不会解析 GET, HEAD, DELETE 请求 Boolean true +2)formidable 的相关配置参数 + +参数名 描述 类型 默认值 +maxFields 限制字段的数量 Integer 1000 +maxFieldsSize 限制字段的最大大小 Integer 2 * 1024 * 1024 +uploadDir 文件上传的文件夹 String os.tmpDir() +keepExtensions 保留原来的文件后缀 Boolean false +hash 如果要计算文件的 hash,则可以选择 md5/sha1 String false +multipart 是否支持多文件上传 Boolean true +onFileBegin 文件上传前的一些设置操作 Function function(name,file){} +关于 onFileBegin 的更多信息可以查看: + +https://github.com/felixge/node-formidable#filebegin +4、获取文件上传后的信息 +这些代码是在路由中体现的 + +需要注意的是,如果是获取上传后文件的信息,则需要在 ctx.request.files 中获取。 + +如果是获取其他的表单字段,则需要在 ctx.request.body 中获取,这是由 co-body 决定的(默认情况)。 + +router.get('/', async (ctx) => { +await ctx.render('index'); +}); + +router.post('/',async (ctx)=>{ +console.log(ctx.request.files); +console.log(ctx.request.body); +ctx.body = JSON.stringify(ctx.request.files); +}); +三、结果 + + +因为默认开启多个文件上传,因此 ctx.request.files 是一个对象, + +而且是通过表单的 name=photo 属性作为对象的 key,值便是一个 File 对象,有用的字段如下: + +字段名 描述 +size 文件大小 +path 文件上传后的目录 +name 文件的原始名称 +type 文件类型 +lastModifiedDate 上次更新的时间 + + +http://www.ptbird.cn/koa-body.html +———————————————— +版权声明:本文为CSDN博主「after you」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 +原文链接:https://blog.csdn.net/gwdgwd123/article/details/103561817 diff --git a/11=initkoa/test/koa-compress说明.md b/11=initkoa/test/koa-compress说明.md new file mode 100644 index 0000000..4e23269 --- /dev/null +++ b/11=initkoa/test/koa-compress说明.md @@ -0,0 +1,104 @@ + + +koa-compress 是一个 Koa 中间件,用于压缩 HTTP 响应。使用该中间件可减少 HTTP 响应的大小,从而提升应用程序的性能。 + +下面是使用 koa-compress 的简单示例: + +```javascript +const Koa = require('koa'); +const compress = require('koa-compress'); + +const app = new Koa(); + +// 注册中间件 +app.use(compress()); + +// 定义路由 +app.use(async (ctx) => { + ctx.body = 'Hello, world!'; +}); + +app.listen(3000, () => { + console.log('Server started on 3000'); +}); +``` + +在上面的示例中,我们首先通过 `require` 引入了 Koa 和 koa-compress,然后创建了一个 Koa 应用程序实例。 + +在注册中间件时,我们使用了 `compress()` 函数来创建 koa-compress 中间件的实例,并将其添加到应用程序中间件栈中。 + +最后,我们定义了一个非常简单的路由,在该路由中,我们设置了响应的正文内容为 "Hello, world!"。由于我们已经注册了 koa-compress 中间件,因此响应的内容将被压缩后返回给客户端。 + +需要注意的是,koa-compress 的默认配置已经适用于大多数情况。如果需要对其进行个性化配置,请参阅 koa-compress 的文档。 + + +虽然 koa-compress 是一个非常有用的中间件,但它也有一些缺点,包括: + +1. CPU 开销:压缩和解压缩数据需要消耗一定的 CPU 资源。对于大量并发请求的应用程序,尤其是在处理大型响应时,这可能会占用大量的 CPU 时间,并可能成为性能瓶颈。 + +2. 内存消耗:压缩和解压缩数据可能会占用一定的内存。对于包含大量压缩数据的响应,这可能会导致应用程序的内存占用增加。 + +3. 配置复杂性:虽然 koa-compress 的默认配置适用于大多数情况,但某些情况下可能需要进行个性化的配置。配置复杂性可能会增加,特别是在需要针对不同的响应类型或路径进行不同的压缩设置时。 + +4. 不适用于动态内容:由于压缩是在响应生成后进行的,因此对于动态内容(如实时数据或流式响应)无法实时压缩。这可能会导致传输过程中的数据量较大,影响网络传输速度。 + +总体来说,koa-compress 是一个功能强大的中间件,可以提高应用程序的性能和网络传输效率。然而,在使用它时,需要权衡使用压缩所带来的性能消耗和配置复杂性,以确保最佳的应用程序性能和用户体验。 + +koa-compress 提供了一系列的配置选项,可以根据需要进行个性化的配置。下面是常用的一些选项: + +- `filter`:指定哪些 HTTP 响应需要被压缩。可以是一个布尔值、字符串、正则表达式或一个自定义函数。默认为压缩所有响应。 + +- `threshold`:指定响应正文的大小下限,只有当响应正文大小超过指定值时才会进行压缩。默认为 `1024` 字节。 + +- `gzip`:指定是否启用 Gzip 压缩。默认为 `true`。 + +- `deflate`:指定是否启用 Deflate 压缩。默认为 `true`。 + +- `br`:指定是否启用 Brotli 压缩。默认为 `false`。 + +- `chunkSize`:指定压缩块的大小。默认为 `16 * 1024` 字节。 + +- `mimeTypes`:指定要压缩的 MIME 类型。默认为 `['text/*']`。 + +- `enableTypes`:指定要启用压缩的 MIME 类型。默认为所有 MIME 类型。 + +- `skip`:指定一个自定义函数,以跳过指定的请求或响应。默认为 `null`。 + +下面是一个配置示例: + +```javascript +const Koa = require('koa'); +const compress = require('koa-compress'); + +const app = new Koa(); + +// 注册中间件并进行个性化配置 +app.use(compress({ + filter (content_type) { + return /text/i.test(content_type) + }, + threshold: 1024, + gzip: true, + deflate: false, + br: false, + chunkSize: 16 * 1024, + mimeTypes: ['text/plain', 'application/json'], + enableTypes: ['text/plain', 'application/json'], + skip (ctx) { + return ctx.path === '/healthcheck'; + } +})); + +// 定义路由 +app.use(async (ctx) => { + ctx.body = 'Hello, world!'; +}); + +app.listen(3000, () => { + console.log('Server started on 3000'); +}); +``` + +在上面的示例中,我们使用了一些常见的配置选项。我们指定了只对文本类型的响应进行压缩,并且启用了 Gzip 压缩。我们还指定了要启用的 MIME 类型和要跳过的路径,以及其他一些选项。 + +需要注意的是,配置选项可以根据需要进行个性化的调整。可以根据实际情况进行选择。在使用 koa-compress 时,确保在经过测试和评估后再进行个性化的配置。 diff --git a/11=initkoa/test/koa-ratelimit限制批量请求工具的应用.md b/11=initkoa/test/koa-ratelimit限制批量请求工具的应用.md new file mode 100644 index 0000000..8f682ce --- /dev/null +++ b/11=initkoa/test/koa-ratelimit限制批量请求工具的应用.md @@ -0,0 +1,33 @@ +要限制同一个客户端的请求数量,可以使用 `koa-ratelimit` 插件。该插件可以按照一定的速率限制客户端的请求数量。以下是使用 `koa-ratelimit` 的示例代码: + +```javascript +const Koa = require('koa'); +const ratelimit = require('koa-ratelimit'); + +const app = new Koa(); + +app.use(ratelimit({ + driver: 'memory', // 存储限流数据的驱动,这里使用内存驱动 + db: new Map(), // 存储被限制的客户端信息的数据结构 + duration: 60000, // 时间窗口,单位毫秒 + max: 10, // 时间窗口内允许的最大请求数量 + id: ctx => ctx.ip, // 提取每个请求的唯一标识符,默认使用请求的 IP 地址 +})); + +// 添加其他中间件和路由 + +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上述代码中,我们使用 `koa-ratelimit` 插件来限制同一个客户端的请求数量。插件配置中的关键参数如下: +- `driver`:存储限流数据的驱动,可以选择内存 (`memory`)、Redis (`redis`)、MongoDB (`mongodb`) 等。在示例中我们使用内存驱动。 +- `db`:存储被限制的客户端信息的数据结构,这里我们使用 `Map`。 +- `duration`:时间窗口的持续时间,单位为毫秒。 +- `max`:时间窗口内允许的最大请求数量。 +- `id`:提取每个请求的唯一标识符,默认使用请求的 IP 地址。 + +当某个客户端超过设定的最大请求数量时,该插件会返回 HTTP 状态码 429 Too Many Requests,并且设置 `Retry-After` 头部,表示重新尝试请求的时间。 + +通过使用 `koa-ratelimit` 插件,可以有效地限制同一个客户端的请求数量,从而保护服务器免受过多的请求负载。同时,你也可以根据实际需求调整时间窗口和最大请求数量的配置。 diff --git a/11=initkoa/test/koa-send方法.md b/11=initkoa/test/koa-send方法.md new file mode 100644 index 0000000..29bca8d --- /dev/null +++ b/11=initkoa/test/koa-send方法.md @@ -0,0 +1,46 @@ +`koa-send` 是一个 Koa 中间件,用于发送文件或目录响应给客户端。它提供了一种简单的方式来处理静态文件的发送。下面是一个使用示例: + +```javascript +const Koa = require('koa'); +const send = require('koa-send'); +const app = new Koa(); + +app.use(async (ctx, next) => { + // 使用 koa-send 发送文件 + await send(ctx, 'path/to/file.txt'); +}); + +app.listen(3000, () => { + console.log('Server started on 3000'); +}); +``` + +在上面的示例中,`koa-send` 中间件用于处理所有的请求,并将文件 `path/to/file.txt` 发送给客户端。 + +除了发送单个文件外,你还可以发送整个目录: + +```javascript +app.use(async (ctx, next) => { + // 使用 koa-send 发送目录 + await send(ctx, 'path/to/directory'); +}); +``` + +这将发送指定目录下的文件,可以在请求的 URL 中指定特定的文件。 + +`koa-send` 还提供了一些选项,用于设置发送文件时的行为。例如,你可以指定根目录、设置缓存控制头、设置内容类型等。以下是一个使用选项的示例: + +```javascript +app.use(async (ctx, next) => { + await send(ctx, 'path/to/file.txt', { + root: 'public', // 设置根目录 + maxage: 1 * 24 * 60 * 60 * 1000, // 设置缓存时间 + immutable: true, // 设置不可变性(immutable) + contentType: 'text/plain' // 设置内容类型 + }); +}); +``` + +在上面的示例中,我们将根目录设置为 `public`,将缓存时间设置为 1 天,启用不可变性,并设置内容类型为 `text/plain`。 + +通过这些选项,你可以对发送的文件进行更细致的控制。更多的选项和详细的使用方式可以查看 `koa-send` 的文档。 diff --git a/11=initkoa/test/koa修改code.md b/11=initkoa/test/koa修改code.md new file mode 100644 index 0000000..9257db2 --- /dev/null +++ b/11=initkoa/test/koa修改code.md @@ -0,0 +1,39 @@ +要在 Koa 中修改 HTTP 响应的状态码(code),可以简单地通过 ctx.status 属性进行修改。例如,将响应状态码修改为 404: + +```js +app.use(async (ctx, next) => { + ctx.status = 404; + // 继续执行后续中间件,并在之后对响应进行修改 + await next(); +}); +``` + +在上述代码中,我们将响应状态码设置为 404,并在之后继续执行后续中间件。这意味着你可以在后续中间件中进一步修改响应内容,比如设置响应体、设置 headers 等。 + +如果你想要在响应发送之前中止中间件的执行,可以通过 ctx.throw 方法或在抛出一个 Error 对象,同时设置其 status 或者 statusCode 属性: + +```js +app.use(async (ctx, next) => { + if (someCondition) { + ctx.throw(400, 'Bad Request'); + } else { + await next(); + } +}); +``` + +或者: + +```js +app.use(async (ctx, next) => { + if (someCondition) { + const err = new Error('Bad Request'); + err.status = 400; + throw err; + } else { + await next(); + } +}); +``` + +在上述代码中,当 someCondition 符合时,我们通过 ctx.throw 或抛出 Error 对象来中止中间件执行,并将响应状态码设置为 400。 diff --git a/11=initkoa/winston-logs/.531a9d869ad78817b294bb10538cf39c768c399c-audit.json b/11=initkoa/winston-logs/.531a9d869ad78817b294bb10538cf39c768c399c-audit.json new file mode 100644 index 0000000..998969d --- /dev/null +++ b/11=initkoa/winston-logs/.531a9d869ad78817b294bb10538cf39c768c399c-audit.json @@ -0,0 +1,15 @@ +{ + "keep": { + "days": true, + "amount": 365 + }, + "auditLog": "winston-logs\\.531a9d869ad78817b294bb10538cf39c768c399c-audit.json", + "files": [ + { + "date": 1700982032692, + "name": "winston-logs\\2023-11-26-ERROR-winston.log", + "hash": "e5fced60631fffc215a2e3dff7375927cce2c3a08733d5248fcd62d38605d9cf" + } + ], + "hashType": "sha256" +} \ No newline at end of file diff --git a/11=initkoa/winston-logs/.73ddc5c05eabfb2fbd34531dacb4b30796a6a127-audit.json b/11=initkoa/winston-logs/.73ddc5c05eabfb2fbd34531dacb4b30796a6a127-audit.json new file mode 100644 index 0000000..8794ea8 --- /dev/null +++ b/11=initkoa/winston-logs/.73ddc5c05eabfb2fbd34531dacb4b30796a6a127-audit.json @@ -0,0 +1,15 @@ +{ + "keep": { + "days": true, + "amount": 30 + }, + "auditLog": "winston-logs\\.73ddc5c05eabfb2fbd34531dacb4b30796a6a127-audit.json", + "files": [ + { + "date": 1700982032690, + "name": "winston-logs\\2023-11-26-INFO--winston.log", + "hash": "cadad92fc4e02daa16a74f3393477d1660712c56e24b993c976cc386da130469" + } + ], + "hashType": "sha256" +} \ No newline at end of file diff --git a/12=react-template/.eslintrc.cjs b/12=react-template/.eslintrc.cjs new file mode 100644 index 0000000..c26b102 --- /dev/null +++ b/12=react-template/.eslintrc.cjs @@ -0,0 +1,21 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + settings: { react: { version: '18.2' } }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + indent: [2, 4, { SwitchCase: 1 }], + }, +} diff --git a/12=react-template/.gitignore b/12=react-template/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/12=react-template/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/12=react-template/README.md b/12=react-template/README.md new file mode 100644 index 0000000..40bf467 --- /dev/null +++ b/12=react-template/README.md @@ -0,0 +1,8 @@ +# HotoKiss + +带加载中的react + +前端: + +1. redux状态管理一点点 +2. redux学习一点点 diff --git a/12=react-template/index.html b/12=react-template/index.html new file mode 100644 index 0000000..685ea89 --- /dev/null +++ b/12=react-template/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + Vite + React + + +
      +
      +
      +
      +
      +
      +
      waiting
      +
      +
      + + + diff --git a/12=react-template/package.json b/12=react-template/package.json new file mode 100644 index 0000000..a2f5ff4 --- /dev/null +++ b/12=react-template/package.json @@ -0,0 +1,30 @@ +{ + "name": "react-template", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@reduxjs/toolkit": "^1.9.7", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.20.0", + "redux": "^4.2.1", + "sass": "^1.69.5" + }, + "devDependencies": { + "@types/react": "^18.2.37", + "@types/react-dom": "^18.2.15", + "@vitejs/plugin-react": "^4.2.0", + "eslint": "^8.53.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.4", + "vite": "^5.0.0" + } +} diff --git a/12=react-template/pnpm-lock.yaml b/12=react-template/pnpm-lock.yaml new file mode 100644 index 0000000..546f4f8 --- /dev/null +++ b/12=react-template/pnpm-lock.yaml @@ -0,0 +1,2543 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@reduxjs/toolkit': + specifier: ^1.9.7 + version: 1.9.7(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-router-dom: + specifier: ^6.20.0 + version: 6.20.0(react-dom@18.2.0)(react@18.2.0) + redux: + specifier: ^4.2.1 + version: 4.2.1 + sass: + specifier: ^1.69.5 + version: 1.69.5 + +devDependencies: + '@types/react': + specifier: ^18.2.37 + version: 18.2.38 + '@types/react-dom': + specifier: ^18.2.15 + version: 18.2.17 + '@vitejs/plugin-react': + specifier: ^4.2.0 + version: 4.2.0(vite@5.0.2) + eslint: + specifier: ^8.53.0 + version: 8.54.0 + eslint-plugin-react: + specifier: ^7.33.2 + version: 7.33.2(eslint@8.54.0) + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.54.0) + eslint-plugin-react-refresh: + specifier: ^0.4.4 + version: 0.4.4(eslint@8.54.0) + vite: + specifier: ^5.0.0 + version: 5.0.2(sass@1.69.5) + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@babel/code-frame@7.23.4: + resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + + /@babel/compat-data@7.23.3: + resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.3: + resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.4 + '@babel/generator': 7.23.4 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) + '@babel/helpers': 7.23.4 + '@babel/parser': 7.23.4 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.4 + '@babel/types': 7.23.4 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.4: + resolution: {integrity: sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.4 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.3 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.4 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.4 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.4 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.4 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.4 + dev: true + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.23.4: + resolution: {integrity: sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.4 + '@babel/types': 7.23.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.23.4: + resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.4 + dev: true + + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime@7.23.4: + resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: false + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.4 + '@babel/parser': 7.23.4 + '@babel/types': 7.23.4 + dev: true + + /@babel/traverse@7.23.4: + resolution: {integrity: sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.4 + '@babel/generator': 7.23.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.4 + '@babel/types': 7.23.4 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.23.4: + resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@esbuild/android-arm64@0.19.7: + resolution: {integrity: sha512-YEDcw5IT7hW3sFKZBkCAQaOCJQLONVcD4bOyTXMZz5fr66pTHnAet46XAtbXAkJRfIn2YVhdC6R9g4xa27jQ1w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.7: + resolution: {integrity: sha512-YGSPnndkcLo4PmVl2tKatEn+0mlVMr3yEpOOT0BeMria87PhvoJb5dg5f5Ft9fbCVgtAz4pWMzZVgSEGpDAlww==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.7: + resolution: {integrity: sha512-jhINx8DEjz68cChFvM72YzrqfwJuFbfvSxZAk4bebpngGfNNRm+zRl4rtT9oAX6N9b6gBcFaJHFew5Blf6CvUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.7: + resolution: {integrity: sha512-dr81gbmWN//3ZnBIm6YNCl4p3pjnabg1/ZVOgz2fJoUO1a3mq9WQ/1iuEluMs7mCL+Zwv7AY5e3g1hjXqQZ9Iw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.7: + resolution: {integrity: sha512-Lc0q5HouGlzQEwLkgEKnWcSazqr9l9OdV2HhVasWJzLKeOt0PLhHaUHuzb8s/UIya38DJDoUm74GToZ6Wc7NGQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.7: + resolution: {integrity: sha512-+y2YsUr0CxDFF7GWiegWjGtTUF6gac2zFasfFkRJPkMAuMy9O7+2EH550VlqVdpEEchWMynkdhC9ZjtnMiHImQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.7: + resolution: {integrity: sha512-CdXOxIbIzPJmJhrpmJTLx+o35NoiKBIgOvmvT+jeSadYiWJn0vFKsl+0bSG/5lwjNHoIDEyMYc/GAPR9jxusTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.7: + resolution: {integrity: sha512-inHqdOVCkUhHNvuQPT1oCB7cWz9qQ/Cz46xmVe0b7UXcuIJU3166aqSunsqkgSGMtUCWOZw3+KMwI6otINuC9g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.7: + resolution: {integrity: sha512-Y+SCmWxsJOdQtjcBxoacn/pGW9HDZpwsoof0ttL+2vGcHokFlfqV666JpfLCSP2xLxFpF1lj7T3Ox3sr95YXww==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.7: + resolution: {integrity: sha512-2BbiL7nLS5ZO96bxTQkdO0euGZIUQEUXMTrqLxKUmk/Y5pmrWU84f+CMJpM8+EHaBPfFSPnomEaQiG/+Gmh61g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.7: + resolution: {integrity: sha512-BVFQla72KXv3yyTFCQXF7MORvpTo4uTA8FVFgmwVrqbB/4DsBFWilUm1i2Oq6zN36DOZKSVUTb16jbjedhfSHw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.7: + resolution: {integrity: sha512-DzAYckIaK+pS31Q/rGpvUKu7M+5/t+jI+cdleDgUwbU7KdG2eC3SUbZHlo6Q4P1CfVKZ1lUERRFP8+q0ob9i2w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.7: + resolution: {integrity: sha512-JQ1p0SmUteNdUaaiRtyS59GkkfTW0Edo+e0O2sihnY4FoZLz5glpWUQEKMSzMhA430ctkylkS7+vn8ziuhUugQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.7: + resolution: {integrity: sha512-xGwVJ7eGhkprY/nB7L7MXysHduqjpzUl40+XoYDGC4UPLbnG+gsyS1wQPJ9lFPcxYAaDXbdRXd1ACs9AE9lxuw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.7: + resolution: {integrity: sha512-U8Rhki5PVU0L0nvk+E8FjkV8r4Lh4hVEb9duR6Zl21eIEYEwXz8RScj4LZWA2i3V70V4UHVgiqMpszXvG0Yqhg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.7: + resolution: {integrity: sha512-ZYZopyLhm4mcoZXjFt25itRlocKlcazDVkB4AhioiL9hOWhDldU9n38g62fhOI4Pth6vp+Mrd5rFKxD0/S+7aQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.7: + resolution: {integrity: sha512-/yfjlsYmT1O3cum3J6cmGG16Fd5tqKMcg5D+sBYLaOQExheAJhqr8xOAEIuLo8JYkevmjM5zFD9rVs3VBcsjtQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.7: + resolution: {integrity: sha512-MYDFyV0EW1cTP46IgUJ38OnEY5TaXxjoDmwiTXPjezahQgZd+j3T55Ht8/Q9YXBM0+T9HJygrSRGV5QNF/YVDQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.7: + resolution: {integrity: sha512-JcPvgzf2NN/y6X3UUSqP6jSS06V0DZAV/8q0PjsZyGSXsIGcG110XsdmuWiHM+pno7/mJF6fjH5/vhUz/vA9fw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.7: + resolution: {integrity: sha512-ZA0KSYti5w5toax5FpmfcAgu3ZNJxYSRm0AW/Dao5up0YV1hDVof1NvwLomjEN+3/GMtaWDI+CIyJOMTRSTdMw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.7: + resolution: {integrity: sha512-CTOnijBKc5Jpk6/W9hQMMvJnsSYRYgveN6O75DTACCY18RA2nqka8dTZR+x/JqXCRiKk84+5+bRKXUSbbwsS0A==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.7: + resolution: {integrity: sha512-gRaP2sk6hc98N734luX4VpF318l3w+ofrtTu9j5L8EQXF+FzQKV6alCOHMVoJJHvVK/mGbwBXfOL1HETQu9IGQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.54.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@reduxjs/toolkit@1.9.7(react@18.2.0): + resolution: {integrity: sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.0.2 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + dependencies: + immer: 9.0.21 + react: 18.2.0 + redux: 4.2.1 + redux-thunk: 2.4.2(redux@4.2.1) + reselect: 4.1.8 + dev: false + + /@remix-run/router@1.13.0: + resolution: {integrity: sha512-5dMOnVnefRsl4uRnAdoWjtVTdh8e6aZqgM4puy9nmEADH72ck+uXwzpJLEKE9Q6F8ZljNewLgmTfkxUrBdv4WA==} + engines: {node: '>=14.0.0'} + dev: false + + /@rollup/rollup-android-arm-eabi@4.5.2: + resolution: {integrity: sha512-ee7BudTwwrglFYSc3UnqInDDjCLWHKrFmGNi4aK7jlEyg4CyPa1DCMrZfsN1O13YT76UFEqXz2CoN7BCGpUlJw==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.5.2: + resolution: {integrity: sha512-xOuhj9HHtn8128ir8veoQsBbAUBasDbHIBniYTEx02pAmu9EXL+ZjJqngnNEy6ZgZ4h1JwL33GMNu3yJL5Mzow==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.5.2: + resolution: {integrity: sha512-NTGJWoL8bKyqyWFn9/RzSv4hQ4wTbaAv0lHHRwf4OnpiiP4P8W0jiXbm8Nc5BCXKmWAwuvJY82mcIU2TayC20g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.5.2: + resolution: {integrity: sha512-hlKqj7bpPvU15sZo4za14u185lpMzdwWLMc9raMqPK4wywt0wR23y1CaVQ4oAFXat3b5/gmRntyfpwWTKl+vvA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.5.2: + resolution: {integrity: sha512-7ZIZx8c3u+pfI0ohQsft/GywrXez0uR6dUP0JhBuCK3sFO5TfdLn/YApnVkvPxuTv3+YKPIZend9Mt7Cz6sS3Q==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.5.2: + resolution: {integrity: sha512-7Pk/5mO11JW/cH+a8lL/i0ZxmRGrbpYqN0VwO2DHhU+SJWWOH2zE1RAcPaj8KqiwC8DCDIJOSxjV9+9lLb6aeA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.5.2: + resolution: {integrity: sha512-KrRnuG5phJx756e62wxvWH2e+TK84MP2IVuPwfge+GBvWqIUfVzFRn09TKruuQBXzZp52Vyma7FjMDkwlA9xpg==} + cpu: [arm64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.5.2: + resolution: {integrity: sha512-My+53GasPa2D2tU5dXiyHYwrELAUouSfkNlZ3bUKpI7btaztO5vpALEs3mvFjM7aKTvEbc7GQckuXeXIDKQ0fg==} + cpu: [x64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.5.2: + resolution: {integrity: sha512-/f0Q6Sc+Vw54Ws6N8fxaEe4R7at3b8pFyv+O/F2VaQ4hODUJcRUcCBJh6zuqtgQQt7w845VTkGLFgWZkP3tUoQ==} + cpu: [x64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.5.2: + resolution: {integrity: sha512-NCKuuZWLht6zj7s6EIFef4BxCRX1GMr83S2W4HPCA0RnJ4iHE4FS1695q6Ewoa6A9nFjJe1//yUu0kgBU07Edw==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.5.2: + resolution: {integrity: sha512-J5zL3riR4AOyU/J3M/i4k/zZ8eP1yT+nTmAKztCXJtnI36jYH0eepvob22mAQ/kLwfsK2TB6dbyVY1F8c/0H5A==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.5.2: + resolution: {integrity: sha512-pL0RXRHuuGLhvs7ayX/SAHph1hrDPXOM5anyYUQXWJEENxw3nfHkzv8FfVlEVcLyKPAEgDRkd6RKZq2SMqS/yg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.4 + '@babel/types': 7.23.4 + '@types/babel__generator': 7.6.7 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.4 + dev: true + + /@types/babel__generator@7.6.7: + resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} + dependencies: + '@babel/types': 7.23.4 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.4 + '@babel/types': 7.23.4 + dev: true + + /@types/babel__traverse@7.20.4: + resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + dependencies: + '@babel/types': 7.23.4 + dev: true + + /@types/prop-types@15.7.11: + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + dev: true + + /@types/react-dom@18.2.17: + resolution: {integrity: sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==} + dependencies: + '@types/react': 18.2.38 + dev: true + + /@types/react@18.2.38: + resolution: {integrity: sha512-cBBXHzuPtQK6wNthuVMV6IjHAFkdl/FOPFIlkd81/Cd1+IqkHu/A+w4g43kaQQoYHik/ruaQBDL72HyCy1vuMw==} + dependencies: + '@types/prop-types': 15.7.11 + '@types/scheduler': 0.16.8 + csstype: 3.1.2 + dev: true + + /@types/scheduler@0.16.8: + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /@vitejs/plugin-react@4.2.0(vite@5.0.2): + resolution: {integrity: sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.3) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.3) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.0 + vite: 5.0.2(sass@1.69.5) + transitivePeerDependencies: + - supports-color + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.5 + is-array-buffer: 3.0.2 + dev: true + + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-string: 1.0.7 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.tosorted@1.1.2: + resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 + dev: true + + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + + /asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 + dev: true + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001564 + electron-to-chromium: 1.4.594 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: true + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /caniuse-lite@1.0.30001564: + resolution: {integrity: sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /electron-to-chromium@1.4.594: + resolution: {integrity: sha512-xT1HVAu5xFn7bDfkjGQi9dNpMqGchUkebwf1GL7cZN32NSwwlHRPMSDJ1KN6HkS0bWUtndbSQZqvpQftKG2uFQ==} + dev: true + + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.2 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + internal-slot: 1.0.6 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.13 + dev: true + + /es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-set-tostringtag: 2.0.2 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.6 + iterator.prototype: 1.1.2 + safe-array-concat: 1.0.1 + dev: true + + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + has-tostringtag: 1.0.0 + hasown: 2.0.0 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.0 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild@0.19.7: + resolution: {integrity: sha512-6brbTZVqxhqgbpqBR5MzErImcpA0SQdoKOkcWK/U30HtQxnokIpG3TX2r0IJqbFUzqLjhU/zC1S5ndgakObVCQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.7 + '@esbuild/android-arm64': 0.19.7 + '@esbuild/android-x64': 0.19.7 + '@esbuild/darwin-arm64': 0.19.7 + '@esbuild/darwin-x64': 0.19.7 + '@esbuild/freebsd-arm64': 0.19.7 + '@esbuild/freebsd-x64': 0.19.7 + '@esbuild/linux-arm': 0.19.7 + '@esbuild/linux-arm64': 0.19.7 + '@esbuild/linux-ia32': 0.19.7 + '@esbuild/linux-loong64': 0.19.7 + '@esbuild/linux-mips64el': 0.19.7 + '@esbuild/linux-ppc64': 0.19.7 + '@esbuild/linux-riscv64': 0.19.7 + '@esbuild/linux-s390x': 0.19.7 + '@esbuild/linux-x64': 0.19.7 + '@esbuild/netbsd-x64': 0.19.7 + '@esbuild/openbsd-x64': 0.19.7 + '@esbuild/sunos-x64': 0.19.7 + '@esbuild/win32-arm64': 0.19.7 + '@esbuild/win32-ia32': 0.19.7 + '@esbuild/win32-x64': 0.19.7 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@8.54.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.54.0 + dev: true + + /eslint-plugin-react-refresh@0.4.4(eslint@8.54.0): + resolution: {integrity: sha512-eD83+65e8YPVg6603Om2iCIwcQJf/y7++MWm4tACtEswFLYMwxwVWAfwN+e19f5Ad/FOyyNg9Dfi5lXhH3Y3rA==} + peerDependencies: + eslint: '>=7' + dependencies: + eslint: 8.54.0 + dev: true + + /eslint-plugin-react@7.33.2(eslint@8.54.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.2 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.15 + eslint: 8.54.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.10 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.54.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true + + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + dev: false + + /immutable@4.3.4: + resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + hasown: 2.0.0 + side-channel: 1.0.4 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /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.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.13 + dev: true + + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 + object.assign: 4.1.4 + object.values: 1.1.7 + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-router-dom@6.20.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CbcKjEyiSVpA6UtCHOIYLUYn/UJfwzp55va4yEfpk7JBN3GPqWfHrdLkAvNCcpXr8QoihcDMuk0dzWZxtlB/mQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.13.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.20.0(react@18.2.0) + dev: false + + /react-router@6.20.0(react@18.2.0): + resolution: {integrity: sha512-pVvzsSsgUxxtuNfTHC4IxjATs10UaAtvLGVSA1tbUE4GDaOSU1Esu2xF5nWLz7KPiMuW8BJWuPFdlGYJ7/rW0w==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.13.0 + react: 18.2.0 + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /redux-thunk@2.4.2(redux@4.2.1): + resolution: {integrity: sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==} + peerDependencies: + redux: ^4 + dependencies: + redux: 4.2.1 + dev: false + + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + dependencies: + '@babel/runtime': 7.23.4 + dev: false + + /reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: false + + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 + dev: true + + /reselect@4.1.8: + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@4.5.2: + resolution: {integrity: sha512-CRK1uoROBfkcqrZKyaFcqCcZWNsvJ6yVYZkqTlRocZhO2s5yER6Z3f/QaYtO8RGyloPnmhwgzuPQpNGeK210xQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.5.2 + '@rollup/rollup-android-arm64': 4.5.2 + '@rollup/rollup-darwin-arm64': 4.5.2 + '@rollup/rollup-darwin-x64': 4.5.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.5.2 + '@rollup/rollup-linux-arm64-gnu': 4.5.2 + '@rollup/rollup-linux-arm64-musl': 4.5.2 + '@rollup/rollup-linux-x64-gnu': 4.5.2 + '@rollup/rollup-linux-x64-musl': 4.5.2 + '@rollup/rollup-win32-arm64-msvc': 4.5.2 + '@rollup/rollup-win32-ia32-msvc': 4.5.2 + '@rollup/rollup-win32-x64-msvc': 4.5.2 + fsevents: 2.3.3 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-regex: 1.1.4 + dev: true + + /sass@1.69.5: + resolution: {integrity: sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.3.4 + source-map-js: 1.0.2 + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.1 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + internal-slot: 1.0.6 + regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 + side-channel: 1.0.4 + dev: true + + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.5 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /vite@5.0.2(sass@1.69.5): + resolution: {integrity: sha512-6CCq1CAJCNM1ya2ZZA7+jS2KgnhbzvxakmlIjN24cF/PXhRMzpM/z8QgsVJA/Dm5fWUWnVEsmtBoMhmerPxT0g==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.19.7 + postcss: 8.4.31 + rollup: 4.5.2 + sass: 1.69.5 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.13 + dev: true + + /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.2 + dev: true + + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/12=react-template/public/loading.css b/12=react-template/public/loading.css new file mode 100644 index 0000000..301dd60 --- /dev/null +++ b/12=react-template/public/loading.css @@ -0,0 +1,100 @@ +body{ + background: #111111; +} +#root{ + position: relative; + background: #fefefe; + height: 100vh; + width: 100vw; +} +.openRoot{ + animation: openRoot linear 1500ms; +} +#loading { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + min-height: 200px; + min-width: 200px; + + display: flex; + align-items: center; + justify-content: center; + +} +#loaderBox{ + opacity: 1; + transition: opacity linear 1000ms; +} +.hideLoader{ + opacity: 0 !important; +} + +#upFace{ + position: absolute; + height: 50%; + width: 100%; + top: 0; + left: 0; + background: #111; + transition: top linear 1500ms; +} +#downFace{ + position: absolute; + height: 50%; + width: 100%; + bottom: 0; + left: 0; + background: #111; + transition: bottom linear 1500ms; +} +.upOpen{ + top: -50vh !important; +} +.downOpen{ + bottom: -50vh !important; +} + +#loader { + position: relative; + width: 60px; + aspect-ratio: 2; + --_g: no-repeat radial-gradient(circle closest-side, #aaa 90%, #fff0); + background: var(--_g) 0% 50%, var(--_g) 50% 50%, var(--_g) 100% 50%; + background-size: calc(100% / 3) 50%; + animation: l3 1s infinite linear; +} +#loaderText{ + position: relative; + text-align: center; + color: #fefefe; + line-height: 40px; + user-select: none; + color: #666; +} + + +@keyframes l3 { + 20% { + background-position: 0% 0%, 50% 50%, 100% 50%; + } + 40% { + background-position: 0% 100%, 50% 0%, 100% 50%; + } + 60% { + background-position: 0% 50%, 50% 100%, 100% 0%; + } + 80% { + background-position: 0% 50%, 50% 50%, 100% 100%; + } +} +@keyframes openRoot { + from{ + transform: scale(0.7) + } + to{ + transform: scale(1) + } +} diff --git a/12=react-template/public/reset.css b/12=react-template/public/reset.css new file mode 100644 index 0000000..9d802ac --- /dev/null +++ b/12=react-template/public/reset.css @@ -0,0 +1,48 @@ +/* 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; +} diff --git a/12=react-template/public/vite.svg b/12=react-template/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/12=react-template/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/12=react-template/src/App.jsx b/12=react-template/src/App.jsx new file mode 100644 index 0000000..babf152 --- /dev/null +++ b/12=react-template/src/App.jsx @@ -0,0 +1,13 @@ +import {useRoutes} from "react-router-dom"; +import routes from "@routes"; + +function App() { + const elements = useRoutes(routes) + return ( + <> + {elements} + + ) +} + +export default App diff --git a/12=react-template/src/Components/HtmlLoading/Eye/index.jsx b/12=react-template/src/Components/HtmlLoading/Eye/index.jsx new file mode 100644 index 0000000..c97285c --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/Eye/index.jsx @@ -0,0 +1,7 @@ +import css from './index.module.scss'; + +export default function Eye(){ + return
      +
      +
      +} diff --git a/12=react-template/src/Components/HtmlLoading/Eye/index.module.scss b/12=react-template/src/Components/HtmlLoading/Eye/index.module.scss new file mode 100644 index 0000000..01f7c8c --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/Eye/index.module.scss @@ -0,0 +1,38 @@ +.Eye{ + position: relative; + height: 200px; + width: 100%; + background: #333333; + display: flex; + align-items: center; + justify-content: center; + + .loader { + display: inline-flex; + gap: 10px; + } + + .loader:before, + .loader:after { + content: ""; + height: 20px; + aspect-ratio: 1; + border-radius: 50%; + background: radial-gradient(farthest-side,#000 95%,#0000) 35% 35%/6px 6px no-repeat + #fff; + transform: scaleX(var(--s,1)) rotate(0deg); + animation: l6 1s infinite linear; + } + + .loader:after { + --s: -1; + animation-delay: -0.1s; + } + + @keyframes l6 { + 100% { + transform: scaleX(var(--s,1)) rotate(360deg); + } + } + +} diff --git a/12=react-template/src/Components/HtmlLoading/One/index.jsx b/12=react-template/src/Components/HtmlLoading/One/index.jsx new file mode 100644 index 0000000..9d814ef --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/One/index.jsx @@ -0,0 +1,6 @@ +import css from './index.module.scss' +export default function One(){ + return
      +
      +
      +} diff --git a/12=react-template/src/Components/HtmlLoading/One/index.module.scss b/12=react-template/src/Components/HtmlLoading/One/index.module.scss new file mode 100644 index 0000000..a941bda --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/One/index.module.scss @@ -0,0 +1,51 @@ +.One{ + position: relative; + height: 200px; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + + + .loader { + position: relative; + display: block; + width: 44px; + height: 44px; + font-size: 15px; + box-shadow: 9px 9px 33px #d1d1d1, -9px -9px 33px #ffffff; + } + + .loader::before, + .loader::after { + content: ''; + position: absolute; + display: block; + } + + .loader_bubble::before { + top: 10px; + left: 10px; + width: 10px; + height: 10px; + background: #fff; + border-radius: 50%; + } + + .loader_bubble { + background: linear-gradient(180deg, rgb(0, 91, 228) 10%, rgb(75, 127, 240) 100%); + border-radius: 50%; + transform-origin: 50% 50%; + animation: bubble7234 1200ms cubic-bezier(0.645, 0.045, 0.355, 1) infinite; + } + + @keyframes bubble7234 { + 0% { + transform: translate3d(0,0,0) rotate(0); + } + + 100% { + transform: translate3d(0,0,0) rotate(360deg); + } + } +} diff --git a/12=react-template/src/Components/HtmlLoading/Pacman/index.jsx b/12=react-template/src/Components/HtmlLoading/Pacman/index.jsx new file mode 100644 index 0000000..173d198 --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/Pacman/index.jsx @@ -0,0 +1,15 @@ +import css from './index.module.scss' + +export default function Pacman(){ + return
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +} diff --git a/12=react-template/src/Components/HtmlLoading/Pacman/index.module.scss b/12=react-template/src/Components/HtmlLoading/Pacman/index.module.scss new file mode 100644 index 0000000..4d9a65e --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/Pacman/index.module.scss @@ -0,0 +1,123 @@ +.Pacman{ + position: relative; + height: 200px; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + background: #333333; + + .loader-wrapper { + position: relative; + //top: 0; + //left: 0; + //bottom: 0; + //right: 0; + //margin: auto; + } + + .loader-wrapper .packman::before { + content: ''; + position: absolute; + width: 50px; + height: 25px; + background-color: #EFF107; + border-radius: 100px 100px 0 0; + transform: translate(-50%, -50%); + animation: pac-top 0.5s linear infinite; + transform-origin: center bottom; + } + + .loader-wrapper .packman::after { + content: ''; + position: absolute; + width: 50px; + height: 25px; + background-color: #EFF107; + border-radius: 0 0 100px 100px; + transform: translate(-50%, 50%); + animation: pac-bot 0.5s linear infinite; + transform-origin: center top; + } + + @keyframes pac-top { + 0% { + transform: translate(-50%, -50%) rotate(0) + } + + 50% { + transform: translate(-50%, -50%) rotate(-30deg) + } + + 100% { + transform: translate(-50%, -50%) rotate(0) + } + } + + @keyframes pac-bot { + 0% { + transform: translate(-50%, 50%) rotate(0) + } + + 50% { + transform: translate(-50%, 50%) rotate(30deg) + } + + 100% { + transform: translate(-50%, 50%) rotate(0) + } + } + + .dot { + position: absolute; + z-index: -1; + top: 8px; + width: 10px; + height: 10px; + border-radius: 50%; + background: #fff; + } + + .dots .dot:nth-child(1) { + left: 90px; + animation: dot-stage1 0.5s infinite; + } + + .dots .dot:nth-child(2) { + left: 60px; + animation: dot-stage1 0.5s infinite; + } + + .dots .dot:nth-child(3) { + left: 30px; + animation: dot-stage1 0.5s infinite; + } + + .dots .dot:nth-child(4) { + left: 10px; + animation: dot-stage2 0.5s infinite; + } + + @keyframes dot-stage1 { + 0% { + transform: translate(0, 0); + } + + 100% { + transform: translate(-24px, 0); + } + } + + @keyframes dot-stage2 { + 0% { + transform: scale(1); + } + + 5%, 100% { + transform: scale(0); + } + } + + + +} diff --git a/12=react-template/src/Components/HtmlLoading/TableTennis/index.jsx b/12=react-template/src/Components/HtmlLoading/TableTennis/index.jsx new file mode 100644 index 0000000..3e05a02 --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/TableTennis/index.jsx @@ -0,0 +1,9 @@ +import css from './index.module.scss' + +export default function TableTennis(){ + return
      +
      +
      +
      +
      +} diff --git a/12=react-template/src/Components/HtmlLoading/TableTennis/index.module.scss b/12=react-template/src/Components/HtmlLoading/TableTennis/index.module.scss new file mode 100644 index 0000000..b3e8d4e --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/TableTennis/index.module.scss @@ -0,0 +1,65 @@ +.TableTennis{ + position: relative; + height: 200px; + width: 100%; + background: #333; +} + + +$up-down6123 : up-down6123; +$ball-move8234: ball-move8234; + +.ball { + position: relative; + bottom: 50px; + left: calc(100% - 20px); + width: 50px; + height: 50px; + background: #fff; + border-radius: 50%; + animation: $ball-move8234 3s ease-in-out 1s infinite alternate; +} + +.ball::after { + position: absolute; + content: ''; + top: 25px; + right: 5px; + width: 5px; + height: 5px; + background: #000; + border-radius: 50%; +} + +.bar { + position: relative; + top:100px; + width: 200px; + height: 12.5px; + background: #FFDAAF; + border-radius: 30px; + transform: rotate(-15deg); + animation: $up-down6123 3s ease-in-out 1s infinite alternate; +} + +@keyframes up-down6123 { + from { + transform: rotate(-15deg); + } + + to { + transform: rotate(15deg); + } +} + +@keyframes ball-move8234 { + from { + left: calc(100% - 40px); + transform: rotate(360deg); + } + + to { + left: calc(0% - 20px); + transform: rotate(0deg); + } +} diff --git a/12=react-template/src/Components/HtmlLoading/Three/index.jsx b/12=react-template/src/Components/HtmlLoading/Three/index.jsx new file mode 100644 index 0000000..1996dad --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/Three/index.jsx @@ -0,0 +1,7 @@ +import css from './index.module.scss' + +export default function Three(){ + return
      +
      +
      +} diff --git a/12=react-template/src/Components/HtmlLoading/Three/index.module.scss b/12=react-template/src/Components/HtmlLoading/Three/index.module.scss new file mode 100644 index 0000000..2f173af --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/Three/index.module.scss @@ -0,0 +1,34 @@ +.Three{ + position: relative; + height: 200px; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + background: #111; + + + .loader { + width: 60px; + aspect-ratio: 2; + --_g: no-repeat radial-gradient(circle closest-side, #fff 90%, #fff0); + background: var(--_g) 0% 50%, var(--_g) 50% 50%, var(--_g) 100% 50%; + background-size: calc(100% / 3) 50%; + animation: l3 1s infinite linear; + } + @keyframes l3 { + 20% { + background-position: 0% 0%, 50% 50%, 100% 50%; + } + 40% { + background-position: 0% 100%, 50% 0%, 100% 50%; + } + 60% { + background-position: 0% 50%, 50% 100%, 100% 0%; + } + 80% { + background-position: 0% 50%, 50% 50%, 100% 100%; + } + } + +} diff --git a/12=react-template/src/Components/HtmlLoading/Two/index.jsx b/12=react-template/src/Components/HtmlLoading/Two/index.jsx new file mode 100644 index 0000000..8efb985 --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/Two/index.jsx @@ -0,0 +1,8 @@ +import css from './index.module.scss' + +export default function Two(){ + return
      + +
      +
      +} diff --git a/12=react-template/src/Components/HtmlLoading/Two/index.module.scss b/12=react-template/src/Components/HtmlLoading/Two/index.module.scss new file mode 100644 index 0000000..866fa72 --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/Two/index.module.scss @@ -0,0 +1,163 @@ +.Two{ + position: relative; + height: 200px; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + + + + .chaotic-orbit { + --uib-size: 25px; + --uib-speed: 1.5s; + --uib-color: black; + position: relative; + display: flex; + align-items: center; + justify-content: center; + height: var(--uib-size); + width: var(--uib-size); + animation: rotate936 calc(var(--uib-speed) * 1.667) infinite linear; + } + + .chaotic-orbit::before, + .chaotic-orbit::after { + content: ''; + position: absolute; + height: 60%; + width: 60%; + border-radius: 50%; + background-color: var(--uib-color); + will-change: transform; + flex-shrink: 0; + } + + .chaotic-orbit::before { + animation: orbit var(--uib-speed) linear infinite; + } + + .chaotic-orbit::after { + animation: orbit var(--uib-speed) linear calc(var(--uib-speed) / -2) + infinite; + } + + @keyframes rotate936 { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } + } + + @keyframes orbit { + 0% { + transform: translate(calc(var(--uib-size) * 0.5)) scale(0.73684); + opacity: 0.65; + } + + 5% { + transform: translate(calc(var(--uib-size) * 0.4)) scale(0.684208); + opacity: 0.58; + } + + 10% { + transform: translate(calc(var(--uib-size) * 0.3)) scale(0.631576); + opacity: 0.51; + } + + 15% { + transform: translate(calc(var(--uib-size) * 0.2)) scale(0.578944); + opacity: 0.44; + } + + 20% { + transform: translate(calc(var(--uib-size) * 0.1)) scale(0.526312); + opacity: 0.37; + } + + 25% { + transform: translate(0%) scale(0.47368); + opacity: 0.3; + } + + 30% { + transform: translate(calc(var(--uib-size) * -0.1)) scale(0.526312); + opacity: 0.37; + } + + 35% { + transform: translate(calc(var(--uib-size) * -0.2)) scale(0.578944); + opacity: 0.44; + } + + 40% { + transform: translate(calc(var(--uib-size) * -0.3)) scale(0.631576); + opacity: 0.51; + } + + 45% { + transform: translate(calc(var(--uib-size) * -0.4)) scale(0.684208); + opacity: 0.58; + } + + 50% { + transform: translate(calc(var(--uib-size) * -0.5)) scale(0.73684); + opacity: 0.65; + } + + 55% { + transform: translate(calc(var(--uib-size) * -0.4)) scale(0.789472); + opacity: 0.72; + } + + 60% { + transform: translate(calc(var(--uib-size) * -0.3)) scale(0.842104); + opacity: 0.79; + } + + 65% { + transform: translate(calc(var(--uib-size) * -0.2)) scale(0.894736); + opacity: 0.86; + } + + 70% { + transform: translate(calc(var(--uib-size) * -0.1)) scale(0.947368); + opacity: 0.93; + } + + 75% { + transform: translate(0%) scale(1); + opacity: 1; + } + + 80% { + transform: translate(calc(var(--uib-size) * 0.1)) scale(0.947368); + opacity: 0.93; + } + + 85% { + transform: translate(calc(var(--uib-size) * 0.2)) scale(0.894736); + opacity: 0.86; + } + + 90% { + transform: translate(calc(var(--uib-size) * 0.3)) scale(0.842104); + opacity: 0.79; + } + + 95% { + transform: translate(calc(var(--uib-size) * 0.4)) scale(0.789472); + opacity: 0.72; + } + + 100% { + transform: translate(calc(var(--uib-size) * 0.5)) scale(0.73684); + opacity: 0.65; + } + } + + +} diff --git a/12=react-template/src/Components/HtmlLoading/index.jsx b/12=react-template/src/Components/HtmlLoading/index.jsx new file mode 100644 index 0000000..480709f --- /dev/null +++ b/12=react-template/src/Components/HtmlLoading/index.jsx @@ -0,0 +1,18 @@ +import React from "react"; + +const TableTennis = React.lazy(() => import('@components/HtmlLoading/TableTennis')) +const Pacman = React.lazy(() => import("@components/HtmlLoading/Pacman/index.jsx")) +const Eye = React.lazy(() => import("@components/HtmlLoading/Eye/index.jsx")) +const One = React.lazy(() => import("@components/HtmlLoading/One/index.jsx")) +const Two = React.lazy(() => import("@components/HtmlLoading/Two/index.jsx")) +const Three = React.lazy(() => import("@components/HtmlLoading/Three/index.jsx")) +export default function HtmlLoading(){ + return
      + + + + + + +
      +} diff --git a/12=react-template/src/main.jsx b/12=react-template/src/main.jsx new file mode 100644 index 0000000..f4af1c2 --- /dev/null +++ b/12=react-template/src/main.jsx @@ -0,0 +1,45 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.jsx' +import {BrowserRouter} from "react-router-dom"; +import PrivateRoute from "@routes/PrivateRoute.jsx"; + +ReactDOM.createRoot(document.getElementById('root')).render( + + + + + + + , +) + + +window.onload = loading +function loading(){ + const nowTime = new Date().getTime() + console.log('staring...'); + const passTime = nowTime - window.startime; + console.log(window.location.pathname == '/') + if(window.location.pathname == '/' && passTime < 500){ + setTimeout(() => { + startLoad() + }, 550 - passTime) + }else{ + startLoad() + } +} +function startLoad(){ + const loader = document.querySelector('#loading'); + const upFace = document.querySelector('#upFace'); + const downFace = document.querySelector('#downFace'); + const root = document.querySelector('#root'); + const loaderBox = document.querySelector('#loaderBox'); + upFace.classList.add('upOpen') + downFace.classList.add('downOpen') + root.classList.add('openRoot') + loaderBox.classList.add('hideLoader') + setTimeout(() => { + loader.remove() + }, 1500) +} diff --git a/12=react-template/src/routes/PrivateRoute.jsx b/12=react-template/src/routes/PrivateRoute.jsx new file mode 100644 index 0000000..83c253a --- /dev/null +++ b/12=react-template/src/routes/PrivateRoute.jsx @@ -0,0 +1,18 @@ +import {useEffect} from "react"; +import { useLocation, useParams, useNavigate } from 'react-router-dom'; +export default function PrivateRoute(props){ + const location = useLocation(); + const params = useParams(); + const navigate = useNavigate() + useEffect(() => { + // console.log(location.pathname); // 获取当前路由路径 + // console.log(location.search); // 获取查询字符串 + // console.log(location.hash); // 获取 URL 中的哈希值 + // console.log(params); // 假设 URL 中有一个名为 "id" 的参数 + if(location.pathname == '/test'){ + navigate('/') + } + }, [0]); + + return props.children +} diff --git a/12=react-template/src/routes/index.jsx b/12=react-template/src/routes/index.jsx new file mode 100644 index 0000000..e8546db --- /dev/null +++ b/12=react-template/src/routes/index.jsx @@ -0,0 +1,37 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: react-template +// | @文件描述: index.jsx - +// | @创建时间: 2023-11-26 16:05 +// | @更新时间: 2023-11-26 16:05 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import { Navigate } from 'react-router-dom' +import React from "react"; + +const Test = React.lazy(() => import("@views/Test/index.jsx")) +const HtmlLoading = React.lazy(() => import("@components/HtmlLoading/index.jsx")) + +const routes = [ + { + path: '/about', + element: + }, { + path: '/home', + element: + }, /*{ + path: '/', + element: + }*/, { + path: '/', + element: + } +] + +export default routes + diff --git a/12=react-template/src/store/index.js b/12=react-template/src/store/index.js new file mode 100644 index 0000000..264cf9a --- /dev/null +++ b/12=react-template/src/store/index.js @@ -0,0 +1,23 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: react-template +// | @文件描述: index.js - +// | @创建时间: 2023-11-26 16:47 +// | @更新时间: 2023-11-26 16:47 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import { configureStore } from '@reduxjs/toolkit'; +import DefaultSlice from "@/store/slice/defaultSlice.js"; + +const store = configureStore({ + reducer: { + defaultSlice: DefaultSlice, + }, +}); + +export default store; diff --git a/12=react-template/src/store/slice/defaultSlice.js b/12=react-template/src/store/slice/defaultSlice.js new file mode 100644 index 0000000..98ffb46 --- /dev/null +++ b/12=react-template/src/store/slice/defaultSlice.js @@ -0,0 +1,63 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: react-template +// | @文件描述: defaultSlice.js - +// | @创建时间: 2023-11-26 17:20 +// | @更新时间: 2023-11-26 17:20 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + + +import {createAsyncThunk, createSlice} from '@reduxjs/toolkit'; + +export const decremented = createAsyncThunk( + 'user/fetchData', + async (data, thunkAPI) => { + // 调用API + console.log(data, thunkAPI) + await new Promise(res => { + + setTimeout(() =>{ + res() + }, 1000) + }) + return; // 或根据你的API返回结构进行调整 + } +); + + +export const defaultSlice = createSlice({ + name: 'defaultSlice', + initialState: { + value: 0, + }, + reducers: { + incremented: (state,b) => { + state.value += 1; + }, + }, + extraReducers: { + // 当 fetchUserData action 被派发时,根据 action 的不同状态对 state 进行更新 + [decremented.pending]: (state, action) => { + // state.isLoading = true; + // state.error = null; + }, + [decremented.fulfilled]: (state, action) => { + // state.isLoading = false; + // state.data = action.payload; // 假设我们的API返回了用户的数据结构 + state.value -= 1; + }, + [decremented.rejected]: (state, action) => { + // state.isLoading = false; + // state.error = action.error.message; + }, + }, +}); + +export const { incremented } = defaultSlice.actions; + +export default defaultSlice.reducer; diff --git a/12=react-template/src/views/Test/index.jsx b/12=react-template/src/views/Test/index.jsx new file mode 100644 index 0000000..4467379 --- /dev/null +++ b/12=react-template/src/views/Test/index.jsx @@ -0,0 +1,24 @@ +import {useEffect, useState} from "react"; +import store from "@/store/index.js"; +import {incremented, decremented} from "@/store/slice/defaultSlice.js"; + +export default function Test(){ + + const [count, setCount] = useState(store.getState().defaultSlice.value); + + useEffect(() => { + console.log(store.getState()) + const unsubscribe = store.subscribe(() => { + setCount(store.getState().defaultSlice.value); + }); + return unsubscribe; // 在组件卸载时取消订阅 + }, []); + + + + return
      +

      {count}

      + + +
      +} diff --git a/12=react-template/test/react-router-dom.md b/12=react-template/test/react-router-dom.md new file mode 100644 index 0000000..9c4f7f8 --- /dev/null +++ b/12=react-template/test/react-router-dom.md @@ -0,0 +1 @@ +https://blog.csdn.net/qq_30769437/article/details/128149273 diff --git a/12=react-template/test/redux.md b/12=react-template/test/redux.md new file mode 100644 index 0000000..31adbcc --- /dev/null +++ b/12=react-template/test/redux.md @@ -0,0 +1,314 @@ +如果你需要创建一个Redux应用,但不想使用react-redux和`createStore`(这通常是Redux的标准API用于创建store的方法),你可以使用Redux Toolkit中的`configureStore`作为`createStore`的替代方案来创建store。 + +Redux Toolkit 是官方推荐的方式来设置store,它提供了更简化的API和一些有用的工具,比如默认集成了redux-thunk中间件以及Redux DevTools扩展支持。下面是一个不使用react-redux的示例,但是如果你想完全不使用任何辅助工具或库,仅使用最基本的Redux API(这是不推荐的,因为你会失去许多便利和性能优化),那你将需要自己管理store的状态订阅和更新组件的渲染。 + +下面是一个不使用`createStore`和`react-redux`的Redux应用例子: + +目录结构: +``` +my-app/ + src/ + store/ + index.js // 创建和配置应用程序的Redux store + counterReducer.js // 管理计数状态的reducer + components/ + Counter.js // 一个使用Redux store的React组件 + App.js // 应用程序的根组件 + index.js // 应用程序的主入口文件 +``` + +`store/index.js`: +```javascript +import { configureStore } from '@reduxjs/toolkit'; +import counterReducer from './counterReducer'; + +const store = configureStore({ + reducer: { + counter: counterReducer, + }, +}); + +export default store; +``` + +`store/counterReducer.js`: +```javascript +const INCREMENT = 'INCREMENT'; +const DECREMENT = 'DECREMENT'; + +const initialState = { + value: 0, +}; + +function counterReducer(state = initialState, action) { + switch (action.type) { + case INCREMENT: + return { ...state, value: state.value + 1 }; + case DECREMENT: + return { ...state, value: state.value - 1 }; + default: + return state; + } +} + +export const increment = () => ({ type: INCREMENT }); +export const decrement = () => ({ type: DECREMENT }); + +export default counterReducer; +``` + +`components/Counter.js`: +```jsx +import React, { useState, useEffect } from 'react'; +import store from '../store'; +import { increment, decrement } from '../store/counterReducer'; + +export const Counter = () => { + const [count, setCount] = useState(store.getState().counter.value); + + useEffect(() => { + const unsubscribe = store.subscribe(() => { + setCount(store.getState().counter.value); + }); + return unsubscribe; // 在组件卸载时取消订阅 + }, []); + + return ( +
      +

      {count}

      + + +
      + ); +}; +``` + +`App.js`: +```jsx +import React from 'react'; +import { Counter } from './components/Counter'; + +const App = () => { + return ( +
      + +
      + ); +} + +export default App; +``` + +`index.js`: +```jsx +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App'; +import store from './store'; +import { increment } from './store/counterReducer'; + +// 可以在这里测试我们的Redux store是否正常工作 +console.log(store.getState()); // 应该看到初始状态 +store.dispatch(increment()); +console.log(store.getState()); // 状态应该更新,并增加了1 + +ReactDOM.render( + + + , + document.getElementById('root') +); +``` + +在上述的示例中,我们使用`useEffect`来订阅Redux store和清理订阅,通过store的`getState`方法获取当前的状态,并通过`dispatch`方法来派发actions。这种方式下,我们没有使用react-redux,而是手动连接到Redux store并监听状态变化。 + +请注意,这样手动处理Redux可能会使你的应用程序难以管理和扩展,特别是在大型应用程序中,react-redux提供的`Provider`和`connect`方法或者hooks`useSelector`和`useDispatch`可以更好地帮助你管理连接逻辑和组件更新,提高应用的性能。 + + + + + + + + + + + + + + + + + + + + + + + + + + + +在 Redux Toolkit 中,`createSlice` 通常用于同步更新 state ,但当它与 `createAsyncThunk` 一起使用时,可以非常容易地用于异步更新。`createAsyncThunk` 会生成三种 action 类型(pending,fulfilled,rejected),你可以在 `createSlice` 的 `extraReducers` 属性中监听这些 action: + +```javascript +import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; +import { userAPI } from './userAPI'; + +// 首先创建一个异步 thunk action +export const fetchUserData = createAsyncThunk( + 'user/fetchData', + async (userId, thunkAPI) => { + // 调用API + const response = await userAPI.fetchById(userId); + return response.data; // 或根据你的API返回结构进行调整 + } +); + +// 然后创建 slice,这里我们可以处理我们上面定义的三种状态的actions +const userSlice = createSlice({ + name: 'user', + initialState: { + data: null, + isLoading: false, + error: null, + }, + reducers: { + // 你的其他同步 reducers 可以在这里定义 + }, + extraReducers: { + // 当 fetchUserData action 被派发时,根据 action 的不同状态对 state 进行更新 + [fetchUserData.pending]: (state, action) => { + state.isLoading = true; + state.error = null; + }, + [fetchUserData.fulfilled]: (state, action) => { + state.isLoading = false; + state.data = action.payload; // 假设我们的API返回了用户的数据结构 + }, + [fetchUserData.rejected]: (state, action) => { + state.isLoading = false; + state.error = action.error.message; + }, + }, +}); + +export const { actions, reducer } = userSlice; +``` + +在这个例子中: + +- `fetchUserData.pending` 相关的 reducer 将在请求开始时将 `isLoading` 状态设置为 true。 +- `fetchUserData.fulfilled` 相关的 reducer 将在请求成功并收到数据时更新 `data` ,并将 `isLoading` 设置为 false。 +- `fetchUserData.rejected` 相关的 reducer 将在请求失败时设置错误信息,并将 `isLoading` 设置为 false。 + +通过使用 `createAsyncThunk` 和 `createSlice` 的 `extraReducers` ,我们也很方便的可以将异步行为整合到我们的 Redux state 管理中。 + + + + + + + + + + + + + +在视图(常常指的是 React 组件)中使用 `@reduxjs/toolkit` 中 `createAsyncThunk` 创建的异步 action 通常涉及以下几个步骤: + +1. 将 Redux store 和 React 组件连接起来,可以使用 `react-redux` 提供的 `useSelector` 来选择 state,以及 `useDispatch` 来派发 actions。 + +2. 创建视图(UI组件),并在适当的时候(如组件挂载或者用户互动事件)派发异步 action。 + +3. 显示加载状态、错误信息或者成功得到的数据。 + +下面是一个例子,展示了如何在一个 React 组件中使用异步 action: + +```jsx +import React, { useEffect } from 'react'; +import { useSelector, useDispatch } from 'react-redux'; +import { fetchUserData } from './userSlice'; +// 以上的 userSlice 是我们之前定义的包含 fetchUserData 异步 action 的文件 + +function UserComponent({ userId }) { + const dispatch = useDispatch(); + + // 从 Redux state 中选择数据 + const user = useSelector(state => state.user.data); + const isLoading = useSelector(state => state.user.isLoading); + const error = useSelector(state => state.user.error); + + // 当组件挂载时,派发 fetchUserData action + useEffect(() => { + dispatch(fetchUserData(userId)); + }, [userId, dispatch]); + + // 根据 state 渲染 UI + if (isLoading) { + return
      Loading...
      ; + } + + if (error) { + return
      Error: {error}
      ; + } + + return ( +
      +

      User Data

      + {/* 假设 user 对象有 name 属性 */} + {user ?

      Name: {user.name}

      :

      No user details

      } +
      + ); +} + +export default UserComponent; +``` + +在这个 React 组件中: + +- 使用 `useDispatch` hook 获取 `dispatch` 方法,以便于我们可以派发 actions。 +- 使用 `useSelector` hook 从 Redux store 中选择 `user.state` 中的各部分数据。 +- 使用 `useEffect` React hook 来触发 `fetchUserData` 异步 action。当 `userId` 改变或者组件首次渲染时会重新触发。 +- 在 UI 中根据 `isLoading`, `error`, 和 `user` 状态显示不同的内容。如果 `isLoading` 为 true,显示加载状态;如果 `error` 存在,则显示错误;否则显示用户信息。 + + + + + + + + +在 `createAsyncThunk` 中使用的 `thunkAPI` 对象是由 Redux Thunk 提供的一个参数,包含了几个有用的属性和方法,使得在 thunk 中可以执行更为复杂的逻辑。`thunkAPI` 在每次调用异步 thunk 函数时都会被提供,并且具有以下字段和方法: + +1. **dispatch**: 允许你在 thunk 中派发 action。 +2. **getState**: 允许你访问当前的 Redux store state。 +3. **extra**: 如果在创建 Redux store 的 `configureStore` 方法中定义了 `extraArgument`,则这里可以取得。 +4. **requestId**: 是对每次异步 thunk action 调用的唯一标识。 +5. **signal**: 是一个 `AbortSignal` 对象,与本次异步操作相关联,可以用来响应取消操作。 +6. **rejectWithValue**: 一个函数,允许你在发生错误时手动地派发一个拒绝 (rejected) action,并携带自定义的 payload 值。 +7. **fulfillWithValue**: 当你需要在 resolve (解决) action 中提供一个不同于异步操作返回结果的 payload 时,可以用这个函数。 +8. **rejectWithReason**: 类似 `rejectWithValue`,允许在 rejected action 中提供自定义拒绝原因,更明确地说明拒绝的原因。 + +这些功能给予开发者很大的灵活性去处理异步逻辑和实现复杂的异步操作流程。例如,使用 `dispatch` 来派发其他 actions,利用 `getState` 获取最新的 state 来指导后续逻辑,或使用 `rejectWithValue` 在出错时捕捉错误并优化错误处理。 + +以下是一个使用 `thunkAPI` 的例子: + +```javascript +export const fetchUserData = createAsyncThunk( + 'user/fetchData', + async (userId, thunkAPI) => { + try { + const response = await userAPI.fetchById(userId); + return response.data; + } catch (error) { + // 如果 API 抛出一个错误,我们可以选择发送一个拒绝action,并附带一个自定义的payload + return thunkAPI.rejectWithValue({errorMessage: 'Cannot load user data'}); + } + } +); +``` + +在这个例子中,如果 `userAPI.fetchById` 方法抛出一个错误,`thunkAPI.rejectWithValue` 方法则被用来派发一个拒绝的 action,并附上一个含错误信息的 payload。这使得 reducer 可以捕捉这个拒绝的 action,并根据附带的 payload 更新 state。 diff --git a/12=react-template/vite.config.js b/12=react-template/vite.config.js new file mode 100644 index 0000000..5385465 --- /dev/null +++ b/12=react-template/vite.config.js @@ -0,0 +1,17 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import path from 'path' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + '@views':path.resolve(__dirname, './src/views'), + '@components': path.resolve(__dirname, './src/components'), + '@utils': path.resolve(__dirname, './src/utils'), + '@routes': path.resolve(__dirname, './src/routes') + }, + }, +}) diff --git a/13=graphResource2/.eslintrc.cjs b/13=graphResource2/.eslintrc.cjs new file mode 100644 index 0000000..ce0bb13 --- /dev/null +++ b/13=graphResource2/.eslintrc.cjs @@ -0,0 +1,65 @@ +module.exports = { + "env": { + "browser": true, + "es2021": true, + "es2022": true, + "es2023": true, + }, + "extends": ["eslint:recommended"], + "overrides": [ + { + "env": { + "node": true + }, + "files": [ + ".eslintrc.{js,cjs}" + ], + "parserOptions": { + "sourceType": "script" + } + } + ], + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + indent: ['error', 4, { "SwitchCase": 1 }], // 用于指定代码缩进的方式,这里配置为使用四个空格进行缩进。 + // 'linebreak-style': [0, 'error', 'windows'], // 用于指定换行符的风格,这里配置为使用 Windows 风格的换行符(\r\n)。 + quotes: ['error', 'single'], // 用于指定字符串的引号风格,这里配置为使用单引号作为字符串的引号。 + semi: ['error', 'always'], //用于指定是否需要在语句末尾添加分号,这里配置为必须始终添加分号。 + "no-console": 2,//禁止使用console + "no-const-assign": 2,//禁止修改const声明的变量 + "no-empty": 2,//块语句中的内容不能为空 + "no-extra-parens": 2,//禁止非必要的括号 + "no-extra-semi": 2,//禁止多余的冒号 + "no-fallthrough": 1,//禁止switch穿透 + "no-func-assign": 2,//禁止重复的函数声明 + "no-inline-comments": 2,//禁止行内备注 + "no-irregular-whitespace": 2,//不能有不规则的空格 + "no-mixed-spaces-and-tabs": [2, false],//禁止混用tab和空格 + "no-multi-spaces": 1,//不能用多余的空格 + "no-multiple-empty-lines": [1, {"max": 2}],//空行最多不能超过2行 + "no-nested-ternary": 0,//禁止使用嵌套的三目运算 + "no-redeclare": 2,//禁止重复声明变量 + "no-shadow": 2,//外部作用域中的变量不能与它所包含的作用域中的变量或参数同名 + "no-trailing-spaces": 2,//一行结束后面不要有空格 + "no-unexpected-multiline": 2,//避免多行表达式 + "no-unused-vars": [2, {"vars": "all", "args": "after-used"}],//不能有声明后未被使用的变量或参数 + "no-use-before-define": 2,//未定义前不能使用 + "no-var": 2,//禁用var,用let和const代替 + "arrow-parens": 0,//箭头函数用小括号括起来 + "array-bracket-spacing": [2, "never"],//是否允许非空数组里面有多余的空格 + "camelcase": 2,//强制驼峰法命名 + "comma-style": [2, "last"],//逗号风格,换行时在行首还是行尾 + "comma-spacing": ["error", {"before": false, "after": true}],//对象字面量中冒号的前后空格 + "key-spacing": ["error", { "beforeColon": false, "afterColon": true }],// 冒号后面有空格 + "lines-around-comment": 0,//行前/行后备注 + "array-bracket-spacing": ["error", "always"],// 检查数组字面量中的元素之间的空格。 + }, + "globals": { + global: true, + Buffer: true, + process: true + } +} diff --git a/13=graphResource2/.gitignore b/13=graphResource2/.gitignore new file mode 100644 index 0000000..805bc40 --- /dev/null +++ b/13=graphResource2/.gitignore @@ -0,0 +1,135 @@ +# ---> Node +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +pnpm-debug.log* +.pnpm-debug.log* +# log +winston-logs/* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + diff --git a/13=graphResource2/.prettierrc.json b/13=graphResource2/.prettierrc.json new file mode 100644 index 0000000..f4f39af --- /dev/null +++ b/13=graphResource2/.prettierrc.json @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "tabWidth": 4 +} diff --git a/13=graphResource2/OM系统资源结构实例.xmind b/13=graphResource2/OM系统资源结构实例.xmind new file mode 100644 index 0000000..0727090 Binary files /dev/null and b/13=graphResource2/OM系统资源结构实例.xmind differ diff --git a/13=graphResource2/README.md b/13=graphResource2/README.md new file mode 100644 index 0000000..6126abf --- /dev/null +++ b/13=graphResource2/README.md @@ -0,0 +1,10 @@ +# HotoKiss + +动态资源管理 + +后端: + +1. squelize,生成model SQL文件 +2. Koa较完整的学习 +3. ajvDTO使用 +4. 缓存 diff --git a/13=graphResource2/bootstrap.js b/13=graphResource2/bootstrap.js new file mode 100644 index 0000000..c4ee125 --- /dev/null +++ b/13=graphResource2/bootstrap.js @@ -0,0 +1,110 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: bootstrap.js - Koa项目启动文件 +// | @创建时间: 2023-11-25 21:17 +// | @更新时间: 2023-11-25 21:17 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + + +import devConfig from '#root/development.env.js'; +import prodConfig from '#root/production.env.js'; +import startApp from '#home/app.js'; +import winston from "winston"; +import {logger, colorizer} from "#common/logger/index.js"; +import createDatabase from "#common/database/index.js"; +import {createCatch} from "#cache/index.js"; +import initData from "#common/database/initData.js"; +// | 获取ENV +const ENV = process.env.NODE_ENV && process.env.NODE_ENV.toLowerCase().trim(); + +if (ENV === 'development' || ENV === undefined) { + global.config = devConfig; + logger.add(new winston.transports.Console({ + format:winston.format.combine( + winston.format.printf( + (i) => { + return colorizer.colorize( + i.level, + i.message + ); + }, + ), + ) + })) +} else if (ENV === 'production') { + global.config = prodConfig; + logger.exceptions.handle(new winston.transports.File({ filename: 'winston-logs/winston-exceptions.log' })); + logger.rejections.handle(new winston.transports.File({ filename: 'winston-logs/winston-rejections.log' })) +} else { + throw new Error(`未识别的环境变量${ENV}`); +} +global.logger = logger +global.ENV = ENV; + +// = 函数名: checkPort +// = 描述: 检测服务端口是否正常 +// = 参数: None +// = 返回值: undefined +// = 创建人: nie +// = 创建时间: 2023-11-25 21:49:22 - +function checkPort() { + if ( + typeof global.config.port !== 'number' || + global.config.port > 65536 || + global.config.port < 3000 + ) { + throw new Error(`服务监听端口不合法:${global.config.port}`); + } +} +checkPort(); + +// = 函数名: checkAppName +// = 描述: 检测服务名是否正常 +// = 参数: None +// = 返回值: undefined +// = 创建人: nie +// = 创建时间: 2023-11-25 21:51:03 - +function checkAppName() { + if (!global.config.appName) { + throw new Error(`服务名不存在:${global.config.appName}`); + } +} +checkAppName() +// process.stdout.write('\u001b[2J\u001b[0;0H'); +async function createApp(){ + const sequelize = createDatabase(logger); + + await sequelize.sync({alter: true}) + await sequelize.authenticate().catch(e => { + console.error(`数据库连接失败, ${e}`); + throw new Error(e) + }); + logger.info(`== 已成功与数据库建立连接。 ==`); + + await initData(sequelize) + + await createCatch(sequelize) + + + + + const app = startApp(); + + sequelize.getQueryInterface().showAllTables().then(data => { + // console.log(data) + }).catch(e => { + console.error(e) + }) + + app.context.sequelize = sequelize + app.listen(config.port); + logger.info( `Web服务 ${global.config.appName} 启动成功,访问: http://127.0.0.1:${global.config.port}`) +} +createApp() + diff --git a/13=graphResource2/development.env.js b/13=graphResource2/development.env.js new file mode 100644 index 0000000..545f0e2 --- /dev/null +++ b/13=graphResource2/development.env.js @@ -0,0 +1,22 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: development.env.js - +// | @创建时间: 2023-11-25 21:36 +// | @更新时间: 2023-11-25 21:36 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import prodConfig from "#root/production.env.js"; + +const config = { + port: 5000, +} + +const devConfig = {...prodConfig, ...config} + +export default devConfig diff --git a/13=graphResource2/gen-Model/models/init-models.js b/13=graphResource2/gen-Model/models/init-models.js new file mode 100644 index 0000000..412134f --- /dev/null +++ b/13=graphResource2/gen-Model/models/init-models.js @@ -0,0 +1,38 @@ +var DataTypes = require("sequelize").DataTypes; +var _lauchuser = require("./lauchuser"); +var _lauchuserexpandfield = require("./lauchuserexpandfield"); +var _lauchuserexpandrecord = require("./lauchuserexpandrecord"); +var _lauchuserloginrecord = require("./lauchuserloginrecord"); +var _lauchuserpasswd = require("./lauchuserpasswd"); +var _lauchuserstructauthority = require("./lauchuserstructauthority"); +var _lauchuserstructorganization = require("./lauchuserstructorganization"); +var _lauchuserstructrelationorganizationaccent = require("./lauchuserstructrelationorganizationaccent"); +var _lauchuserstructrelationorganizationauthority = require("./lauchuserstructrelationorganizationauthority"); + +function initModels(sequelize) { + var lauchuser = _lauchuser(sequelize, DataTypes); + var lauchuserexpandfield = _lauchuserexpandfield(sequelize, DataTypes); + var lauchuserexpandrecord = _lauchuserexpandrecord(sequelize, DataTypes); + var lauchuserloginrecord = _lauchuserloginrecord(sequelize, DataTypes); + var lauchuserpasswd = _lauchuserpasswd(sequelize, DataTypes); + var lauchuserstructauthority = _lauchuserstructauthority(sequelize, DataTypes); + var lauchuserstructorganization = _lauchuserstructorganization(sequelize, DataTypes); + var lauchuserstructrelationorganizationaccent = _lauchuserstructrelationorganizationaccent(sequelize, DataTypes); + var lauchuserstructrelationorganizationauthority = _lauchuserstructrelationorganizationauthority(sequelize, DataTypes); + + + return { + lauchuser, + lauchuserexpandfield, + lauchuserexpandrecord, + lauchuserloginrecord, + lauchuserpasswd, + lauchuserstructauthority, + lauchuserstructorganization, + lauchuserstructrelationorganizationaccent, + lauchuserstructrelationorganizationauthority, + }; +} +module.exports = initModels; +module.exports.initModels = initModels; +module.exports.default = initModels; diff --git a/13=graphResource2/gen-Model/models/lauchuser.js b/13=graphResource2/gen-Model/models/lauchuser.js new file mode 100644 index 0000000..3fa6f0b --- /dev/null +++ b/13=graphResource2/gen-Model/models/lauchuser.js @@ -0,0 +1,58 @@ +const Sequelize = require('sequelize'); +module.exports = function (sequelize, DataTypes) { + return sequelize.define('lauchuser', { + uuid: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + comment: "用户唯一ID" + }, + username: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "用户名" + }, + email: { + type: DataTypes.STRING(255), + allowNull: false + }, + createTime: { + type: DataTypes.DATE, + allowNull: false, + comment: "创建时间" + }, + status: { + type: DataTypes.INTEGER.UNSIGNED.ZEROFILL, + allowNull: false, + defaultValue: 0000000000, + comment: "0正常1注销2停用" + }, + selfSequence: { + type: DataTypes.INTEGER, + allowNull: false, + autoIncrement: true, + comment: "自增序列" + } + }, { + sequelize, + tableName: 'lauchuser', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + {name: "uuid"}, + ] + }, + { + name: "selfSequence", + using: "BTREE", + fields: [ + {name: "selfSequence"}, + ] + }, + ] + }); +}; diff --git a/13=graphResource2/gen-Model/models/lauchuserexpandfield.js b/13=graphResource2/gen-Model/models/lauchuserexpandfield.js new file mode 100644 index 0000000..18c9177 --- /dev/null +++ b/13=graphResource2/gen-Model/models/lauchuserexpandfield.js @@ -0,0 +1,82 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserexpandfield', { + expandFieldId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true, + comment: "拓展字段ID" + }, + fieldIdentify: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "字段标识" + }, + displayName: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "字段名" + }, + fieldDescribe: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "字段描述" + }, + defaultValue: { + type: DataTypes.STRING(255), + allowNull: true, + comment: "默认值" + }, + storageType: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "存储类型" + }, + storageLength: { + type: DataTypes.INTEGER, + allowNull: false, + comment: "存储长度" + }, + isRequired: { + type: DataTypes.BOOLEAN, + allowNull: true, + comment: "是否必填" + }, + isRepeat: { + type: DataTypes.BOOLEAN, + allowNull: true, + comment: "是否可以重复" + }, + isEnable: { + type: DataTypes.BOOLEAN, + allowNull: true, + comment: "是否启用" + }, + createTime: { + type: DataTypes.DATE, + allowNull: false, + comment: "创建时间" + }, + isDelete: { + type: DataTypes.STRING(64), + allowNull: false, + defaultValue: "", + comment: "删除时间" + } + }, { + sequelize, + tableName: 'lauchuserexpandfield', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "expandFieldId" }, + ] + }, + ] + }); +}; diff --git a/13=graphResource2/gen-Model/models/lauchuserexpandrecord.js b/13=graphResource2/gen-Model/models/lauchuserexpandrecord.js new file mode 100644 index 0000000..b19f526 --- /dev/null +++ b/13=graphResource2/gen-Model/models/lauchuserexpandrecord.js @@ -0,0 +1,52 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserexpandrecord', { + expandRecordId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true, + comment: "记录ID" + }, + uuid: { + type: DataTypes.INTEGER, + allowNull: false, + comment: "用户ID" + }, + expandField: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "多占字段ID" + }, + expandFieldValue: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "拓展字段值" + }, + createTime: { + type: DataTypes.DATE, + allowNull: false, + comment: "创建时间" + }, + isDelete: { + type: DataTypes.STRING(64), + allowNull: false, + defaultValue: "", + comment: "删除时间" + } + }, { + sequelize, + tableName: 'lauchuserexpandrecord', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "expandRecordId" }, + ] + }, + ] + }); +}; diff --git a/13=graphResource2/gen-Model/models/lauchuserloginrecord.js b/13=graphResource2/gen-Model/models/lauchuserloginrecord.js new file mode 100644 index 0000000..c1d1107 --- /dev/null +++ b/13=graphResource2/gen-Model/models/lauchuserloginrecord.js @@ -0,0 +1,37 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserloginrecord', { + loginRecordId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + uuid: { + type: DataTypes.UUID, + allowNull: false + }, + recoredJson: { + type: DataTypes.TEXT, + allowNull: false + }, + createTime: { + type: DataTypes.DATE, + allowNull: false + } + }, { + sequelize, + tableName: 'lauchuserloginrecord', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "loginRecordId" }, + ] + }, + ] + }); +}; diff --git a/13=graphResource2/gen-Model/models/lauchuserpasswd.js b/13=graphResource2/gen-Model/models/lauchuserpasswd.js new file mode 100644 index 0000000..ab60d82 --- /dev/null +++ b/13=graphResource2/gen-Model/models/lauchuserpasswd.js @@ -0,0 +1,41 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserpasswd', { + passwdId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true, + comment: "密码记录ID" + }, + uuid: { + type: DataTypes.UUID, + allowNull: false, + comment: "用户ID" + }, + passwd: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "用户密码" + }, + createTime: { + type: DataTypes.DATE, + allowNull: false, + comment: "创建时间" + } + }, { + sequelize, + tableName: 'lauchuserpasswd', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "passwdId" }, + ] + }, + ] + }); +}; diff --git a/13=graphResource2/gen-Model/models/lauchuserstructauthority.js b/13=graphResource2/gen-Model/models/lauchuserstructauthority.js new file mode 100644 index 0000000..b18ded5 --- /dev/null +++ b/13=graphResource2/gen-Model/models/lauchuserstructauthority.js @@ -0,0 +1,64 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserstructauthority', { + authorityStructId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + authorityType: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "按钮、页面、接口" + }, + authorityName: { + type: DataTypes.STRING(255), + allowNull: false + }, + authorityIdentify: { + type: DataTypes.STRING(255), + allowNull: false + }, + authorityDescribe: { + type: DataTypes.STRING(255), + allowNull: false + }, + father: { + type: DataTypes.INTEGER, + allowNull: false + }, + avatar: { + type: DataTypes.STRING(255), + allowNull: false + }, + status: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "禁用启用" + }, + createTime: { + type: DataTypes.DATE, + allowNull: false + }, + isDelete: { + type: DataTypes.STRING(64), + allowNull: false, + defaultValue: "" + } + }, { + sequelize, + tableName: 'lauchuserstructauthority', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "authorityStructId" }, + ] + }, + ] + }); +}; diff --git a/13=graphResource2/gen-Model/models/lauchuserstructorganization.js b/13=graphResource2/gen-Model/models/lauchuserstructorganization.js new file mode 100644 index 0000000..0975916 --- /dev/null +++ b/13=graphResource2/gen-Model/models/lauchuserstructorganization.js @@ -0,0 +1,54 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserstructorganization', { + organizationStructId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + organizationType: { + type: DataTypes.STRING(255), + allowNull: false + }, + organizationName: { + type: DataTypes.STRING(255), + allowNull: false + }, + organizationDescribe: { + type: DataTypes.STRING(255), + allowNull: false + }, + father: { + type: DataTypes.INTEGER.UNSIGNED.ZEROFILL, + allowNull: false + }, + isDefault: { + type: DataTypes.STRING(255), + allowNull: false + }, + createTime: { + type: DataTypes.DATE, + allowNull: false + }, + isDelete: { + type: DataTypes.STRING(64), + allowNull: false, + defaultValue: "" + } + }, { + sequelize, + tableName: 'lauchuserstructorganization', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "organizationStructId" }, + ] + }, + ] + }); +}; diff --git a/13=graphResource2/gen-Model/models/lauchuserstructrelationorganizationaccent.js b/13=graphResource2/gen-Model/models/lauchuserstructrelationorganizationaccent.js new file mode 100644 index 0000000..97c33f9 --- /dev/null +++ b/13=graphResource2/gen-Model/models/lauchuserstructrelationorganizationaccent.js @@ -0,0 +1,42 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserstructrelationorganizationaccent', { + organizationRelationAccentId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + uuid: { + type: DataTypes.UUID, + allowNull: false + }, + organizationStruct: { + type: DataTypes.INTEGER, + allowNull: false + }, + createTime: { + type: DataTypes.DATE, + allowNull: false + }, + isDelete: { + type: DataTypes.STRING(64), + allowNull: false, + defaultValue: "" + } + }, { + sequelize, + tableName: 'lauchuserstructrelationorganizationaccent', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "organizationRelationAccentId" }, + ] + }, + ] + }); +}; diff --git a/13=graphResource2/gen-Model/models/lauchuserstructrelationorganizationauthority.js b/13=graphResource2/gen-Model/models/lauchuserstructrelationorganizationauthority.js new file mode 100644 index 0000000..6417ae4 --- /dev/null +++ b/13=graphResource2/gen-Model/models/lauchuserstructrelationorganizationauthority.js @@ -0,0 +1,42 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserstructrelationorganizationauthority', { + organizationRelationAuthorityId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + organizationStruct: { + type: DataTypes.INTEGER, + allowNull: false + }, + authorityStruct: { + type: DataTypes.INTEGER, + allowNull: false + }, + createTime: { + type: DataTypes.DATE, + allowNull: false + }, + isDelete: { + type: DataTypes.STRING(64), + allowNull: false, + defaultValue: "" + } + }, { + sequelize, + tableName: 'lauchuserstructrelationorganizationauthority', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "organizationRelationAuthorityId" }, + ] + }, + ] + }); +}; diff --git a/13=graphResource2/gen-Model/使用方式.md b/13=graphResource2/gen-Model/使用方式.md new file mode 100644 index 0000000..c6f1650 --- /dev/null +++ b/13=graphResource2/gen-Model/使用方式.md @@ -0,0 +1 @@ +sequelize-auto -h 数据库的IP地址 -d 数据库名 -u 用户名 -x 密码 -p 端口 -t 表名 diff --git a/13=graphResource2/graphResource2数据结构.xmind b/13=graphResource2/graphResource2数据结构.xmind new file mode 100644 index 0000000..fb6d040 Binary files /dev/null and b/13=graphResource2/graphResource2数据结构.xmind differ diff --git a/13=graphResource2/package.json b/13=graphResource2/package.json new file mode 100644 index 0000000..1f2e679 --- /dev/null +++ b/13=graphResource2/package.json @@ -0,0 +1,58 @@ +{ + "name": "initkoa", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "app.js", + "imports": { + "#root/*": "./*", + "#home/*": "./src/*", + "#routes/*": "./src/routes/*", + "#common/*": "./src/common/*", + "#dataModels/*": "./src/common/database/dataModels/*", + "#cache/*": "./src/cache/*", + "#config": "./config/config.js", + "#task/*": "./src/task/*", + "#workers/*": "./src/workers/*", + "#protocol/*": "./src/protocol/*", + "#processes/*": "./src/processes/*" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "format": "prettier --write \"src/**/*.js\"", + "start": "cross-env NODE_ENV=production node bootstrap.js", + "start:dev": "cross-env NODE_ENV=development nodemon --unhandled-rejections=throw bootstrap.js", + "start:testDev": "cross-env NODE_ENV=development node bootstrap.js", + "genmodel": "cd gen-Model && sequelize-auto -h 127.0.0.1 -d lauch -u root -x root -p 3306" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "ajv": "^8.12.0", + "ajv-errors": "^3.0.0", + "koa": "^2.14.2", + "koa-body": "^6.0.1", + "koa-compress": "^5.1.1", + "koa-json-error": "^3.1.2", + "koa-logger": "^3.2.1", + "koa-ratelimit": "^5.0.1", + "koa-router": "^12.0.1", + "koa-useragent": "^4.1.0", + "mysql2": "^3.6.5", + "sequelize": "^6.35.1", + "winston": "^3.11.0", + "winston-daily-rotate-file": "^4.7.1" + }, + "devDependencies": { + "axios": "^1.6.2", + "cross-env": "^7.0.3", + "eslint": "^8.52.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0", + "loadtest": "^8.0.5", + "nodemon": "^3.0.1", + "prettier": "^3.0.3", + "sequelize-auto": "^0.8.8" + } +} diff --git a/13=graphResource2/pnpm-lock.yaml b/13=graphResource2/pnpm-lock.yaml new file mode 100644 index 0000000..8fd99fe --- /dev/null +++ b/13=graphResource2/pnpm-lock.yaml @@ -0,0 +1,2618 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + ajv: + specifier: ^8.12.0 + version: 8.12.0 + ajv-errors: + specifier: ^3.0.0 + version: 3.0.0(ajv@8.12.0) + koa: + specifier: ^2.14.2 + version: 2.14.2 + koa-body: + specifier: ^6.0.1 + version: 6.0.1 + koa-compress: + specifier: ^5.1.1 + version: 5.1.1 + koa-json-error: + specifier: ^3.1.2 + version: 3.1.2 + koa-logger: + specifier: ^3.2.1 + version: 3.2.1 + koa-ratelimit: + specifier: ^5.0.1 + version: 5.0.1 + koa-router: + specifier: ^12.0.1 + version: 12.0.1 + koa-useragent: + specifier: ^4.1.0 + version: 4.1.0 + mysql2: + specifier: ^3.6.5 + version: 3.6.5 + sequelize: + specifier: ^6.35.1 + version: 6.35.1(mysql2@3.6.5) + winston: + specifier: ^3.11.0 + version: 3.11.0 + winston-daily-rotate-file: + specifier: ^4.7.1 + version: 4.7.1(winston@3.11.0) + +devDependencies: + axios: + specifier: ^1.6.2 + version: 1.6.2 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + eslint: + specifier: ^8.52.0 + version: 8.54.0 + eslint-config-prettier: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.54.0) + eslint-plugin-prettier: + specifier: ^5.0.0 + version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0) + loadtest: + specifier: ^8.0.5 + version: 8.0.5 + nodemon: + specifier: ^3.0.1 + version: 3.0.1 + prettier: + specifier: ^3.0.3 + version: 3.1.0 + sequelize-auto: + specifier: ^0.8.8 + version: 0.8.8(sequelize@6.35.1) + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@colors/colors@1.6.0: + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + dev: false + + /@dabh/diagnostics@2.0.3: + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + dev: false + + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.54.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.2 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 + dev: true + + /@types/accepts@1.3.7: + resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + dependencies: + '@types/node': 20.10.0 + dev: false + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.10.0 + dev: false + + /@types/co-body@6.1.3: + resolution: {integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==} + dependencies: + '@types/node': 20.10.0 + '@types/qs': 6.9.10 + dev: false + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 20.10.0 + dev: false + + /@types/content-disposition@0.5.8: + resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} + dev: false + + /@types/cookies@0.7.10: + resolution: {integrity: sha512-hmUCjAk2fwZVPPkkPBcI7jGLIR5mg4OVoNMBwU6aVsMm/iNPY7z9/R+x2fSwLt/ZXoGua6C5Zy2k5xOo9jUyhQ==} + dependencies: + '@types/connect': 3.4.38 + '@types/express': 4.17.21 + '@types/keygrip': 1.0.6 + '@types/node': 20.10.0 + dev: false + + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + + /@types/express-serve-static-core@4.17.41: + resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} + dependencies: + '@types/node': 20.10.0 + '@types/qs': 6.9.10 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: false + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.17.41 + '@types/qs': 6.9.10 + '@types/serve-static': 1.15.5 + dev: false + + /@types/formidable@2.0.6: + resolution: {integrity: sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==} + dependencies: + '@types/node': 20.10.0 + dev: false + + /@types/http-assert@1.5.5: + resolution: {integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==} + dev: false + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + dev: false + + /@types/keygrip@1.0.6: + resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} + dev: false + + /@types/koa-compose@3.2.8: + resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} + dependencies: + '@types/koa': 2.13.12 + dev: false + + /@types/koa@2.13.12: + resolution: {integrity: sha512-vAo1KuDSYWFDB4Cs80CHvfmzSQWeUb909aQib0C0aFx4sw0K9UZFz2m5jaEP+b3X1+yr904iQiruS0hXi31jbw==} + dependencies: + '@types/accepts': 1.3.7 + '@types/content-disposition': 0.5.8 + '@types/cookies': 0.7.10 + '@types/http-assert': 1.5.5 + '@types/http-errors': 2.0.4 + '@types/keygrip': 1.0.6 + '@types/koa-compose': 3.2.8 + '@types/node': 20.10.0 + dev: false + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: false + + /@types/mime@3.0.4: + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + dev: false + + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + /@types/node@20.10.0: + resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==} + dependencies: + undici-types: 5.26.5 + + /@types/qs@6.9.10: + resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==} + dev: false + + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: false + + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.10.0 + dev: false + + /@types/serve-static@1.15.5: + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/mime': 3.0.4 + '@types/node': 20.10.0 + dev: false + + /@types/triple-beam@1.3.5: + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + dev: false + + /@types/validator@13.11.7: + resolution: {integrity: sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q==} + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agent-base@4.3.0: + resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} + engines: {node: '>= 4.0.0'} + dependencies: + es6-promisify: 5.0.0 + dev: true + + /agentkeepalive@2.2.0: + resolution: {integrity: sha512-TnB6ziK363p7lR8QpeLC8aMr8EGYBKZTpgzQLfqTs3bR0Oo5VbKdwKf8h0dSzsYrB7lSCgfJnMZKqShvlq5Oyg==} + engines: {node: '>= 0.10.0'} + dev: true + + /ajv-errors@3.0.0(ajv@8.12.0): + resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} + peerDependencies: + ajv: ^8.0.1 + dependencies: + ajv: 8.12.0 + dev: false + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: false + + /async-ratelimiter@1.3.12: + resolution: {integrity: sha512-W7WWxWMjJ+XEZCyQhEWGrskqDgz3k2UWM/aUlatSl3ejFLwpM/G90AYSgkHHXeY2S53fiP204GITnmIxrJMsSQ==} + engines: {node: '>= 8'} + dev: false + + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /axios@1.6.2: + resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} + dependencies: + follow-redirects: 1.15.3 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.52 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.7.1 + dev: true + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.3.2 + dev: false + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /co-body@6.1.0: + resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} + dependencies: + inflation: 2.1.0 + qs: 6.11.2 + raw-body: 2.5.2 + type-is: 1.6.18 + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + dev: false + + /colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /confinode@2.1.1: + resolution: {integrity: sha512-u5u0ZHpYMnVWtelxjalNtLvL+SdP7B/7s0JTFUIkyvqqIf67DAvy6SKaE6WZiwbufLPk+6zJKsh5SdpbtbFi9g==} + engines: {node: '>=10.0.0'} + dependencies: + quick-lru: 5.1.1 + yaml: 1.10.2 + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /cookies@0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: false + + /cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dottie@2.0.6: + resolution: {integrity: sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==} + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: true + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: true + + /es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + dependencies: + es6-promise: 4.2.8 + dev: true + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-config-prettier@9.0.0(eslint@8.54.0): + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.54.0 + dev: true + + /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0): + resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.54.0 + eslint-config-prettier: 9.0.0(eslint@8.54.0) + prettier: 3.1.0 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.5 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.54.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /express-useragent@1.0.15: + resolution: {integrity: sha512-eq5xMiYCYwFPoekffMjvEIk+NWdlQY9Y38OsTyl13IvA728vKT+q/CSERYWzcw93HGBJcIqMIsZC5CZGARPVdg==} + engines: {node: '>=4.5'} + dev: false + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + dev: false + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /file-stream-rotator@0.6.1: + resolution: {integrity: sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==} + dependencies: + moment: 2.29.4 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + dev: false + + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + dependencies: + dezalgo: 1.0.4 + hexoid: 1.0.0 + once: 1.4.0 + qs: 6.11.2 + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + + /generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + dependencies: + is-property: 1.0.2 + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + + /hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + dev: false + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: false + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: false + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /https-proxy-agent@2.2.4: + resolution: {integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==} + engines: {node: '>= 4.5.0'} + dependencies: + agent-base: 4.3.0 + debug: 3.2.7(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /humanize-number@0.0.2: + resolution: {integrity: sha512-un3ZAcNQGI7RzaWGZzQDH47HETM4Wrj6z6E4TId8Yeq9w5ZKUVB1nrT2jwFheTUjEmqcgTjXDc959jum+ai1kQ==} + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflation@2.1.0: + resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} + engines: {node: '>= 0.8.0'} + dev: false + + /inflection@1.13.4: + resolution: {integrity: sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==} + engines: {'0': node >= 0.4.0} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /koa-body@6.0.1: + resolution: {integrity: sha512-M8ZvMD8r+kPHy28aWP9VxL7kY8oPWA+C7ZgCljrCMeaU7uX6wsIQgDHskyrAr9sw+jqnIXyv4Mlxri5R4InIJg==} + dependencies: + '@types/co-body': 6.1.3 + '@types/formidable': 2.0.6 + '@types/koa': 2.13.12 + co-body: 6.1.0 + formidable: 2.1.2 + zod: 3.22.4 + dev: false + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: false + + /koa-compress@5.1.1: + resolution: {integrity: sha512-UgMIN7ZoEP2DuoSQmD6CYvFSLt0NReGlc2qSY4bO4Oq0L56OiD9pDG41Kj/zFmVY/A3Wvmn4BqKcfq5H30LGIg==} + engines: {node: '>= 12'} + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + http-errors: 1.8.1 + koa-is-json: 1.0.0 + dev: false + + /koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: false + + /koa-is-json@1.0.0: + resolution: {integrity: sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==} + dev: false + + /koa-json-error@3.1.2: + resolution: {integrity: sha512-nqfNwD4W+hYaJijFl+6qNSQJHbTS4vp+gXTdXl5U8YK2PVNzCF0HnLZwyKHaMeBebhanAgmfheQv96wLDjLRxg==} + engines: {node: '>=6.0.0'} + dependencies: + lodash.compact: 3.0.1 + lodash.curry: 4.1.1 + dev: false + + /koa-logger@3.2.1: + resolution: {integrity: sha512-MjlznhLLKy9+kG8nAXKJLM0/ClsQp/Or2vI3a5rbSQmgl8IJBQO0KI5FA70BvW+hqjtxjp49SpH2E7okS6NmHg==} + engines: {node: '>= 7.6.0'} + dependencies: + bytes: 3.1.2 + chalk: 2.4.2 + humanize-number: 0.0.2 + passthrough-counter: 1.0.0 + dev: false + + /koa-ratelimit@5.0.1: + resolution: {integrity: sha512-H7IEkNS/b18Uwtm3RIvAK3orJE8ew8wEBsnezlQWz7GTWqEnDtbTNfTedVXjj07gyh8gWTkEdODEXRquGCBqmg==} + engines: {node: '>= 10'} + dependencies: + async-ratelimiter: 1.3.12 + debug: 4.3.4 + ms: 2.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /koa-router@12.0.1: + resolution: {integrity: sha512-gaDdj3GtzoLoeosacd50kBBTnnh3B9AYxDThQUo4sfUyXdOhY6ku1qyZKW88tQCRgc3Sw6ChXYXWZwwgjOxE0w==} + engines: {node: '>= 12'} + dependencies: + debug: 4.3.4 + http-errors: 2.0.0 + koa-compose: 4.1.0 + methods: 1.1.2 + path-to-regexp: 6.2.1 + transitivePeerDependencies: + - supports-color + dev: false + + /koa-useragent@4.1.0: + resolution: {integrity: sha512-x/HUDZ1zAmNNh5hA9hHbPm9p3UVg2prlpHzxCXQCzbibrNS0kmj7MkCResCbAbG7ZT6FVxNSMjR94ZGamdMwxA==} + engines: {node: '>=7.6.0'} + dependencies: + express-useragent: 1.0.15 + dev: false + + /koa@2.14.2: + resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.8.0 + debug: 4.3.4 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + dev: false + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /loadtest@8.0.5: + resolution: {integrity: sha512-7a15RVrplinxEuqKJK0IOdQpH/KFWzTitxJKyRalC955gFiQQB/r0UYQkqKmaio+qFKF075c5eZSkgPTgSZWjA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + agentkeepalive: 2.2.0 + confinode: 2.1.1 + https-proxy-agent: 2.2.4 + stdio: 0.2.7 + testing: 3.1.0 + websocket: 1.0.34 + transitivePeerDependencies: + - supports-color + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.compact@3.0.1: + resolution: {integrity: sha512-2ozeiPi+5eBXW1CLtzjk8XQFhQOEMwwfxblqeq6EGyTxZJ1bPATqilY0e6g2SLQpP4KuMeuioBhEnWz5Pr7ICQ==} + dev: false + + /lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /logform@2.6.0: + resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.2 + safe-stable-stringify: 2.4.3 + triple-beam: 1.4.1 + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + /lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /moment-timezone@0.5.43: + resolution: {integrity: sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==} + dependencies: + moment: 2.29.4 + + /moment@2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /mysql2@3.6.5: + resolution: {integrity: sha512-pS/KqIb0xlXmtmqEuTvBXTmLoQ5LmAz5NW/r8UyQ1ldvnprNEj3P9GbmuQQ2J0A4LO+ynotGi6TbscPa8OUb+w==} + engines: {node: '>= 8.0'} + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.2.3 + lru-cache: 8.0.5 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + + /named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + dependencies: + lru-cache: 7.18.3 + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /node-gyp-build@4.7.1: + resolution: {integrity: sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==} + hasBin: true + dev: true + + /nodemon@3.0.1: + resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.5.4 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /object-hash@2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} + dev: false + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + dependencies: + fn.name: 1.1.0 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: false + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /passthrough-counter@1.0.0: + resolution: {integrity: sha512-Wy8PXTLqPAN0oEgBrlnsXPMww3SYJ44tQ8aVrGAI4h4JZYCS0oYqsPqtPR8OhJpv6qFbpbB7XAn0liKV7EXubA==} + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + + /pg-connection-string@2.6.2: + resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /reserved-words@0.1.2: + resolution: {integrity: sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /retry-as-promised@7.0.4: + resolution: {integrity: sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==} + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + + /sequelize-auto@0.8.8(sequelize@6.35.1): + resolution: {integrity: sha512-9o0qi2yMA86oFqcA5Nh14PnQSHP0E9WPEB4hP/NgxqdFE44Nq2u8Di5O3xmvWwXMIV6W+Q0YI/2VTLvlMJAjnQ==} + engines: {node: '>= 10'} + hasBin: true + peerDependencies: + sequelize: '>3.30.0' + dependencies: + lodash: 4.17.21 + mkdirp: 1.0.4 + reserved-words: 0.1.2 + sequelize: 6.35.1(mysql2@3.6.5) + yargs: 16.2.0 + dev: true + + /sequelize-pool@7.1.0: + resolution: {integrity: sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==} + engines: {node: '>= 10.0.0'} + + /sequelize@6.35.1(mysql2@3.6.5): + resolution: {integrity: sha512-UlP5k33nJsN11wCDLaWZXw9bB8w4ESKc5QmG6D04qMimwBwKVNeqRJiaaBlEJdtg8cRK+OJh95dliP+uEi+g9Q==} + engines: {node: '>=10.0.0'} + peerDependencies: + ibm_db: '*' + mariadb: '*' + mysql2: '*' + oracledb: '*' + pg: '*' + pg-hstore: '*' + snowflake-sdk: '*' + sqlite3: '*' + tedious: '*' + peerDependenciesMeta: + ibm_db: + optional: true + mariadb: + optional: true + mysql2: + optional: true + oracledb: + optional: true + pg: + optional: true + pg-hstore: + optional: true + snowflake-sdk: + optional: true + sqlite3: + optional: true + tedious: + optional: true + dependencies: + '@types/debug': 4.1.12 + '@types/validator': 13.11.7 + debug: 4.3.4 + dottie: 2.0.6 + inflection: 1.13.4 + lodash: 4.17.21 + moment: 2.29.4 + moment-timezone: 0.5.43 + mysql2: 3.6.5 + pg-connection-string: 2.6.2 + retry-as-promised: 7.0.4 + semver: 7.5.4 + sequelize-pool: 7.1.0 + toposort-class: 1.0.1 + uuid: 8.3.2 + validator: 13.11.0 + wkx: 0.5.0 + transitivePeerDependencies: + - supports-color + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + + /stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + dev: false + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: false + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /stdio@0.2.7: + resolution: {integrity: sha512-q7zge680s4BhYx91a8RqHWfiyHM9b+2ZwrNEJJkL6Y6I3F78p9Ag56enyMlpLckCH+bL1shV7YEK1cLXOaA3Bg==} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.2 + dev: true + + /testing@3.1.0: + resolution: {integrity: sha512-CJXhYndfyUrznQOGeRb1snX0NYAqt54Rux9hrbcEqCeV9Omrq/vBkFw0J80XEsJ7vWNRI0g564l58UZgEHQFEA==} + engines: {node: '>16'} + dev: true + + /text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /toposort-class@1.0.1: + resolution: {integrity: sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==} + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.7.1 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /websocket@1.0.34: + resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} + engines: {node: '>=4.0.0'} + dependencies: + bufferutil: 4.0.8 + debug: 2.6.9 + es5-ext: 0.10.62 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /winston-daily-rotate-file@4.7.1(winston@3.11.0): + resolution: {integrity: sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==} + engines: {node: '>=8'} + peerDependencies: + winston: ^3 + dependencies: + file-stream-rotator: 0.6.1 + object-hash: 2.2.0 + triple-beam: 1.4.1 + winston: 3.11.0 + winston-transport: 4.6.0 + dev: false + + /winston-transport@4.6.0: + resolution: {integrity: sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==} + engines: {node: '>= 12.0.0'} + dependencies: + logform: 2.6.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + dev: false + + /winston@3.11.0: + resolution: {integrity: sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.5 + is-stream: 2.0.1 + logform: 2.6.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.4.3 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.6.0 + dev: false + + /wkx@0.5.0: + resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} + dependencies: + '@types/node': 20.10.0 + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yaeti@0.0.6: + resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: '>=0.10.32'} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /ylru@1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false diff --git a/13=graphResource2/production.env.js b/13=graphResource2/production.env.js new file mode 100644 index 0000000..53ea4ea --- /dev/null +++ b/13=graphResource2/production.env.js @@ -0,0 +1,43 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: production.env.js - +// | @创建时间: 2023-11-25 21:36 +// | @更新时间: 2023-11-25 21:36 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + + +const prodConfig = { + appName: 'graphResource2', + port: 5000, + zip: true, + upfile:{ + maxFileSize: 200 * 1024 * 1024, + hashAlgorithm: false, // md5 sha1 sha256 sha512 + }, + request:{ + maxFieldsSize: 2 * 1024 * 1024,// 请求体大小 + }, + ratelimit:{ + // 同设备(IP)限制登陆次数 + status: true, + duration: 60 * 1000, + max: 1000000, + }, + database:{ + mysql:{ + host: '127.0.0.1', + port: 3306, + username: 'root', + password: 'root', + database: 'graph_resource2' + } + } +} + +export default prodConfig diff --git a/13=graphResource2/src/app.js b/13=graphResource2/src/app.js new file mode 100644 index 0000000..0ae2c7c --- /dev/null +++ b/13=graphResource2/src/app.js @@ -0,0 +1,136 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: app.js - Koa项目的入口文件 +// | @创建时间: 2023-11-25 20:58 +// | @更新时间: 2023-11-25 20:58 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Koa from 'koa'; +import koaLogger from 'koa-logger'; +import compress from 'koa-compress'; +import ratelimit from 'koa-ratelimit'; +import handleError from 'koa-json-error'; +import { koaBody } from 'koa-body'; +import { userAgent } from 'koa-useragent'; + +import rootRouter from '#routes/index.js'; + +export default function startApp() { + const app = new Koa(); + if (global.ENV === 'development') { + // | 开启自带日志 + app.use(koaLogger()); + } + + if (config.ratelimit.status) { + // | 限制同一用户的频繁请求 + app.use( + ratelimit({ + driver: 'memory', // 存储限流数据的驱动,这里使用内存驱动 + db: new Map(), // 存储被限制的客户端信息的数据结构 + duration: config.ratelimit.duration, // 时间窗口,单位毫秒 + max: config.ratelimit.max, // 时间窗口内允许的最大请求数量 + id: (ctx) => ctx.ip, // 提取每个请求的唯一标识符,默认使用请求的 IP 地址 + }), + ); + } + + app.use( + handleError({ + format: (err) => { + // 返回错误的格式 + switch (err.status) { + case 400: { + return { + code: err.status, + message: err.e, + }; + break; + } + default: { + return { + code: err.status, + message: err.message, + result: ENV === 'development' && err.stack, + }; + } + } + }, + postFormat: (err, obj) => { + //根据不同环境,返回不同格式的错误信息 + const { result, ...rest } = obj; + return process.env.NODE_ENV == 'production' ? rest : obj; + }, + }), + ); + + // 响应封装中间件 + async function responseHandler(ctx, next) { + // 执行后续中间件 + await next(); + // 如果有响应且没有错误状态码 + if (ctx.response.is('json') && ![404, 204].includes(ctx.status)) { + // 封装响应体为标准格式 + ctx.body = { + code: ctx.status, + success: true, + data: ctx.body, + }; + } + } + + // 在路由之前加载响应封装中间件 + app.use(responseHandler); + + if (global.zip === true) { + // | koa-compress 是一个 Koa 中间件,用于压缩 HTTP 响应。使用该中间件可减少 HTTP 响应的大小,从而提升应用程序的性能。 + app.use(compress()); + } + app.use(userAgent); + + app.use( + koaBody({ + multipart: true, // 支持文件上传 + detectJSON: true, + gzip: true, + // encoding: 'gzip', + formidable: { + // uploadDir:path.join(__dirname,'public/upload/'), // 设置文件上传目录 + keepExtensions: true, // 保持文件的后缀 + maxFileSize: config.upfile.maxFileSize, // 文件上传大小 + maxFieldsSize: config.request.maxFieldsSize, // 除文件外的数据大小 + onFileBegin: (name, file) => { + // 文件上传前的设置 + }, + hashAlgorithm: config.upfile.hashAlgorithm, + }, + }), + ); + app.use(async (ctx, next) => { + // 解析查询参数为空字符串的情况 + const query = ctx.request.query; + Object.keys(query).forEach(key => { + if (query[key] === '') { + query[key] = undefined; + } + }); + + await next(); + }); + + app.use(rootRouter.routes()); + app.use(rootRouter.allowedMethods()); + + // console.log(rootRouter) + + const routes = rootRouter.stack.map((route) => route.path); + // console.log(routes); + + return app; +} diff --git a/13=graphResource2/src/cache/index.js b/13=graphResource2/src/cache/index.js new file mode 100644 index 0000000..5e5e575 --- /dev/null +++ b/13=graphResource2/src/cache/index.js @@ -0,0 +1,787 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.js - +// | @创建时间: 2023-12-01 21:38 +// | @更新时间: 2023-12-01 21:38 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import { DataTypes, Model, Op } from 'sequelize'; +import { makeTreeForList } from '#common/tools/makeTree.js'; +import makeObject from '#common/tools/makeObject.js'; + +// 数据库字段类型对照 +const SQLType = { + 0: { + name: '字符串', + identify: 'string', + length: [0, 4096], + sequelizeType: DataTypes.STRING, + }, + 1: { + name: '布尔值', + identify: 'boolean', + length: null, + sequelizeType: DataTypes.BOOLEAN, + }, + 2: { + name: '整数', + identify: 'integer', + length: null, + sequelizeType: DataTypes.INTEGER, + }, + 3: { + name: '数字', + identify: 'double', + length: null, + sequelizeType: DataTypes.DOUBLE, + }, +}; +// @ excludeFieldName - Object - 描述: 数据库排除字段 +const excludeFieldName = [ + [ + 'entityid', + 'uniquereference', + 'originnode', + 'creator', + 'isdelete', + 'entityname', + 'createtimestamp', + 'updatetimestamp', + ], +]; +// @ sequelizeFindAllType - Object - 描述: 查询参数 +const sequelizeFindAllType = { + raw: true, // 原始数据 + mapToModel: true, // 将下划线变成驼峰 +}; + +export async function createCatch(sequelize) { + global.resourceCache = {}; + // atomModelCache + const atomModelPoolStartTime = performance.now(); + const atomModelPool = await makeAtomModelCache(sequelize); + global.resourceCache.atomModelPool = atomModelPool; + const atomModelPoolEndTime = performance.now(); + logger.fatal( + `${'元分类/模型缓存加载完毕: atomModelPool'.padEnd(30, ' ')} | ${ + atomModelPoolEndTime - atomModelPoolStartTime + } ms`, + ); + + // atomModelCache + const baseDictPoolStartTime = performance.now(); + const baseDictPool = await makeBaseDictCache(sequelize); + global.resourceCache.baseDictPool = baseDictPool; + const baseDictPoolEndTime = performance.now(); + logger.fatal( + `${'数据字典缓存加载完毕: baseDictPool'.padEnd(30, ' ')} | ${ + baseDictPoolEndTime - baseDictPoolStartTime + } ms`, + ); + + // resourceCache + const resourcePoolStartTime = performance.now(); + const resourcePool = await makeResourceCache(sequelize); + global.resourceCache.resourcePool = resourcePool; + const resourcePoolEndTime = performance.now(); + logger.fatal( + `${'资源数据缓存加载完毕: resourcePool'.padEnd(30, ' ')} | ${ + resourcePoolEndTime - resourcePoolStartTime + } ms`, + ); +} + +async function makeAtomModelCache(sequelize) { + const atomModelList = await sequelize.models.AtomModel.findAll({ + // attributes:['*'], + // where: { + // isDelete:{ + // [Op.is]: null, + // } + // }, + raw: true, // 原始数据 + mapToModel: true, // 将下划线变成驼峰 + }); + const objectData = {}; + for (let i of atomModelList) { + objectData[i.atomModelId] = i; + } + const atomModelPool = { + length: atomModelList.length, + createtime: new Date().getTime(), + updatetime: new Date().getTime(), + allData: atomModelList, + normalData: atomModelList.filter((i) => !i.isDelete), + deleteData: atomModelList.filter((i) => i.isDelete), + objectData, + }; + return atomModelPool; +} + +async function makeBaseDictCache(sequelize) { + const baseDictList = await sequelize.models.BaseDict.findAll({ + // attributes:['*'], + // where: { + // isDelete:{ + // [Op.is]: null, + // } + // }, + raw: true, // 原始数据 + mapToModel: true, // 将下划线变成驼峰 + }); + const atomAllList = [], // 原始全量列表 + atomNormalList = [], // 原始正常数据列表 + atomDeleteList = [], // 原始删除数据列表 + atomObject = { + 0: { + children: [], + delChildren: [], + }, + }, // 包含根节点的原始字典关系对象 + reduceObject = { + 0: { + children: [], + delChildren: [], + }, + }, // 包含根节点的精简字典关系对象 + atomModelObject = { + 0: { + baseDictTree: [], + reduceBaseDictTree: [], + }, + }; // 元分类/模型分类下的树 + for (let i = 0; i < baseDictList.length; i++) { + const item = baseDictList[i]; + item.children = []; + item.delChildren = []; + atomObject[item.baseDictId] = item; + reduceObject[item.baseDictId] = { + atomModel: item.atomModel, + baseDictId: item.baseDictId, + baseDictName: item.baseDictName, + baseDictIdentify: item.baseDictIdentify, + baseDictDescribe: item.baseDictDescribe, + baseDictFather: item.baseDictFather, + children: [], + delChildren: [], + }; + // 以上建立精简数据和原始数据 + atomAllList.push(item); + if (item.isDelete) { + atomDeleteList.push(item); + } else { + atomNormalList.push(item); + } + // 以上将数据分类放入列表 + } + for (let i = 0; i < atomNormalList.length; i++) { + // 正常数据 + const dictId = atomNormalList[i].baseDictId; // 字典项ID + const fatherId = atomNormalList[i].baseDictFather; // 父ID + const aData = atomNormalList[i]; // 原始数据字典项 + const rData = reduceObject[dictId]; // 精简字典项 + atomObject[fatherId].children.push(aData); // 压入原始数据到原始对象 + reduceObject[fatherId].children.push(rData); // 压入精简数据到精简对象 + } + for (let i = 0; i < atomDeleteList.length; i++) { + // 已删除数据 + const dictId = atomDeleteList[i].baseDictId; // 字典项ID + const fatherId = atomDeleteList[i].baseDictFather; // 父ID + const aData = atomDeleteList[i]; // 原始数据字典项 + const rData = reduceObject[dictId]; // 精简字典项 + atomObject[fatherId].delChildren.push(aData); // 压入原始数据到原始对象 + reduceObject[fatherId].delChildren.push(rData); // 压入精简数据到精简对象 + } + const atomModelList = resourceCache.atomModelPool.normalData; + for (let i = 0; i < atomModelList.length; i++) { + const atomModel = atomModelList[i]; + const atomModelId = atomModel.atomModelId; + atomModelObject[atomModelId] = { + baseDictTree: [], + reduceBaseDictTree: [], + }; + atomModelObject[atomModelId].baseDictTree = atomObject[ + '0' + ].children.filter( + (dict) => !(dict.atomModel && atomModelId != dict.atomModel), + ); + atomModelObject[atomModelId].reduceBaseDictTree = reduceObject[ + '0' + ].children.filter( + (dict) => !(dict.atomModel && atomModelId != dict.atomModel), + ); + } + const baseDictPool = { + length: baseDictList.length, + createtime: new Date().getTime(), + updatetime: new Date().getTime(), + atomAllList, + atomNormalList, + atomDeleteList, + atomObject, + reduceObject, + atomModelObject, + }; + return baseDictPool; +} + +async function makeResourceCache(sequelize) { + // @ RAP - Object - 描述:元分类/模型缓存池 + const RAP = resourceCache.atomModelPool; + // @ RBP - Object - 描述:字典缓存池 + const RBP = resourceCache.baseDictPool; + // ! 获取资源类信息 ============================================================================= + console.time('获取资源类信息'); + // region 获取资源类信息 + const classList = await sequelize.models.ResourceClassBase.findAll({ + ...sequelizeFindAllType, + where: { + isDelete: { + [Op.is]: null, + }, + }, + }); + // @ classListForAtomModel - String - 描述:按照元分类/模型ID区分资源类 + const classListForAtomModel = {}; + for(let atomModel of RAP.normalData){ + classListForAtomModel[atomModel.atomModelId] = [] + } + // @ classIdList - Array[number] - 描述:资源类ID列表 + const classIdList = []; + // @ classObject - Object[resourceClassBase] - 描述:资源类对象 + const classObject = {}; + for (let i = 0; i < classList.length; i++) { + // 资源类对象 + const classItem = classList[i]; + // 资源类ID + const classId = classList[i].resourceClassBaseId; + // 将资源类ID放入资源类ID列表 + classIdList.push(classId); + // 将资源类对象放入集合中 + classObject[classId] = classItem; + // 读取atomModel,元分类/模型信息 + const atomModelId = classItem.atomModel; + // 从原分类/模型中拿到其名称 + classItem.atomModelName = RAP.objectData[atomModelId].atomModelName; + // 读取resourceClassBaseDefine, 资源类定义catch提的,目前缺省 + // | 待补充 + // 读取resourceClassBaseType,资源类型定义,0实体、1虚拟、2管理层级 + classItem.resourceClassBaseTypeName = { + 0: '实体资源类', + 1: '虚拟资源类', + 2: '层级管理资源类', + }[classItem.resourceClassBaseType]; + if(classListForAtomModel[classItem.atomModel] === undefined){ + classListForAtomModel[classItem.atomModel] = [] + } + classListForAtomModel[classItem.atomModel].push(classItem) + } + // console.log(classIdList) + // console.log(classObject) + // endregion + console.timeEnd('获取资源类信息'); + // ! 获取拓展字段信息 =========================================================================== + console.time('获取拓展字段信息'); + // region 获取拓展字段信息 + const classExpandList = + await sequelize.models.ResourceClassExpandField.findAll( + sequelizeFindAllType, + ); + // @ classExpandIdList - Array[number] - 描述:资源类拓展字段ID列表 + const classExpandIdList = []; + // @ classExpandObject - Object[resourceClassExpandField] - 描述:资源类拓展字段对象 + const classExpandObject = {}; + // @ classExpandForClassBaseObject - Object - 描述:基于资源类ID的资源拓展字段对象集合 + const classExpandForClassBaseObject = {}; + for (let i = 0; i < classExpandList.length; i++) { + const expandField = classExpandList[i]; + if (expandField.isDelete) { + // 如果删除 + continue; + } + const expandFieldId = expandField.resourceClassExpandFieldId; + if (expandField.resourceClassExpandFieldRelationType === 0) { + // ! 如果是字典值 + expandField.resourceClassExpandFieldRelation = + RBP.atomObject[ + expandField.resourceClassExpandFieldValue + ].baseDictName; + } else if (expandField.resourceClassExpandFieldRelationType === 1) { + // ! 如果是资源类 + expandField.resourceClassExpandFieldRelation = + classObject[ + expandField.resourceClassExpandFieldIdentify + ].resourceClassBaseName; + } else { + expandField.resourceClassExpandFieldRelation = null; + } + classExpandIdList.push(expandFieldId); + classExpandObject[expandFieldId] = expandField; + // 拓展字段中的资源类ID + const classId = expandField.resourceClassBase; + if (classExpandForClassBaseObject[classId] === undefined) { + classExpandForClassBaseObject[classId] = { + [expandField.resourceClassExpandFieldIdentify]: expandField, + }; + } else { + classExpandForClassBaseObject[classId][ + expandField.resourceClassExpandFieldIdentify + ] = expandField; + } + } + // console.log(classExpandForClassBaseObject) + // endregion + console.timeEnd('获取拓展字段信息'); + // ! 获取实体结构表 ============================================================================= + console.time('获取实体结构表'); + // region 获取实体结构表 + const entityStructList = + await sequelize.models.ResourceEntityStruct.findAll( + sequelizeFindAllType, + ); + // @ entityStructIdList - Array[number] - 描述:资源实体结构id列表 + const entityStructIdList = []; + // @ entityStructObject - Object[resourceEntityStruct] - 描述:资源实体结构对象集合 + const entityStructObject = {}; + // @ entityStructForClassBaseObject - Object - 描述:基于资源类ID的资源实体字段对象集合 + const entityStructForClassBaseObject = {}; + for (let i = 0; i < entityStructList.length; i++) { + const entityStruct = entityStructList[i]; + if (entityStruct.isDelete) { + // 如果删除 + continue; + } + const entityStructId = entityStruct.resourceEntityStructId; + entityStructIdList.push(entityStructId); + entityStructObject[entityStructId] = entityStruct; + // 获取存储类型和长度 + entityStruct.storageTypeValue = + SQLType[entityStruct.resourceEntityStructStorageType]; + // 这里的关联值不做处理 + // 拓展字段中的资源类ID + const classId = entityStruct.resourceClassBase; + if (entityStructForClassBaseObject[classId] === undefined) { + entityStructForClassBaseObject[classId] = { + [entityStruct.resourceEntityStructIdentify]: entityStruct, + }; + } else { + entityStructForClassBaseObject[classId][ + entityStruct.resourceEntityStructIdentify + ] = entityStruct; + } + } + // endregion + console.timeEnd('获取实体结构表'); + // ! 获取资源类关系表 =========================================================================== + console.time('获取资源类关系表'); + // region 获取资源类关系表 + const classRelationList = + await sequelize.models.ResourceClassRelation.findAll( + {...sequelizeFindAllType,where: { + isDelete: { + [Op.is]: null, + }, + },}, + ); + // @ classRelationIdList - String - 描述:获取资源类关系ID列表 + const classRelationIdList = []; + // @ classRelationObject - String - 描述:获取资源类关系对象集合 + const classRelationObject = {}; + // @ classRelationObjectForTargetClass - String - 描述:获取资源类关系对象集合继续目标资源类 + const classRelationObjectForTargetClass = {}; + for (let i = 0; i < classRelationList.length; i++) { + const classRelationItem = classRelationList[i]; + const classRelationItemId = classRelationItem.resourceClassRelationId; + const targetId = classRelationItem.resourceClassRelationTarget; + classRelationIdList.push(classRelationItemId); + classRelationObject[classRelationItemId] = classRelationItem; + if (classRelationObjectForTargetClass[targetId] === undefined) { + classRelationObjectForTargetClass[targetId] = [classRelationItem]; + } else { + classRelationObjectForTargetClass[targetId].push(classRelationItem); + } + } + // endregion + console.timeEnd('获取资源类关系表'); + + // | 这里生成基础数据模型 ============================================================================================= + console.time('==生成资源类基础数据模型=='); + // region 这里生成基础数据模型 + // ! 资源类 + class ClassModel { + constructor(classItem) { + // 设置基础信息值 + this.resourceClass = classItem; + } + get classId() { + return this.resourceClass.resourceClassBaseId; + } + get classIdentify() { + return this.resourceClass.resourceClassBaseIdentify; + } + get atomModel() { + return this.resourceClass.atomModel; + } + get className() { + return this.resourceClass.resourceClassBaseName; + } + get classExpand() { + let classExpand = classExpandForClassBaseObject[this.classId]; + if (classExpand === undefined) { + classExpand = {}; + } + return classExpand; + } + get entityStruct() { + let entityStruct = entityStructForClassBaseObject[this.classId]; + if (entityStruct === undefined) { + entityStruct = {}; + } + return entityStruct; + } + get classRelationList() { + if (classRelationObjectForTargetClass[this.classId] === undefined) { + return []; + } else { + return classRelationObjectForTargetClass[this.classId]; + } + } + get classRelationIdList() { + return this.classRelationList.map((i) => i.resourceClassRelationId); + } + async createSequelizeModel() { + class resourceEntity extends Model {} + // 定义资源实体名称字段 + const entityName = { + type: DataTypes.STRING(255), + allowNull: false, + comment: '资源实体名称', + }; + const entityStruct = this.entityStruct; + // 定义资源实体名称字段在数据库的备注 + if (entityStruct.entityName !== undefined) { + entityName.comment = + entityStruct.entityName.resourceEntityStructName + + '-' + + entityStruct.entityName.resourceEntityStructDescribe; + } + // 定义字段 + const defineField = { + // 在这里定义模型属性 + entityId: { + type: DataTypes.STRING(64), + primaryKey: true, + allowNull: false, + comment: '资源实体ID', + }, + // 自增列 + uniqueReference: { + type: DataTypes.INTEGER, + autoIncrement: true, + allowNull: false, + unique: true, // 使得自增值是唯一的 + comment: '唯一参考', + }, + entityName, + // 所在节点 + originNode: { + type: DataTypes.STRING, + allowNull: false, + comment: '所在的资源类节点', + }, + creator: { + type: DataTypes.STRING, + comment: '创建人', + }, + isDelete: { + type: DataTypes.STRING(64), + comment: '删除时间', + }, + }; + // 定义数据表 + const defineTable = { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: this.classIdentify.toLowerCase(), // 我们需要选择模型名称 + tableName: 'entity_' + this.classIdentify.toLowerCase(), + comment: '元分类/模型表', + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }; + for (let fieldName in this.entityStruct) { + // 排除固定字段 + if (excludeFieldName.includes(fieldName.toLowerCase())) { + continue; + } + // 拿到字段详细信息 + const oneEntityStruct = this.entityStruct[fieldName]; + // 建立数据库表字段标准数据 + const oneField = { + type: DataTypes.STRING, // 对于意外数据,设置默认长度255的字符串 + comment: + oneEntityStruct.resourceEntityStructName + + '-' + + oneEntityStruct.resourceEntityStructDescribe, + }; + // 拿到自定义的存储类型 + const fieldStorageType = + this.entityStruct[fieldName] + .resourceEntityStructStorageType; + if ( + Object.keys(SQLType).includes(fieldStorageType.toString()) + ) { + // 如果该自定义存储类型在预设的存储类型中,设置自定义的存储类型 + oneField.type = SQLType[fieldStorageType].sequelizeType; + if ( + fieldStorageType == 0 && + oneEntityStruct.resourceEntityStructStorageLength < 4096 + ) { + // 如果是字符串,并且长度在0 > 4096,设置其长度 + oneField.type = oneField.type( + parseInt( + oneEntityStruct.resourceEntityStructStorageLength, + ), + ); + } + } + // 将该字段放入数据库字段定义对象中 + defineField[fieldName] = oneField; + } + resourceEntity.init(defineField, defineTable); + // 同步数据库 + await resourceEntity.sync(); // {alter: true}是修改,现在是如果存在就不更改表,后面修改表明,字段名,字段长度会在更新操作时添加 + this.sequelizeModel = resourceEntity; + } + get zeroInfo(){ + return { + resourceClassBaseId: this.resourceClass.resourceClassBaseId, + resourceClassBaseName: this.resourceClass.resourceClassBaseName, + resourceClassBaseColor: this.resourceClass.resourceClassBaseColor, + resourceClassBaseAvatar: this.resourceClass.resourceClassBaseAvatar, + } + } + get info(){ + return{ + ...this.resourceClass, + resourceClassExpandField: this.classExpand, + resourceEntityStruct: this.entityStruct, + resourceClassRelation: this.classRelationList + } + } + } + // @ classModelObject - Object - 描述:资源类数据模型对象集合 + const classModelObject = {}; + for (let classId of classIdList) { + if (classObject[classId].isDelete) { + // 排除删除的 + continue; + } + classModelObject[classId] = new ClassModel(classObject[classId]); + console.time(' 初始化资源实体表'+ classModelObject[classId].classIdentify) + await classModelObject[classId].createSequelizeModel(); + console.timeEnd(' 初始化资源实体表'+ classModelObject[classId].classIdentify) + } + // console.log((await sequelize.models.omencust.create({ + // entityId: 'omencust' + crypto.randomUUID(), + // originNode: '0-0-1', + // entityName: '中天合创', + // address: '鄂尔多斯', + // util: '54', + // project: '1' + // })).dataValues) + // endregion + console.timeEnd('==生成资源类基础数据模型=='); + + // | 这里生成关系节点数据模型 ========================================================================================== + console.time('==生成类关系节点数据模型=='); + // region 这里生成关系节点数据模型 + // 给每个类生成关联列表 + // @ classNodeObject - Object - 描述:类关系节点数据模型集合 + const classNodeObject = { + 0: { + classModel: {}, + nodeId: 0, + children: [], + father: null, + }, + }; + // ! 资源类节点 + class ClassNodeModel { + constructor(classModel, classRelationId) { + this.nodeId = classRelationId; + this.fatherId = + classRelationObject[ + classRelationId + ].resourceClassRelationFather; + this.children = []; + this.classData = classModel; + } + get classId() { + return this.classData.classId; + } + get classIdentify() { + return this.classData.classIdentify; + } + get atomModel() { + return this.classData.atomModel; + } + get className() { + return this.classData.className; + } + get classExpand() { + return this.classData.classExpand; + } + get entityStruct() { + return this.classData.entityStruct; + } + get classRelationList() { + return this.classData.classRelationList; + } + get classRelationIdList() { + return this.classData.classRelationIdList; + } + get nodeZeroInfo(){ + return { + ...this.classData.zeroInfo, + nodeId: this.nodeId, + fatherId: this.fatherId, + children: this.children.map(i => i.nodeZeroInfo) + } + } + } + // @ 生成类关系节点 + for (let classId of Object.keys(classModelObject)) { + const nowClassModel = classModelObject[classId]; + const nowRelationIdList = nowClassModel.classRelationIdList; + if (nowRelationIdList.length == 0) { + // @ 在数据库添加这条关系 + const newClassRelation = + await sequelize.models.ResourceClassRelation.create({ + resourceClassRelationFather: 0, + resourceClassRelationTarget: classId, + }); + const newClassRelationData = newClassRelation.dataValues; + const newClassRelationDataId = + newClassRelationData.resourceClassRelationId; + classRelationList.push(newClassRelationData) + classRelationIdList.push(newClassRelationDataId); + classRelationObject[newClassRelationDataId] = newClassRelationData; + classRelationObjectForTargetClass[classId] = [newClassRelationData]; + classNodeObject[newClassRelationDataId] = new ClassNodeModel( + nowClassModel, + newClassRelationDataId, + ); + } + for (let i = 0; i < nowRelationIdList.length; i++) { + const classRelationId = nowRelationIdList[i]; + classNodeObject[classRelationId] = new ClassNodeModel( + nowClassModel, + classRelationId, + ); + } + }; + // @ 构建类关系 + for (let i = 0; i < classRelationIdList.length; i++) { + const nodeId = classRelationList[i].resourceClassRelationId; + const classNode = classNodeObject[nodeId]; + const fatherId = classNodeObject[nodeId].fatherId; + classNodeObject[fatherId].children.push(classNode); + } + // console.log(classNodeObject) + // @ 根据关联元/模型分类资源类节点 + // @ classNodeObjectForAtomModel - String - 描述:关联元/模型下的根节点 + const classNodeObjectForAtomModel = {}; + // 根据元分类/模型创建根节点的空数组 + for (let i = 0; i < RAP.normalData.length; i++) { + classNodeObjectForAtomModel[RAP.normalData[i].atomModelId] = []; + } + // 将根节点放入 分类/模型创建根节点的空数组 中 + for (let i = 0; i < classNodeObject[0].children.length; i++) { + const nodeModel = classNodeObject[0].children[i]; + const atomModelId = nodeModel.atomModel; + if (classNodeObjectForAtomModel[atomModelId] === undefined) { + logger.warn('存在未找到元分类/模型的资源类:' + nodeModel.classId); + } else { + classNodeObjectForAtomModel[atomModelId].push(nodeModel); + } + } + // console.time('GET TREE') + // global.test = classNodeObjectForAtomModel[1][0].nodeZeroInfo + // console.timeEnd('GET TREE') + // console.time('GET TREE JSON') + // global.test2 = JSON.stringify(global.test, null, 3) + // console.timeEnd('GET TREE JSON') + // console.time('GET TREE JSON CONSOLE') + // console.log(global.test) + // console.timeEnd('GET TREE JSON CONSOLE') + console.timeEnd('==生成类关系节点数据模型=='); + // endregion + + // ! 获取资源实体 =============================================================================== + console.time('获取资源实体'); + // region 获取资源实体 + // @ entityListForClassId - Object[Array[Object[entity]]] - 描述:实体列表根据资源类ID区分的对象 + const entityListForClassId = {}; + // @ entityListForClassIdentify - Object[Array[Object[entity]]] - 描述:实体列表根据资源类Identify区分的对象 + const entityListForClassIdentify = {}; + for (let i of Object.keys(classModelObject)) { + const classModel = classModelObject[i]; + const classId = classModel.classId; + const classIdentify = classModel.classIdentify; + console.time(' 获取资源实体表信息' + classModel.classIdentify); + const entityList = await classModel.sequelizeModel.findAll({ + ...sequelizeFindAllType, + where: { + isDelete: { + [Op.is]: null, + }, + }, + }); + console.timeEnd(' 获取资源实体表信息' + classModel.classIdentify); + entityListForClassId[classId] = entityList; + entityListForClassIdentify[classIdentify] = entityList; + } + // endregion + console.timeEnd('获取资源实体'); + // ! 获取资源实体关系 + + return { + createtime: new Date().getTime(), + updatetime: new Date().getTime(), + // 资源类 + classList, + classIdList, + classObject, + classListForAtomModel, + // 资源类拓展字段 + classExpandList, + classExpandIdList, + classExpandObject, + classExpandForClassBaseObject, + // 资源实体结构 + entityStructList, + entityStructIdList, + entityStructObject, + entityStructForClassBaseObject, + // 资源类关系 + classRelationList, + classRelationIdList, + classRelationObject, + classRelationObjectForTargetClass, + // 资源类模型 + ClassModel, + classModelObject, + // 资源类节点模型 + classNodeObject, + ClassNodeModel, + classNodeObjectForAtomModel, + } +} diff --git a/13=graphResource2/src/common/database/dataModels/atomModel.dataModel.js b/13=graphResource2/src/common/database/dataModels/atomModel.dataModel.js new file mode 100644 index 0000000..0ac150e --- /dev/null +++ b/13=graphResource2/src/common/database/dataModels/atomModel.dataModel.js @@ -0,0 +1,61 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: atomModel.dataModel.js - +// | @创建时间: 2023-12-01 13:45 +// | @更新时间: 2023-12-01 13:45 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import {Model} from 'sequelize'; + +export function mountAtomModel(sequelize, DataTypes) { + class AtomModel extends Model { + } + + AtomModel.init({ + // 在这里定义模型属性 + atomModelId: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '元分类/模型ID' + }, + atomModelName: { + type: DataTypes.STRING, + allowNull: false, + comment: '元分类/模型名称' + }, + atomModelDescribe: { + type: DataTypes.STRING(2048), + allowNull: false, + comment: '元分类/模型描述' + }, + creator:{ + type: DataTypes.STRING, + comment: "创建人" + }, + isDelete:{ + type: DataTypes.STRING(64), + comment: "删除时间" + } + }, { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'AtomModel', // 我们需要选择模型名称 + // tableName: 'atom_model', + comment: "元分类/模型表", + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }); + + return AtomModel +} diff --git a/13=graphResource2/src/common/database/dataModels/baseDict.dataModel.js b/13=graphResource2/src/common/database/dataModels/baseDict.dataModel.js new file mode 100644 index 0000000..db5e8d3 --- /dev/null +++ b/13=graphResource2/src/common/database/dataModels/baseDict.dataModel.js @@ -0,0 +1,86 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: baseDict.dataModel.js - +// | @创建时间: 2023-12-01 14:37 +// | @更新时间: 2023-12-01 14:37 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import {Model} from 'sequelize'; + +export function mountBaseDict(sequelize, DataTypes) { + class BaseDict extends Model { + } + + BaseDict.init({ + // 在这里定义模型属性 + baseDictId: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '基础字典Id' + }, + atomModel: { + type: DataTypes.INTEGER, + comment: '元分类/模型Id' + }, + baseDictIsBase: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '是否为基础字典(0是自定义,1是基础)', + defaultValue: 0, + }, + baseDictOriginType: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '模型数据来源(0是系统内,1是系统外)', + defaultValue: 0, + }, + baseDictName:{ + type: DataTypes.STRING, + allowNull: false, + comment: "字典项名称" + }, + baseDictIdentify:{ + type: DataTypes.STRING, + comment: "字典项标识" + }, + baseDictDescribe:{ + type: DataTypes.STRING(2048), + comment: "字典项名描述" + }, + baseDictFather:{ + type: DataTypes.INTEGER, + allowNull: false, + comment: "字典项父级", + defaultValue: 0, + }, + creator:{ + type: DataTypes.STRING, + comment: "创建人" + }, + isDelete:{ + type: DataTypes.STRING(64), + comment: "删除时间" + } + }, { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'BaseDict', // 我们需要选择模型名称 + // tableName: 'baseDict', + comment: "基础字典表", + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }); + + return BaseDict +} diff --git a/13=graphResource2/src/common/database/dataModels/resourceClassBase.dataModel.js b/13=graphResource2/src/common/database/dataModels/resourceClassBase.dataModel.js new file mode 100644 index 0000000..0f4ac9c --- /dev/null +++ b/13=graphResource2/src/common/database/dataModels/resourceClassBase.dataModel.js @@ -0,0 +1,103 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: resourceClassBase.dataModel.js - +// | @创建时间: 2023-12-01 14:56 +// | @更新时间: 2023-12-01 14:56 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: atomModel.dataModel.js - +// | @创建时间: 2023-12-01 13:45 +// | @更新时间: 2023-12-01 13:45 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import { Model } from 'sequelize'; + +export function mountResourceClassBase(sequelize, DataTypes) { + class ResourceClassBase extends Model {} + + ResourceClassBase.init( + { + // 在这里定义模型属性 + resourceClassBaseId: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '资源类ID', + }, + atomModel: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '元分类/模型Id', + }, + resourceClassBaseDefine:{ + type: DataTypes.INTEGER, + comment: "对资源类的定义,方便建立资源结构,来源于基础字典。" + }, + resourceClassBaseIdentify:{ + type: DataTypes.STRING(8), + allowNull: false, + comment: '资源类标识', + }, + resourceClassBaseName:{ + type: DataTypes.STRING, + allowNull: false, + comment: '资源类名', + }, + resourceClassBaseDescribe: { + type: DataTypes.STRING(2048), + comment: '资源类描述', + }, + resourceClassBaseType:{ + type: DataTypes.INTEGER, + allowNull: false, + comment: "对资源类的分类,0实体、1虚拟、2管理。", + defaultValue: 0, + }, + resourceClassBaseColor:{ + type: DataTypes.STRING, + comment: '资源类颜色', + }, + resourceClassBaseAvatar:{ + type: DataTypes.STRING, + comment: '资源类图标', + }, + creator: { + type: DataTypes.STRING, + comment: '创建人', + }, + isDelete: { + type: DataTypes.STRING(64), + comment: '删除时间', + }, + }, + { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'ResourceClassBase', // 我们需要选择模型名称 + // tableName: 'ResourceClassBase', + comment: '资源类基础表', + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }, + ); + + return ResourceClassBase; +} diff --git a/13=graphResource2/src/common/database/dataModels/resourceClassExpandField.dataModel.js b/13=graphResource2/src/common/database/dataModels/resourceClassExpandField.dataModel.js new file mode 100644 index 0000000..c7aaf36 --- /dev/null +++ b/13=graphResource2/src/common/database/dataModels/resourceClassExpandField.dataModel.js @@ -0,0 +1,83 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: resourceClassExpandField.dataModel.js - +// | @创建时间: 2023-12-01 15:12 +// | @更新时间: 2023-12-01 15:12 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import { Model } from 'sequelize'; + +export function mountResourceClassExpandField(sequelize, DataTypes) { + class ResourceClassExpandField extends Model {} + + ResourceClassExpandField.init( + { + // 在这里定义模型属性 + resourceClassExpandFieldId: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '资源类拓展字段ID', + }, + resourceClassBase: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '资源类ID', + }, + resourceClassExpandFieldName: { + type: DataTypes.STRING, + allowNull: false, + comment: '资源类拓展字段名', + }, + resourceClassExpandFieldIdentify: { + type: DataTypes.STRING(64), + allowNull: false, + comment: '资源类拓展字段标识', + }, + resourceClassExpandFieldDisplayType: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '显示类型,后期在字典添加', + defaultValue:0 + }, + resourceClassExpandFieldRelationType: { + type: DataTypes.INTEGER, + comment: '拓展字段关联类型,0字典,1资源类', + }, + resourceClassExpandFieldValue: { + type: DataTypes.STRING, + allowNull: false, + comment: '资源类拓展字段值', + }, + creator: { + type: DataTypes.STRING, + comment: '创建人', + }, + isDelete: { + type: DataTypes.STRING(64), + comment: '删除时间', + }, + }, + { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'ResourceClassExpandField', // 我们需要选择模型名称 + // tableName: 'ResourceClassExpandField', + comment: '资源类拓展字段表', + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }, + ); + + return ResourceClassExpandField; +} diff --git a/13=graphResource2/src/common/database/dataModels/resourceClassRelation.dataModel.js b/13=graphResource2/src/common/database/dataModels/resourceClassRelation.dataModel.js new file mode 100644 index 0000000..25cf895 --- /dev/null +++ b/13=graphResource2/src/common/database/dataModels/resourceClassRelation.dataModel.js @@ -0,0 +1,61 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: resourceClassRelation.dataModel.js - +// | @创建时间: 2023-12-01 15:23 +// | @更新时间: 2023-12-01 15:23 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import {Model} from 'sequelize'; + +export function mountResourceClassRelation(sequelize, DataTypes) { + class ResourceClassRelation extends Model { + } + + ResourceClassRelation.init({ + // 在这里定义模型属性 + resourceClassRelationId: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '资源类关系ID' + }, + resourceClassRelationFather: { + type: DataTypes.INTEGER, + allowNull: false, + defaultValue: 0, + comment: '父资源类ID' + }, + resourceClassRelationTarget: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '目标资源类ID' + }, + creator:{ + type: DataTypes.STRING, + comment: "创建人" + }, + isDelete:{ + type: DataTypes.STRING(64), + comment: "删除时间" + } + }, { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'ResourceClassRelation', // 我们需要选择模型名称 + // tableName: 'ResourceClassRelation', + comment: "资源类关系表", + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }); + + return ResourceClassRelation +} diff --git a/13=graphResource2/src/common/database/dataModels/resourceEntityRelation.dataModel.js b/13=graphResource2/src/common/database/dataModels/resourceEntityRelation.dataModel.js new file mode 100644 index 0000000..ed615a2 --- /dev/null +++ b/13=graphResource2/src/common/database/dataModels/resourceEntityRelation.dataModel.js @@ -0,0 +1,60 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: resourceEntityRelation.dataModel.js - +// | @创建时间: 2023-12-01 15:23 +// | @更新时间: 2023-12-01 15:23 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import {Model} from 'sequelize'; + +export function mountResourceEntityRelation(sequelize, DataTypes) { + class ResourceEntityRelation extends Model { + } + + ResourceEntityRelation.init({ + // 在这里定义模型属性 + resourceEntityRelationId: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '资源关系ID' + }, + resourceEntityRelationTarget: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '目标资源ID' + }, + resourceEntityRelationFather: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '父资源ID' + }, + creator:{ + type: DataTypes.STRING, + comment: "创建人" + }, + isDelete:{ + type: DataTypes.STRING(64), + comment: "删除时间" + } + }, { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'ResourceEntityRelation', // 我们需要选择模型名称 + // tableName: 'ResourceEntityRelation', + comment: "资源实体关系表", + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }); + + return ResourceEntityRelation +} diff --git a/13=graphResource2/src/common/database/dataModels/resourceEntityStruct.dataModel.js b/13=graphResource2/src/common/database/dataModels/resourceEntityStruct.dataModel.js new file mode 100644 index 0000000..33de542 --- /dev/null +++ b/13=graphResource2/src/common/database/dataModels/resourceEntityStruct.dataModel.js @@ -0,0 +1,140 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: resourceEntityStruct.dataModel.js - +// | @创建时间: 2023-12-01 15:38 +// | @更新时间: 2023-12-01 15:38 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import {Model} from 'sequelize'; + +export function mountResourceEntityStruct(sequelize, DataTypes) { + class ResourceEntityStruct extends Model { + } + + ResourceEntityStruct.init({ + // 在这里定义模型属性 + resourceEntityStructId: { + type: DataTypes.INTEGER, + // type: DataTypes.STRING, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '元分类/模型ID' + }, + resourceClassBase: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '资源类ID', + }, + resourceEntityStructName:{ + type: DataTypes.STRING, + allowNull: false, + comment: '资源实体字段名', + }, + resourceEntityStructIdentify:{ + type: DataTypes.STRING(64), + allowNull: false, + comment: '资源实体字段标识', + }, + resourceEntityStructNickname:{ + type: DataTypes.STRING, + comment: '资源实体字段别名', + }, + resourceEntityStructDescribe:{ + type: DataTypes.STRING(2048), + comment: '资源实体字段描述', + }, + resourceEntityStructRank:{ + type: DataTypes.INTEGER, + comment: '资源实体字段排序', + default:0, + }, + resourceEntityStructStorageType:{ + type: DataTypes.INTEGER, + allowNull: false, + default: 0, + comment: '资源实体字段在数据库中存储的类型', + }, + resourceEntityStructStorageLength:{ + type: DataTypes.INTEGER, + allowNull: false, + comment: '资源实体字段在数据库中存储的长度', + defaultValue: 20, + }, + resourceEntityStructDisplayType:{ + type: DataTypes.INTEGER, + allowNull: false, + comment: '资源实体字段显示类型', + defaultValue: 0, + }, + resourceEntityStructIsGather:{ + type: DataTypes.BOOLEAN, + allowNull: false, + comment: '资源实体字段是否采集(0是采集、1是不采集)', + defaultValue: 0, + }, + resourceEntityStructIsRequired: { + type: DataTypes.BOOLEAN, + allowNull: true, + comment: "是否必填" + }, + resourceEntityStructAppIsShow:{ + type: DataTypes.BOOLEAN, + allowNull: false, + comment: '资源实体字段是否显示在APP上(0是显示、1是不显示)', + defaultValue: 0, + }, + resourceEntityStructWebIsShow:{ + type: DataTypes.BOOLEAN, + allowNull: false, + comment: '资源实体字段是否显示在Web上(0是显示、1是不显示)', + defaultValue: 0, + }, + resourceEntityStructAppNickname:{ + type: DataTypes.STRING, + comment: '资源实体字段APP别名', + }, + resourceEntityStructWebNickname:{ + type: DataTypes.STRING, + comment: '资源实体字段Web别名', + }, + resourceEntityStructRelationType:{ + type: DataTypes.INTEGER, + comment: '资源实体字段关联类型:0是字典、1是资源实体,但是选择资源类', + }, + resourceEntityStructRelationValue:{ + type: DataTypes.INTEGER, + comment: '资源实体字段关联值', + }, + resourceEntityStructDefaultValue:{ + type: DataTypes.STRING, + comment: "默认值" + }, + creator:{ + type: DataTypes.STRING, + comment: "创建人" + }, + isDelete:{ + type: DataTypes.STRING(64), + comment: "删除时间" + } + }, { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'ResourceEntityStruct', // 我们需要选择模型名称 + // tableName: 'ResourceEntityStruct', + comment: "资源实体字段结构表", + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }); + + return ResourceEntityStruct +} diff --git a/13=graphResource2/src/common/database/index.js b/13=graphResource2/src/common/database/index.js new file mode 100644 index 0000000..c08c10b --- /dev/null +++ b/13=graphResource2/src/common/database/index.js @@ -0,0 +1,61 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: expressgy-web-lauch +// | @文件描述: index.js - +// | @创建时间: 2023-11-28 22:27 +// | @更新时间: 2023-11-28 22:27 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import { Sequelize, DataTypes } from 'sequelize'; + +import { mountAtomModel } from '#dataModels/atomModel.dataModel.js'; +import { mountBaseDict } from '#dataModels/baseDict.dataModel.js'; +import { mountResourceClassBase } from '#dataModels/resourceClassBase.dataModel.js'; +import { mountResourceClassExpandField } from '#dataModels/resourceClassExpandField.dataModel.js'; +import {mountResourceClassRelation} from "#dataModels/resourceClassRelation.dataModel.js"; +import {mountResourceEntityStruct} from "#dataModels/resourceEntityStruct.dataModel.js"; +import {mountResourceEntityRelation} from "#dataModels/resourceEntityRelation.dataModel.js"; + +// import prodConfig from "#root/production.env.js"; +// +// global.config = prodConfig + +export default function createDatabase(logger) { + const { database, username, password, host, port } = + global.config.database.mysql; + // console.log(database, username, password, host, port); + const sequelize = new Sequelize(database, username, password, { + host, + dialect: 'mysql', // 根据你的数据库类型修改 + underscored: true, + timezone: '+08:00', // 时区设置为东八区 + dialectOptions: { + dateStrings: true, // 将所有日期字段值转换成字符串格式 + typeCast: true, // 允许将字符串类型的日期字段值自动转换为 Date 类型 + }, + // 以下为一些额外配置选项 + // pool: { + // max: 5, + // min: 0, + // acquire: 30000, + // idle: 10000 + // }, + // logging: logger.debug.bind(logger), + logging: false + }); + + mountAtomModel(sequelize, DataTypes); + mountBaseDict(sequelize, DataTypes); + mountResourceClassBase(sequelize, DataTypes); + mountResourceClassExpandField(sequelize, DataTypes); + mountResourceClassRelation(sequelize, DataTypes) + mountResourceEntityStruct(sequelize,DataTypes) + mountResourceEntityRelation(sequelize,DataTypes) + return sequelize; +} +// createDatabase() diff --git a/13=graphResource2/src/common/database/initData.js b/13=graphResource2/src/common/database/initData.js new file mode 100644 index 0000000..7526ddd --- /dev/null +++ b/13=graphResource2/src/common/database/initData.js @@ -0,0 +1,353 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: initData.js - +// | @创建时间: 2023-12-02 15:02 +// | @更新时间: 2023-12-02 15:02 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +// @ 运维资源类的类型字典 +const OMResourceType = [ + { + baseDictId: 1, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '运维资源类型', + baseDictDescribe: '在运维系统上使用的资源类用途定义,资源类和备件类', + baseDictFather: 0, + }, + { + baseDictId: 2, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '资源类型', + baseDictDescribe: '在广义上有ID区分自身的资源', + baseDictFather: 1, + }, + { + baseDictId: 3, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '备件类行', + baseDictDescribe: '在广义上没有ID进行区分的资源', + baseDictFather: 1, + } +] +// @ 单位 +const UnitType = [ + { + baseDictId: 11, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '数据单位', + baseDictDescribe: '对资源在物理上的统一衡量区分', + baseDictFather: 0, + }, + { + baseDictId: 12, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '长度单位', + baseDictDescribe: '对资源在长度上的统一衡量区分', + baseDictFather: 11, + }, + { + baseDictId: 13, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '米', + baseDictIdentify: 'm', + baseDictDescribe: '', + baseDictFather: 12, + }, + { + baseDictId: 14, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '厘米', + baseDictIdentify: 'cm', + baseDictDescribe: '', + baseDictFather: 12, + }, + { + baseDictId: 15, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '千米', + baseDictIdentify: 'km', + baseDictDescribe: '', + baseDictFather: 12, + }, + { + baseDictId: 16, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '毫米', + baseDictIdentify: 'mm', + baseDictDescribe: '', + baseDictFather: 12, + }, + { + baseDictId: 17, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '英寸', + baseDictIdentify: 'inch', + baseDictDescribe: '', + baseDictFather: 12, + }, + { + baseDictId: 18, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '英尺', + baseDictIdentify: 'ft', + baseDictDescribe: '', + baseDictFather: 12, + }, + { + baseDictId: 19, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '英里', + baseDictIdentify: 'mile', + baseDictDescribe: '', + baseDictFather: 12, + }, + { + baseDictId: 20, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '面积单位', + baseDictDescribe: '对资源在平面上的统一衡量区分', + baseDictFather: 11, + }, + { + baseDictId: 21, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '平方米', + baseDictIdentify: 'm²', + baseDictDescribe: '', + baseDictFather: 20, + }, + { + baseDictId: 22, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '平方厘米', + baseDictIdentify: 'cm²', + baseDictDescribe: '', + baseDictFather: 20, + }, + { + baseDictId: 23, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '平方毫米', + baseDictIdentify: 'mm²', + baseDictDescribe: '', + baseDictFather: 20, + }, + { + baseDictId: 24, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '平方千米', + baseDictIdentify: 'km²', + baseDictDescribe: '', + baseDictFather: 20, + }, + { + baseDictId: 26, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '英亩', + baseDictIdentify: 'acre', + baseDictDescribe: '', + baseDictFather: 20, + }, + { + baseDictId: 27, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '公顷', + baseDictIdentify: 'ha', + baseDictDescribe: '', + baseDictFather: 20, + }, + { + baseDictId: 28, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '亩', + baseDictIdentify: 'are', + baseDictDescribe: '', + baseDictFather: 20, + }, + { + baseDictId: 29, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '重量单位', + baseDictDescribe: '对资源在质量上的统一衡量区分', + baseDictFather: 11, + }, + { + baseDictId: 30, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '千克', + baseDictIdentify: 'kg', + baseDictDescribe: ' ', + baseDictFather: 29, + }, + { + baseDictId: 31, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '毫克', + baseDictIdentify: 'mg', + baseDictDescribe: ' ', + baseDictFather: 29, + }, + { + baseDictId: 32, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '克', + baseDictIdentify: 'g', + baseDictDescribe: ' ', + baseDictFather: 29, + }, + { + baseDictId: 33, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '盎司', + baseDictIdentify: 'oz', + baseDictDescribe: ' ', + baseDictFather: 29, + }, + { + baseDictId: 34, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '磅', + baseDictIdentify: 'lb', + baseDictDescribe: ' ', + baseDictFather: 29, + }, + { + baseDictId: 35, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '斤', + baseDictIdentify: '', + baseDictDescribe: ' ', + baseDictFather: 29, + }, + { + baseDictId: 36, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '公斤', + baseDictIdentify: 'kg', + baseDictDescribe: ' ', + baseDictFather: 29, + }, + { + baseDictId: 37, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '时间单位', + baseDictDescribe: '在时间上的统一衡量', + baseDictFather: 11, + }, + { + baseDictId: 38, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '秒', + baseDictIdentify: 's', + baseDictDescribe: ' ', + baseDictFather: 37, + }, + { + baseDictId: 39, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '分', + baseDictIdentify: 'min', + baseDictDescribe: ' ', + baseDictFather: 37, + }, + { + baseDictId: 40, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '时', + baseDictIdentify: 'h', + baseDictDescribe: ' ', + baseDictFather: 37, + }, + { + baseDictId: 41, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '天', + baseDictIdentify: 'd', + baseDictDescribe: ' ', + baseDictFather: 37, + }, + { + baseDictId: 42, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '周', + baseDictIdentify: 'week', + baseDictDescribe: ' ', + baseDictFather: 37, + }, + { + baseDictId: 43, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '月', + baseDictIdentify: 'month', + baseDictDescribe: ' ', + baseDictFather: 37, + }, + { + baseDictId: 44, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '年', + baseDictIdentify: 'year', + baseDictDescribe: ' ', + baseDictFather: 37, + }, + { + baseDictId: 45, + baseDictIsBase: 1, + baseDictOriginType: 0, + baseDictName: '毫秒', + baseDictIdentify: 'ms', + baseDictDescribe: ' ', + baseDictFather: 37, + }, +] + + + +export default function initData(sequelize){ + sequelize.models.BaseDict.bulkCreate(OMResourceType, { ignoreDuplicates: true }) + sequelize.models.BaseDict.bulkCreate(UnitType, { ignoreDuplicates: true }) +} + + diff --git a/13=graphResource2/src/common/dto/index.js b/13=graphResource2/src/common/dto/index.js new file mode 100644 index 0000000..001ed61 --- /dev/null +++ b/13=graphResource2/src/common/dto/index.js @@ -0,0 +1,36 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.js - +// | @创建时间: 2023-11-26 15:41 +// | @更新时间: 2023-11-26 15:41 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import Ajv from 'ajv'; +import addAjvErrors from 'ajv-errors'; + +export default function makeDTO(data, schema) { + const ajv = new Ajv({ + allErrors: true, //多错误消息 + // jsonPointers: true, // 消息写在内部吗?? JSON 指针是一个字符串表示法,用于在 JSON 文档中指定特定的路径。它采用一种类似于文件路径的结构,通过使用斜杠 / 来分隔层级,例如 /path/to/property + coerceTypes: true, // 类型转换 + useDefaults: true + }); + + addAjvErrors(ajv); + const validate = ajv.compile(schema); + const valid = validate(data); + const message = { + status: true, + error: null, + }; + if (!valid) { + message.status = false; + message.error = validate.errors; + } + return message; +} diff --git a/13=graphResource2/src/common/logger/index.js b/13=graphResource2/src/common/logger/index.js new file mode 100644 index 0000000..55579ce --- /dev/null +++ b/13=graphResource2/src/common/logger/index.js @@ -0,0 +1,91 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.js - +// | @创建时间: 2023-11-26 14:51 +// | @更新时间: 2023-11-26 14:51 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import winston from "winston"; +import "winston-daily-rotate-file" + + +// 自定义日志等级和颜色 +const myCustomLevels = { + levels:{ + fatal: 0, + error: 1, + warn: 2, + info: 3, + debug: 4, + trace: 5 + }, +// 字体样式:bold, dim,italic, underline, inverse, hidden, strikethrough +// 字体背景颜色:black, red, green, yellow, blue, magenta紫色, cyan青色, white, gray, grey +// 背景颜色:blackBG, redBG, greenBG, yellowBG, blueBG, magentaBG, cyanBG, whiteBG + levelsColor:{ + fatal: 'bold red cyanBG italic underline', + error: 'bold magenta', + warn: 'yellow', + info: 'green', + debug: 'cyan', + trace: 'white' + } +} +// 创建颜色方法 +export const colorizer = winston.format.colorize(); +colorizer.addColors(myCustomLevels.levelsColor) + +export const logger = winston.createLogger({ + level: 'trace', // 日志打印等级 + levels: myCustomLevels.levels,// 日志等级列表 + exitOnError: false,// 如果为false,处理异常不会导致process.exit + silent: false, // 如果为true,所有日志被抑制 + format: winston.format.combine( + winston.format.errors({ stack: true }), + winston.format.json(), + winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss:SSS" }), + // winston.format.printf( + // (i) => { + // // const splatList = Array.from(Object.getOwnPropertySymbols(i)) + // // const splat = splatList && splatList.filter(item => item.toString() === 'Symbol(splat)') + // // const splatName = splat.length == 1 ? splat[0] : null + // // const data = splatName ? JSON.stringify([i.message, ...i[splatName]]) : JSON.stringify({message:i.message}) + // return `${i.timestamp} [${i.level.padEnd(5, ' ').toUpperCase()}] ${i.message}` + // }, + // ), + ), + transports: [ + new winston.transports.DailyRotateFile({ + filename: "winston-logs/%DATE%-INFO--winston.log", + level: "info", + datePattern: "YYYY-MM-DD", + zippedArchive: true,// 启用压缩 + maxSize: "10m",// 单文件大小 + maxFiles: "30d",// 存储时间 + }), + new winston.transports.DailyRotateFile({ + filename: "winston-logs/%DATE%-ERROR-winston.log", + level: "error", + datePattern: "YYYY-MM-DD", + zippedArchive: true, + maxSize: "10m", + maxFiles: "365d", + }), + ], + // winston可以捕获和记录异常 + // exceptionHandlers: [ + // new winston.transports.File({ filename: 'winston-logs/winston-exceptions.log' }) + // ], + // 捕获uncaughtRejection事件 + // rejectionHandlers: [ + // new winston.transports.File({ filename: 'winston-logs/rejections.log' }) + // ] +}); +// 后续加入记录器,这里可以加入环境变量的判断,当为生产模式时,取消控制台的打印操作。 + diff --git a/13=graphResource2/src/common/tools/binarySearch.js b/13=graphResource2/src/common/tools/binarySearch.js new file mode 100644 index 0000000..a5d095d --- /dev/null +++ b/13=graphResource2/src/common/tools/binarySearch.js @@ -0,0 +1,105 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: binarySearch.js - 二分法根据蓄力ID查找对象数组元素 +// | @创建时间: 2023-12-02 12:00 +// | @更新时间: 2023-12-02 12:00 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +export default function binarySearch(arr, id, att = undefined) { + let bi = 0, ai = arr.length -1; + if(!Object.keys(arr[0]).includes(att) && att !== undefined){ + throw new Error('不存在属性', att) + }else if(att === undefined){ + while (bi <= ai){ + const mi = Math.floor((bi + ai)/2); + const miId = arr[mi] + if(miId === id){ + return mi + }else if(miId < id){ + bi = mi + 1 + }else{ + ai = mi -1 + } + } + return -1 + } + while (bi <= ai){ + const mi = Math.floor((bi + ai)/2); + const miId = arr[mi][att] + if(miId === id){ + return mi + }else if(miId < id){ + bi = mi + 1 + }else{ + ai = mi -1 + } + } + return -1 +} + + + + + + + +function getIndexForWhile(list, id, att){ + let i = 0 + while (i < list.length){ + if (list[i][att] == id) { + return i + } + i++ + } + return -1 +} + +function getIndexForFor(list, id, att){ + for(let i =0; i< list.length;i++){ + if (list[i][att] == id) { + return i + } + } + return -1 +} + + +function getIndexForForIn(list, id, att){ + for(let i in list){ + if (list[i][att] == id) { + return i + } + } + return -1 +} +// const list = []; +// +// let i = 300; +// +// for (let j = 0; j < 200000; j++) { +// list[j] = { id: j + i }; +// } +// console.time('binarySearch'); +// let id = 200000; +// const i1 = binarySearch(list, id, 'id'); +// console.timeEnd('binarySearch'); +// +// console.time('getIndexForWhile'); +// const i2 = getIndexForWhile(list,id, 'id') +// console.timeEnd('getIndexForWhile'); +// +// console.time('getIndexForFor') +// const i3 = getIndexForFor(list, id, 'id') +// console.timeEnd('getIndexForFor') +// +// console.time('getIndexForForIn') +// const i4 = getIndexForForIn(list, id, 'id') +// console.timeEnd('getIndexForForIn') +// +// console.log(i1, i2, i3, i4) diff --git a/13=graphResource2/src/common/tools/binarySearchMore.js b/13=graphResource2/src/common/tools/binarySearchMore.js new file mode 100644 index 0000000..d8a8026 --- /dev/null +++ b/13=graphResource2/src/common/tools/binarySearchMore.js @@ -0,0 +1,50 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: binarySearchMore.js - +// | @创建时间: 2023-12-03 01:54 +// | @更新时间: 2023-12-03 01:54 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +function binarySearch2(arr, id, att, bi, ai) { + if(!Object.keys(arr[0]).includes(att)){ + throw new Error('不存在属性', att) + } + while (bi <= ai){ + const mi = Math.floor((bi + ai)/2); + const miId = arr[mi][att] + if(miId === id){ + return mi + }else if(miId < id){ + bi = mi + 1 + }else{ + ai = mi -1 + } + } + return -1 +} + +export default function binarySearchMore(arr, ids, att, bi, ai){ + if(ids.length == 0)return [] + const firstIndex = binarySearch2(arr, ids[0], att, bi, ai); + if(firstIndex != -1){ + bi = firstIndex + } + const lastIndex = binarySearch2(arr, ids.slice(-1)[0], att, bi, ai); + if(lastIndex != -1){ + ai = lastIndex + } + + const indexList = [firstIndex, lastIndex] + if(ids.length -2 == 1){ + indexList.push(binarySearch2(arr, ids[1], att, firstIndex, lastIndex)) + }else if(ids.length -2 > 1){ + indexList.push(...binarySearchMore(arr, ids.slice(1, -1), att, bi, ai)) + } + return indexList +} diff --git a/13=graphResource2/src/common/tools/getArrayPage.js b/13=graphResource2/src/common/tools/getArrayPage.js new file mode 100644 index 0000000..61d177a --- /dev/null +++ b/13=graphResource2/src/common/tools/getArrayPage.js @@ -0,0 +1,23 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: getArrayPage.js - +// | @创建时间: 2023-12-01 22:48 +// | @更新时间: 2023-12-01 22:48 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +export default function getPage(array, pageSize, pageNumber){ + if(!Array.isArray(array)){ + return [] + } + const startIndex = (pageNumber - 1) * pageSize; + + // 使用 slice() 方法获取分页内容 + const pageContent = array.slice(startIndex, startIndex + pageSize); + return pageContent +} diff --git a/13=graphResource2/src/common/tools/getNoSpacesStr.js b/13=graphResource2/src/common/tools/getNoSpacesStr.js new file mode 100644 index 0000000..139a779 --- /dev/null +++ b/13=graphResource2/src/common/tools/getNoSpacesStr.js @@ -0,0 +1,16 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: getNoSpacesStr.js - +// | @创建时间: 2023-12-01 22:54 +// | @更新时间: 2023-12-01 22:54 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +export default function getNoSpacesStr(str){ + return str.replace(/\s/g, ''); +} diff --git a/13=graphResource2/src/common/tools/makeList.js b/13=graphResource2/src/common/tools/makeList.js new file mode 100644 index 0000000..813d0a6 --- /dev/null +++ b/13=graphResource2/src/common/tools/makeList.js @@ -0,0 +1,30 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: makeList.js - +// | @创建时间: 2023-12-02 17:00 +// | @更新时间: 2023-12-02 17:00 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +export default function makeList(tree, childrenField = 'children'){ + const arr = getChildren(list, childrenField) + const setObj = new Set(arr) + return Array.from(setObj) +} + +function getChildren(list, childrenField){ + let arr = [] + for(let i = 0; i < list.length; i++){ + if(list[i][childrenField] && list[i][childrenField].length > 0){ + arr = [...arr, ...getChildren(list[i][childrenField], childrenField)] + }else{ + arr.push(list[i]) + } + } + return arr +} diff --git a/13=graphResource2/src/common/tools/makeObject.js b/13=graphResource2/src/common/tools/makeObject.js new file mode 100644 index 0000000..6c7a05b --- /dev/null +++ b/13=graphResource2/src/common/tools/makeObject.js @@ -0,0 +1,23 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: makeObject.js - 制造对象 +// | @创建时间: 2023-12-02 16:41 +// | @更新时间: 2023-12-02 16:41 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +export default function makeObject(list, idField, hasChildren = false){ + const newObject = {}; + for(let i = 0; i < list.length; i++){ + if(hasChildren){ + list[i].children = []; + newObject[list[i][idField]] = list[i] + } + } + return newObject +} diff --git a/13=graphResource2/src/common/tools/makeTree.js b/13=graphResource2/src/common/tools/makeTree.js new file mode 100644 index 0000000..e552b51 --- /dev/null +++ b/13=graphResource2/src/common/tools/makeTree.js @@ -0,0 +1,37 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: makeTree.js - 生成树 +// | @创建时间: 2023-12-02 15:45 +// | @更新时间: 2023-12-02 15:45 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + + +export function makeTreeForList(list, object, referField, fatherField, hasDelete = true){ + if(!Object.keys(object).includes('0')){ + object['0'] = { + children: [] + } + } + for(let i = 0; i < list.length; i++){ + const fatherId = list[i][fatherField]; + if(list[i].isDelete && !hasDelete){ + continue + } + if(!fatherId){ + object['0'].children.push(list[i]) + continue + } + if(!object[fatherId].children){ + object[fatherId].children = [] + } + object[fatherId].children.push(list[i]) + } + return object['0'].children +} + diff --git a/13=graphResource2/src/routes/graphResource2/atomModel/index.dto.js b/13=graphResource2/src/routes/graphResource2/atomModel/index.dto.js new file mode 100644 index 0000000..bf2d915 --- /dev/null +++ b/13=graphResource2/src/routes/graphResource2/atomModel/index.dto.js @@ -0,0 +1,180 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.dto.js - +// | @创建时间: 2023-12-01 18:13 +// | @更新时间: 2023-12-01 18:13 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import makeDTO from '#common/dto/index.js'; + +export function CreateAtomModelItemDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelName: { + type: 'string', + minLength: 1, + maxLength: 255, + pattern: "^[a-zA-Z\\s]+$", + errorMessage: { + type: '元分类/模型名称必须是一个字符串', + maxLength: '元分类/模型名称长度超出限制255', + minLength: '元分类/模型名称长度过短', + pattern: '元分类/模型名称必须为纯英文' + }, + }, + atomModelDescribe: { + type: 'string', + minLength: 1, + maxLength: 2048, + errorMessage: { + type: '元分类/模型描述必须是一个字符串', + maxLength: '元分类/模型描述长度超出限制2048', + minLength: '元分类/模型描述长度过短', + }, + }, + }, + required: ['atomModelName', 'atomModelDescribe'], + errorMessage: { + required: { + atomModelName: '元分类/模型名称为必填项', + atomModelDescribe: '元分类/模型描述为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +export function DeleteAtomModelItemDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: 'integer', + errorMessage: { + type: '元分类/模型id必须是整数', + }, + }, + }, + required: ['atomModelId'], + errorMessage: { + required: { + atomModelId: '元分类/模型ID为为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +export function EditAtomModelItemDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: 'integer', + errorMessage: { + type: '元分类/模型id必须是整数', + }, + }, + atomModelName: { + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '元分类/模型名称必须是一个字符串', + maxLength: '元分类/模型名称长度超出限制255', + minLength: '元分类/模型名称长度过短', + }, + }, + atomModelDescribe: { + type: 'string', + minLength: 1, + maxLength: 2048, + errorMessage: { + type: '元分类/模型描述必须是一个字符串', + maxLength: '元分类/模型描述长度超出限制2048', + minLength: '元分类/模型描述长度过短', + }, + }, + }, + required: ['atomModelName', 'atomModelDescribe', 'atomModelId'], + errorMessage: { + required: { + atomModelName: '元分类/模型名称为必填项', + atomModelDescribe: '元分类/模型描述为必填项', + atomModelId: '元分类/模型ID为为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +export function CheckAtomModelItemNameDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelName: { + type: 'string', + minLength: 1, + maxLength: 255, + pattern: "^[a-zA-Z\\s]+$", + errorMessage: { + type: '元分类/模型名称必须是一个字符串', + maxLength: '元分类/模型名称长度超出限制255', + minLength: '元分类/模型名称长度过短', + pattern: '元分类/模型名称必须为纯英文' + }, + }, + }, + required: ['atomModelName'], + errorMessage: { + required: { + atomModelName: '元分类/模型名称为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +export function GetAtomModelPageDTO(data) { + const schema = { + type: 'object', + properties: { + pageSize: { + type: 'integer', + minimum: 1, + maximum: 200, + default:10, + errorMessage: { + type: '每页数量必须是一个数字', + minimum: '每页数量最少是1', + maximum: '每页数量最多是200', + }, + }, + pageNum: { + type: 'integer', + minimum:1, + default: 1, + errorMessage: { + type: '页码必须是数字类型', + minimum: '页码最小是1', + }, + }, + searchData: { + type: 'string', + maxLength: 255, + errorMessage: { + type: '查询内容必须是一个字符串', + maxLength: '查询内容长度超出限制255', + }, + }, + }, + }; + return makeDTO(data, schema); +} diff --git a/13=graphResource2/src/routes/graphResource2/atomModel/index.js b/13=graphResource2/src/routes/graphResource2/atomModel/index.js new file mode 100644 index 0000000..6e2ccc2 --- /dev/null +++ b/13=graphResource2/src/routes/graphResource2/atomModel/index.js @@ -0,0 +1,230 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.js - +// | @创建时间: 2023-12-01 17:50 +// | @更新时间: 2023-12-01 17:50 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Router from 'koa-router'; + +import { + CheckAtomModelItemNameDTO, + CreateAtomModelItemDTO, + DeleteAtomModelItemDTO, + EditAtomModelItemDTO, + GetAtomModelPageDTO, +} from '#routes/graphResource2/atomModel/index.dto.js'; +import getPage from '#common/tools/getArrayPage.js'; +import getNoSpacesStr from '#common/tools/getNoSpacesStr.js'; +import binarySearch from "#common/tools/binarySearch.js"; + +const atomModel = new Router(); + +// @ 获取元分类模型页 +atomModel.get('/getAtomModelPage', async (ctx, next) => { + const verif = GetAtomModelPageDTO(ctx.query); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + let list = resourceCache.atomModelPool.normalData; + if (ctx.query.searchData) { + const searchData = ctx.query.searchData; + list = list.filter((i) => { + return (i.atomModelName + i.atomModelDescribe).includes(searchData); + }); + } + const total = list.length; + list = getPage(list, ctx.query.pageSize, ctx.query.pageNum); + ctx.body = { + total, + data: list, + }; +}); + +// @ 获取元分类列表 +atomModel.get('/getAtomModelList', async (ctx, next) => { + const deleteData = resourceCache.atomModelPool.deleteData.map((i) => ({ + atomModelId: i.atomModelId, + atomModelName: i.atomModelName, + })); + const narmalData = resourceCache.atomModelPool.normalData.map((i) => ({ + atomModelId: i.atomModelId, + atomModelName: i.atomModelName, + })); + ctx.body = { + deleteData, + narmalData, + }; +}); + +// @ 新建元分类 +atomModel.post('/createAtomModelItem', async (ctx, next) => { + const verif = CreateAtomModelItemDTO(ctx.request.body); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + let { atomModelName, atomModelDescribe } = ctx.request.body; + atomModelName = getNoSpacesStr(atomModelName).toUpperCase(); + // 名称查重 + if (checkName(atomModelName) == -1) { + const newAtomModel = await ctx.sequelize.models.AtomModel.create({ + atomModelName, + atomModelDescribe, + }); + resourceCache.atomModelPool.allData.push(newAtomModel.dataValues); + resourceCache.atomModelPool.normalData.push(newAtomModel.dataValues); + resourceCache.atomModelPool.objectData[ + newAtomModel.dataValues.atomModelId + ] = newAtomModel.dataValues; + resourceCache.atomModelPool.length++; + resourceCache.atomModelPool.updatetime = new Date().getTime(); + + const RRP = resourceCache.resourcePool; + RRP.classListForAtomModel[newAtomModel.dataValues.atomModelId] = [] + RRP.classNodeObjectForAtomModel[newAtomModel.dataValues.atomModelId] = [] + + // 给元分类加入基础几点 + const RBP = resourceCache.baseDictPool + RBP.atomModelObject[newAtomModel.dataValues.atomModelId] = { + baseDictTree: [], + reduceBaseDictTree: [], + }; + RBP.atomModelObject[newAtomModel.dataValues.atomModelId].baseDictTree = RBP.atomObject[ + '0' + ].children.filter( + (dict) => !(dict.atomModel && newAtomModel.dataValues.atomModelId != dict.atomModel), + ); + RBP.atomModelObject[newAtomModel.dataValues.atomModelId].reduceBaseDictTree = RBP.reduceObject[ + '0' + ].children.filter( + (dict) => !(dict.atomModel && newAtomModel.dataValues.atomModelId != dict.atomModel), + ); + + + ctx.body = { + message: '新建元分类成功。', + data: newAtomModel.dataValues, + }; + } else { + ctx.throw(400, { e: `元分类/模型重名: ${atomModelName}` }); + } +}); + +// @ 编辑元分类 +atomModel.post('/editAtomModelItem', async (ctx, next) => { + const verif = EditAtomModelItemDTO(ctx.request.body); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + let { atomModelName, atomModelDescribe, atomModelId } = ctx.request.body; + // 是否存在ID + const RAP = resourceCache.atomModelPool + const nowData = RAP.objectData[atomModelId] + if(!nowData || (nowData && nowData.isDelete)){ + ctx.throw(400, { e: '不存在元分类/模型记录' }); + return; + } + atomModelName = getNoSpacesStr(atomModelName).toUpperCase(); + // 名称查重 + const index = checkName(atomModelName); + if ( + index != -1 && + atomModelId != RAP.normalData[index].atomModelId + ) { + ctx.throw(400, { e: '元分类/模型名称重复' }); + return; + } + if ( + nowData.atomModelDescribe == atomModelDescribe && + nowData.atomModelName == atomModelName + ) { + ctx.body = { + message: '编辑元分类/模型成功', + }; + return; + } + nowData.atomModelName = atomModelName; + nowData.atomModelDescribe = + atomModelDescribe; + RAP.updatetime = new Date().getTime(); + ctx.body = { + message: '编辑元分类/模型成功', + }; + await next(); + await ctx.sequelize.models.AtomModel.update( + { atomModelName, atomModelDescribe }, + { where: { atomModelId } }, + ); +}); + +// @ 查重元分类名称 +atomModel.get('/checkAtomModelItemName', async (ctx, next) => { + const verif = CheckAtomModelItemNameDTO(ctx.query); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + let { atomModelName } = ctx.query; + atomModelName = getNoSpacesStr(atomModelName).toUpperCase(); + if (checkName(atomModelName) == -1) { + ctx.body = { message: '元分类/模型名称可用' }; + } else { + ctx.throw(400, { e: '元分类/模型名称重复' }); + } +}); + +// @ 删除元分类 +atomModel.delete('/deleteAtomModelItem', async (ctx, next) => { + const verif = DeleteAtomModelItemDTO(ctx.query); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + const { atomModelId } = ctx.query; + const RAP = resourceCache.atomModelPool + const normalIndex = binarySearch(RAP.normalData, atomModelId, 'atomModelId') + if (normalIndex == -1) { + ctx.throw(400, { e: '不存在此元分类/模型记录。' }); + return; + } + const allIndex = binarySearch(RAP.allData, atomModelId, 'atomModelId') + RAP.normalData.splice(normalIndex, 1); + RAP.allData.splice(allIndex, 1); + RAP.deleteData.push(RAP.objectData[atomModelId]) + RAP.length--; + RAP.updatetime = new Date().getTime(); + const DeleteTime = new Date().toISOString() + RAP.objectData[atomModelId].isDelete = DeleteTime + ctx.body = { message: '删除元分类/模型成功。' }; + await next(); + await ctx.sequelize.models.AtomModel.update( + { isDelete: DeleteTime }, + { where: { atomModelId } }, + ); +}); + +export default atomModel; + +// = 函数名: checkName +// = 描述: 查重模型名称 +// = 参数: None +// = 返回值: undefined +// = 创建人: expressgy +// = 创建时间: 2023-12-01 22:56:12 - +function checkName(name) { + for (let i = 0; i < resourceCache.atomModelPool.normalData.length; i++) { + if (name == resourceCache.atomModelPool.normalData[i].atomModelName) { + return i; + } + } + return -1; +} diff --git a/13=graphResource2/src/routes/graphResource2/baseDict/index.dto.js b/13=graphResource2/src/routes/graphResource2/baseDict/index.dto.js new file mode 100644 index 0000000..5a562d7 --- /dev/null +++ b/13=graphResource2/src/routes/graphResource2/baseDict/index.dto.js @@ -0,0 +1,229 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.dto.js - +// | @创建时间: 2023-12-02 00:21 +// | @更新时间: 2023-12-02 00:21 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import makeDTO from '#common/dto/index.js'; + +export function GetBaseDictTreeDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + }, + reduce:{ + type: ['integer'], + minimum: 0, + default: 1, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + } + }, + }; + return makeDTO(data, schema); +} + +export function GetBaseDictListDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: ['integer', 'null'], + minimum: 0, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + }, + searchData: { + type: 'string', + maxLength: 255, + errorMessage: { + type: '查询内容必须是一个字符串', + maxLength: '查询内容长度超出限制255', + }, + }, + }, + }; + return makeDTO(data, schema); +} + + +export function GetBaseDictStructForBaseDictIdDTO(data) { + const schema = { + type: 'object', + properties: { + baseDictId: { + type: 'integer', + minimum: 0, + errorMessage: { + type: '字典ID必须是整数', + minimum: '字典ID是一个正整数', + }, + }, + }, + required: ['baseDictId'], + errorMessage: { + required: { + baseDictId: '字典ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + + + +export function DeleteBaseDictItemDTO(data) { + const schema = { + type: 'object', + properties: { + baseDictId: { + type: 'integer', + minimum: 0, + errorMessage: { + type: '字典ID必须是整数', + minimum: '字典ID是一个正整数', + }, + }, + }, + required: ['baseDictId'], + errorMessage: { + required: { + baseDictId: '字典ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + + + + +export function CreateBaseDictItemDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + }, + baseDictName:{ + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '字典项名称必须是一个字符串', + maxLength: '字典项名称长度超出限制255', + minLength: '字典项名称长度过短', + }, + }, + baseDictFather:{ + type: ['integer'], + minimum: 0, + default: 0, + errorMessage: { + type: '字典项父ID必须是整数', + minimum: '字典项父ID是一个正整数', + }, + }, + baseDictDescribe:{ + type: 'string', + minLength: 1, + maxLength: 2048, + errorMessage: { + type: '字典项名称必须是一个字符串', + maxLength: '字典项名称长度超出限制2048', + minLength: '字典项名称长度过短', + }, + }, + baseDictIdentify:{ + type: 'string', + maxLength: 255, + errorMessage: { + type: '字典项标记必须是一个字符串', + maxLength: '字典项名称长度超出限制255', + }, + }, + }, + required: ['baseDictName'], + errorMessage: { + required: { + baseDictName: '字典项名称为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +export function EditBaseDictItemDTO(data) { + const schema = { + type: 'object', + properties: { + baseDictId: { + type: 'integer', + minimum: 0, + errorMessage: { + type: '字典ID必须是整数', + minimum: '字典ID是一个正整数', + }, + }, + baseDictName:{ + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '字典项名称必须是一个字符串', + maxLength: '字典项名称长度超出限制255', + minLength: '字典项名称长度过短', + }, + }, + baseDictDescribe:{ + type: 'string', + minLength: 1, + maxLength: 2048, + errorMessage: { + type: '字典项名称必须是一个字符串', + maxLength: '字典项名称长度超出限制2048', + minLength: '字典项名称长度过短', + }, + }, + baseDictIdentify:{ + type: 'string', + maxLength: 255, + errorMessage: { + type: '字典项标记必须是一个字符串', + maxLength: '字典项名称长度超出限制255', + }, + }, + }, + required: ['baseDictName', 'baseDictId'], + errorMessage: { + required: { + baseDictName: '字典项名称为必填项', + baseDictId: '字典ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} diff --git a/13=graphResource2/src/routes/graphResource2/baseDict/index.js b/13=graphResource2/src/routes/graphResource2/baseDict/index.js new file mode 100644 index 0000000..2c33738 --- /dev/null +++ b/13=graphResource2/src/routes/graphResource2/baseDict/index.js @@ -0,0 +1,494 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.js - +// | @创建时间: 2023-12-02 00:15 +// | @更新时间: 2023-12-02 00:15 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Router from 'koa-router'; +import { + CreateBaseDictItemDTO, + DeleteBaseDictItemDTO, + EditBaseDictItemDTO, + GetBaseDictListDTO, + GetBaseDictStructForBaseDictIdDTO, + GetBaseDictTreeDTO, +} from '#routes/graphResource2/baseDict/index.dto.js'; +import binarySearch from '#common/tools/binarySearch.js'; +import binarySearchMore from "#common/tools/binarySearchMore.js"; +import getNoSpacesStr from "#common/tools/getNoSpacesStr.js"; + +const baseDict = new Router(); + +// @ 获取字典树 +baseDict.get('/getBaseDictTree', async (ctx, next) => { + const verif = GetBaseDictTreeDTO(ctx.query); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + const { atomModelId, reduce } = ctx.query; + + const RBP = resourceCache.baseDictPool; + // 是否是精简查询 + const isReduce = !(reduce && reduce == 0); + if (atomModelId) { + // 按元分类/模型查询 + if (Object.keys(RBP.atomModelObject).includes(atomModelId.toString())) { + // 找到了指定的元分类/模型,返回其下的根节点字典树 + ctx.body = isReduce + ? RBP.atomModelObject[atomModelId].reduceBaseDictTree + : RBP.atomModelObject[atomModelId].baseDictTree; + } else { + // 未找到指定的元分类/模型,返回默认的根节点字典树,基础数据 + ctx.body = isReduce + ? RBP.atomModelObject[0].reduceBaseDictTree + : RBP.atomModelObject[0].baseDictTree; + } + } else { + // 没有传递元分类/模型id查所有字典 + ctx.body = isReduce + ? RBP.reduceObject[0].children + : RBP.atomObject[0].children; + } +}); + +// @ 获取字典名列表 +baseDict.get('/getBaseDictList', async (ctx, next) => { + const verif = GetBaseDictListDTO(ctx.query); + if (!verif.status) + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + const { searchData, atomModelId } = ctx.query; + const RBP = resourceCache.baseDictPool; + if (atomModelId) { + // 有元分类/模型id + if (Object.keys(RBP.atomModelObject).includes(atomModelId.toString())) { + // 找到了指定的元分类/模型,返回其下的根节点字典树,不包含子节点 + ctx.body = RBP.atomModelObject[atomModelId].reduceBaseDictTree.map( + (item) => ({ + atomModel: item.atomModel, + baseDictId: item.baseDictId, + baseDictName: item.baseDictName, + baseDictIdentify: item.baseDictIdentify, + baseDictDescribe: item.baseDictDescribe, + }), + ); + } else { + // 未找到指定的元分类/模型,返回默认的根节点字典树,基础数据,不包含子节点 + ctx.body = RBP.atomModelObject[0].reduceBaseDictTree.map( + (item) => ({ + atomModel: item.atomModel, + baseDictId: item.baseDictId, + baseDictName: item.baseDictName, + baseDictIdentify: item.baseDictIdentify, + baseDictDescribe: item.baseDictDescribe, + }), + ); + } + } else { + // 没有传递元分类/模型id查所有根字典,不包含子节点 + ctx.body = RBP.reduceObject[0].children.map((item) => ({ + atomModel: item.atomModel, + baseDictId: item.baseDictId, + baseDictName: item.baseDictName, + baseDictIdentify: item.baseDictIdentify, + baseDictDescribe: item.baseDictDescribe, + })); + } + if (searchData) { + // 如果有模糊查询,对上面返回的数据进行查询过滤 + ctx.body = ctx.body.filter((i) => { + return ( + i.baseDictName + + i.baseDictIdentify + + i.baseDictDescribe + ).includes(searchData); + }); + } +}); + +// @ 通过字典ID获取完整字典结构 +baseDict.get('/getBaseDictStructForBaseDictId', async (ctx, next) => { + const verif = GetBaseDictStructForBaseDictIdDTO(ctx.query); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + const { baseDictId } = ctx.query; + const RBP = resourceCache.baseDictPool; + if (Object.keys(RBP.reduceObject).includes(baseDictId.toString())) { + // 找到了目标字典项ID,查其精简树结构 + ctx.body = RBP.reduceObject[baseDictId]; + } else { + ctx.throw(400, { e: '未找到指定字典。' }); + } +}); + +// @ 删除字典项 +baseDict.delete('/deleteBaseDictItem', async (ctx, next) => { + const verif = DeleteBaseDictItemDTO(ctx.query); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + const baseDictId = ctx.query.baseDictId; + // 查看是否存在该字典项 + const RBP = resourceCache.baseDictPool; + if (!(RBP.atomObject[baseDictId] && !RBP.atomObject[baseDictId].isDelete)) { + return ctx.throw(400, { e: '不存在该字典项' }); + } + // 获取目标字典项ID及所有子节点id + + const baseDictIdList = getAllChildrenBaseDictId(baseDictId); + const deleteTime = new Date().toISOString(); + // 修改两个对象中的isDelete + baseDictIdList.push(baseDictId) + for (let i = 0; i < baseDictIdList.length; i++) { + RBP.atomObject[baseDictIdList[i]].isDelete = deleteTime; + RBP.reduceObject[baseDictIdList[i]].isDelete = deleteTime; + } + // 移除normalList的删除项 + // 给删除ID排序 + baseDictIdList.sort((a, b) => a-b) + // 获取坐标 + const indexList = binarySearchMore(RBP.atomNormalList, baseDictIdList, 'baseDictId', 0, RBP.atomNormalList.length) + // 坐标排序 + indexList.sort((a, b) => a-b) + // 批量删除 + for(let i = indexList.length - 1; i >=0; i--){ + // 从后面删除不影响前面的 + RBP.atomNormalList.splice(indexList[i], 1) + } + // 增加DeleteList项 + RBP.atomDeleteList.push(...baseDictIdList.map(i => RBP.atomObject[i])) + // 将节点从children移出至delChildren + // 移除子元素 + moveChildrenToDelChildren(RBP.atomObject[baseDictId]); + moveChildrenToDelChildren(RBP.reduceObject[baseDictId]); + // 移除本身 + // 原始值 + const fatherBaseDict = RBP.atomObject[RBP.atomObject[baseDictId].baseDictFather]; + // 这里使用二分法是因为确定children升序排列,精简和原始位置一样 + const index = binarySearch(fatherBaseDict.children, baseDictId, 'baseDictId'); + fatherBaseDict.children.splice(index, 1); + fatherBaseDict.delChildren.push(RBP.atomObject[baseDictId]) + fatherBaseDict.delChildren.sort((a, b) => a.baseDictId - b.baseDictId) + // 精简值 + const fatherBaseDictReduce = RBP.reduceObject[RBP.reduceObject[baseDictId].baseDictFather]; + fatherBaseDictReduce.children.splice(index, 1); + fatherBaseDictReduce.delChildren.push(RBP.reduceObject[baseDictId]) + fatherBaseDictReduce.delChildren.sort((a, b) => a.baseDictId - b.baseDictId) + + ctx.body = { + message: '删除节点成功' + }; + await next(); + await ctx.sequelize.models.BaseDict.update( + { + isDelete: deleteTime, + }, + { where: { baseDictId: baseDictIdList } }, + ); +}); + +// @ 新建字典项 +baseDict.post('/createBaseDictItem', async (ctx, next) => { + const verif = CreateBaseDictItemDTO(ctx.request.body); + if (!verif.status) + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + const atomModelId = ctx.request.body.atomModelId; // 元分类/模型ID + const baseDictName = getNoSpacesStr(ctx.request.body.baseDictName); // 字典项名称 + const baseDictFather = ctx.request.body.baseDictFather; // 父节点ID + const baseDictDescribe = ctx.request.body.baseDictDescribe; // 字典项描述 + const baseDictIdentify = ctx.request.body.baseDictIdentify; // 字典项标志 + const RBP = resourceCache.baseDictPool; + + if (baseDictFather == 0) { + // 根节点 + if (!atomModelId) { + // 检查是否存在元分类/模型ID + return ctx.throw(400, { e: '根字典需要携带元分类/模型ID' }); + } + const hasAtomModel = binarySearch( + resourceCache.atomModelPool.normalData, + atomModelId, + 'atomModelId', + ); + // 判断字典缓存是否存在元分类 + if (hasAtomModel == -1) { + // 检查是否存在元分类/模型 + return ctx.throw(400, { e: '不存在目标元分类/模型' }); + } + const check = checkRootDictName(baseDictName, atomModelId); + if (check != -1) { + // 检查是否重名 + return ctx.throw(400, { e: '该根字典项在目标元分类/模型下重名' }); + } + // 写入数据库 + const newBaseDict = await ctx.sequelize.models.BaseDict.create({ + atomModel: atomModelId, + baseDictName, + baseDictFather, + baseDictDescribe, + baseDictIdentify, + }); + // 获取原始数据 + const newBaseDictItem = newBaseDict.dataValues; + newBaseDictItem.children = []; + newBaseDictItem.delChildren = []; + // 压入原始全量字典列表缓存 + RBP.atomAllList.push(newBaseDictItem); + // 压入原始正常字典列表缓存 + RBP.atomNormalList.push(newBaseDictItem); + // 建立原始字典对象 + RBP.atomObject[newBaseDictItem.baseDictId] = newBaseDictItem; + // 建立原始字典对象关系 + RBP.atomObject['0'].children.push(newBaseDictItem); + // 生成简化数据 + const reduceData = { + atomModel: newBaseDictItem.atomModel, + baseDictId: newBaseDictItem.baseDictId, + baseDictName: newBaseDictItem.baseDictName, + baseDictIdentify: newBaseDictItem.baseDictIdentify, + baseDictDescribe: newBaseDictItem.baseDictDescribe, + baseDictFather: newBaseDictItem.baseDictFather, + children: [], + delChildren: [], + }; + // 建立简化字典对象 + RBP.reduceObject[newBaseDictItem.baseDictId] = reduceData; + // 建立简化字典对象关系 + RBP.reduceObject['0'].children.push(reduceData); + if ( + !Object.keys(RBP.atomModelObject).includes(atomModelId.toString()) + ) { + // 判断缓存是否存在元分类/模型对象 + // 建立元分类字典缓存对象 + RBP.atomModelObject[atomModelId] = { + baseDictTree: [], + reduceBaseDictTree: [], + }; + } + // 分别压入精简原始字典对象到根节点树 + RBP.atomModelObject[atomModelId].baseDictTree.push(newBaseDictItem); + RBP.atomModelObject[atomModelId].reduceBaseDictTree.push(reduceData); + return (ctx.body = { + message: '添加字典项成功', + data: newBaseDictItem, + }); + } else { + // 子节点 + // 判断父节点是否存在 + if ( + !RBP.atomObject[baseDictFather] || + (RBP.atomObject[baseDictFather] && + RBP.atomObject[baseDictFather].isDelete) + ) { + return ctx.throw(400, { e: '不存在父节点' }); + } + // 获取根节点元分类/模型ID + const rootAtomModelId = getRootAtomModelId(baseDictFather); + if (atomModelId != undefined && atomModelId != rootAtomModelId) { + return ctx.throw(400, { + e: '目标元分类/模型与根字典元分类/模型不匹配', + }); + } + // 查同级节点重名 + const check = checkTargetChildrenDictName(baseDictFather, baseDictName); + if (check != -1) { + return ctx.throw(400, { e: '该根字典项在目标字典下重名' }); + } + // 写入数据库 + const newBaseDict = await ctx.sequelize.models.BaseDict.create({ + atomModel: atomModelId, + baseDictName, + baseDictFather, + baseDictDescribe, + baseDictIdentify, + }); + // 获取原始数据 + const newBaseDictItem = newBaseDict.dataValues; + newBaseDictItem.children = []; + newBaseDictItem.delChildren = []; + // 压入原始全量字典列表缓存 + RBP.atomAllList.push(newBaseDictItem); + // 压入原始正常字典列表缓存 + RBP.atomNormalList.push(newBaseDictItem); + // 建立原始字典对象 + RBP.atomObject[newBaseDictItem.baseDictId] = newBaseDictItem; + // 建立原始字典对象关系 + RBP.atomObject[baseDictFather].children.push(newBaseDictItem); + // 生成简化数据 + const reduceData = { + atomModel: newBaseDictItem.atomModel, + baseDictId: newBaseDictItem.baseDictId, + baseDictName: newBaseDictItem.baseDictName, + baseDictIdentify: newBaseDictItem.baseDictIdentify, + baseDictDescribe: newBaseDictItem.baseDictDescribe, + baseDictFather: newBaseDictItem.baseDictFather, + children: [], + delChildren: [], + }; + // 建立简化字典对象 + RBP.reduceObject[newBaseDictItem.baseDictId] = reduceData; + // 建立简化字典对象关系 + RBP.reduceObject[baseDictFather].children.push(reduceData); + // 检查一下AtomModelObject + // console.log(JSON.stringify(RBP.atomModelObject[atomModelId].baseDictTree,null,4)); + // console.log(JSON.stringify(RBP.atomModelObject[atomModelId].reduceBaseDictTree, null, 4)); + return (ctx.body = { + message: '添加字典项成功', + data: newBaseDictItem, + }); + } +}); + +// @ 编辑字典项 +baseDict.post('/editBaseDictItem', async (ctx, next) => { + const verif = EditBaseDictItemDTO(ctx.request.body); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + const baseDictId = ctx.request.body.baseDictId; + const baseDictName = getNoSpacesStr(ctx.request.body.baseDictName); + const baseDictDescribe = ctx.request.body.baseDictDescribe; + const baseDictIdentify = ctx.request.body.baseDictIdentify; + const RBP = resourceCache.baseDictPool; + // 检查字典项是否存在 + if (!(RBP.atomObject[baseDictId] && !RBP.atomObject[baseDictId].isDelete)) { + return ctx.throw(400, { e: '待修改的字典项不存在' }); + } + // 查重名 + const baseDictFather = RBP.atomObject[baseDictId].baseDictFather; + if (baseDictFather == 0) { + const check = checkRootDictName( + baseDictName, + RBP.atomObject[baseDictId].atomModel, + ); + if ( + check != -1 && + RBP.atomObject[baseDictFather].children[check].baseDictId != + baseDictId + ) { + return ctx.throw(400, { e: '待修改的字典项在目标字典下重名' }); + } + } else { + const check = checkTargetChildrenDictName(baseDictFather, baseDictName); + if ( + check != -1 && + RBP.atomObject[baseDictFather].children[check].baseDictId != + baseDictId + ) { + return ctx.throw(400, { e: '待修改的字典项在目标字典下重名' }); + } + } + // 更新原始对象字典 + RBP.atomObject[baseDictId].baseDictId = baseDictId; + RBP.atomObject[baseDictId].baseDictName = baseDictName; + RBP.atomObject[baseDictId].baseDictDescribe = baseDictDescribe; + RBP.atomObject[baseDictId].baseDictIdentify = baseDictIdentify; + // 更新精简对象字典 + RBP.reduceObject[baseDictId].baseDictId = baseDictId; + RBP.reduceObject[baseDictId].baseDictName = baseDictName; + RBP.reduceObject[baseDictId].baseDictDescribe = baseDictDescribe; + RBP.reduceObject[baseDictId].baseDictIdentify = baseDictIdentify; + // 检查一下AtomModelObject + // console.log(JSON.stringify(RBP.atomModelObject[RBP.atomObject[baseDictId].atomModel].baseDictTree,null,4)); + // console.log(JSON.stringify(RBP.atomModelObject[RBP.atomObject[baseDictId].atomModel].reduceBaseDictTree, null, 4)); + ctx.body = { + message: '字典项更新成功', + }; + await next(); + await ctx.sequelize.models.BaseDict.update( + { + baseDictName, + baseDictDescribe, + baseDictIdentify, + }, + { where: { baseDictId } }, + ); +}); + +export default baseDict; + +// 查重根节点的字典名字 +function checkRootDictName(baseDictName, atomModelId) { + const RBP = resourceCache.baseDictPool; + const normalRootList = RBP.reduceObject[0].children; + for (let i = 0; i < normalRootList.length; i++) { + if ( + normalRootList[i].baseDictName == baseDictName && + normalRootList[i].atomModel == atomModelId + ) { + return i; + } + } + return -1; +} + +// 查重目标节点的子节点名字 +function checkTargetChildrenDictName(baseDictFather, baseDictName) { + const RBP = resourceCache.baseDictPool; + const targetList = RBP.atomObject[baseDictFather].children; + for (let i = 0; i < targetList.length; i++) { + if (targetList[i].baseDictName == baseDictName) { + return i; + } + } + return -1; +} + +// 获取字典项的根节点上的元分类/模型ID +function getRootAtomModelId(baseDictFather) { + const fatherNode = resourceCache.baseDictPool.atomObject[baseDictFather]; + if (fatherNode.baseDictFather == 0) { + return fatherNode.atomModel; + } else { + return getRootAtomModelId(fatherNode.baseDictFather); + } +} + +// 查字典项下所有的子节点id +function getAllChildrenBaseDictId(baseDictId) { + const baseDictIdList = []; + for ( + let i = 0; + i < resourceCache.baseDictPool.atomObject[baseDictId].children.length; + i++ + ) { + if ( + resourceCache.baseDictPool.atomObject[baseDictId].children[i] + .children.length > 0 + ) { + baseDictIdList.push( + ...getAllChildrenBaseDictId( + resourceCache.baseDictPool.atomObject[baseDictId].children[ + i + ].baseDictId, + ), + ); + } + baseDictIdList.push( + resourceCache.baseDictPool.atomObject[baseDictId].children[i] + .baseDictId, + ); + } + return baseDictIdList; +} + +// 把children移动至delChildren +function moveChildrenToDelChildren(obj) { + if (obj.children.length > 0) { + for (let i = 0; i < obj.children.length; i++) { + moveChildrenToDelChildren(obj.children[i]); + } + } + obj.delChildren.push(...obj.children); + obj.delChildren.sort((a, b) => a.baseDictId - b.baseDictId); + obj.children = []; +} diff --git a/13=graphResource2/src/routes/graphResource2/index.js b/13=graphResource2/src/routes/graphResource2/index.js new file mode 100644 index 0000000..036a95a --- /dev/null +++ b/13=graphResource2/src/routes/graphResource2/index.js @@ -0,0 +1,65 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.js - +// | @创建时间: 2023-12-01 17:48 +// | @更新时间: 2023-12-01 17:48 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Router from 'koa-router'; +import atomModel from "#routes/graphResource2/atomModel/index.js"; +import testDTO from "#routes/index.dto.js"; +import rootRouter from "#routes/index.js"; +import baseDict from "#routes/graphResource2/baseDict/index.js"; +import resourceClass from "#routes/graphResource2/resourceClass/index.js"; + +const graphResource2 = new Router(); + +graphResource2.get('/', async (ctx) => { + const data = testDTO({ + name: 'hexi', + age: 32, + email: 'expressgy', + }); + console.log(data); + ctx.body = 'Hello graphResource2!'; +}); +graphResource2.use('/atomModel', atomModel.routes()); +graphResource2.use('/baseDict', baseDict.routes()); +graphResource2.use('/resourceClass', resourceClass.routes()) + + +// graphResource2.use(async (ctx, next) => { +// +// console.log(1) +// await next() +// console.log(2) +// }) +// +// graphResource2.get('/', async ctx => { +// ctx.body = 'USER' +// }) +// +// +// graphResource2.get('/:id', async ctx => { +// console.log(ctx.params) +// console.log(ctx.query) +// ctx.body = 'USER' +// }) +// +// graphResource2.post('/:id/create', async ctx => { +// console.log(ctx.params) +// console.log(ctx.query) +// console.log(ctx.request.body) +// ctx.body = 'USER' +// }) + + + + +export default graphResource2 diff --git a/13=graphResource2/src/routes/graphResource2/resourceClass/index.dto.js b/13=graphResource2/src/routes/graphResource2/resourceClass/index.dto.js new file mode 100644 index 0000000..760cd03 --- /dev/null +++ b/13=graphResource2/src/routes/graphResource2/resourceClass/index.dto.js @@ -0,0 +1,655 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.dto.js - +// | @创建时间: 2023-12-03 15:30 +// | @更新时间: 2023-12-03 15:30 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import makeDTO from '#common/dto/index.js'; + +export function GetBaseDictTreeDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + }, + reduce: { + type: ['integer'], + minimum: 0, + default: 1, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + }, + }, + }; + return makeDTO(data, schema); +} + +// @ 获取资源类列表 +export function GetResourceClassListDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + }, + searchData: { + type: 'string', + maxLength: 255, + errorMessage: { + type: '查询内容必须是一个字符串', + maxLength: '查询内容长度超出限制255', + }, + }, + }, + required: ['atomModelId'], + errorMessage: { + required: { + atomModelId: '元分类/模型ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +// @ 获取资源类分页 +export function GetResourceClassPageDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + }, + searchData: { + type: 'string', + maxLength: 255, + errorMessage: { + type: '查询内容必须是一个字符串', + maxLength: '查询内容长度超出限制255', + }, + }, + pageSize: { + type: 'integer', + minimum: 1, + maximum: 200, + default: 10, + errorMessage: { + type: '每页数量必须是一个数字', + minimum: '每页数量最少是1', + maximum: '每页数量最多是200', + }, + }, + pageNum: { + type: 'integer', + minimum: 1, + default: 1, + errorMessage: { + type: '页码必须是数字类型', + minimum: '页码最小是1', + }, + }, + }, + required: ['atomModelId'], + errorMessage: { + required: { + atomModelId: '元分类/模型ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +// @ 获取资源类树 +export function GetResourceClassTreeDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + }, + searchData: { + type: 'string', + maxLength: 255, + errorMessage: { + type: '查询内容必须是一个字符串', + maxLength: '查询内容长度超出限制255', + }, + }, + }, + required: ['atomModelId'], + errorMessage: { + required: { + atomModelId: '元分类/模型ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +// @ 添加资源类 +export function CreateResourceClassItemDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + }, + resourceClassBaseDefine: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '资源类来源必须是整数', + minimum: '资源类来源是一个正整数', + }, + }, + resourceClassBaseName: { + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '资源类名必须是一个字符串', + maxLength: '资源类名长度超出限制255', + minLength: '资源类名长度过短', + }, + }, + resourceClassBaseDescribe: { + type: 'string', + minLength: 1, + maxLength: 2048, + errorMessage: { + type: '资源类描述必须是一个字符串', + maxLength: '资源类描述长度超出限制2048', + minLength: '资源类描述长度过短', + }, + }, + resourceClassBaseType: { + type: ['integer'], + minimum: 0, + default: 0, + errorMessage: { + type: '资源类业务类型必须是整数', + minimum: '资源类业务类型是一个正整数', + }, + }, + resourceClassBaseIdentify: { + type: 'string', + minLength: 8, + maxLength: 8, + pattern: '^[a-zA-Z\\s]+$', + errorMessage: { + type: '资源类标识必须是一个字符串', + maxLength: '资源类标识是一个8位字符串', + minLength: '资源类标识是一个8位字符串', + pattern: '资源类标识必须为纯英文', + }, + }, + resourceClassBaseColor: { + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '资源类颜色描述必须是一个字符串', + maxLength: '资源类颜色描述长度超出限制255', + minLength: '资源类颜色描述长度过短', + }, + }, + resourceClassBaseAvatar: { + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '资源类图标必须是一个字符串', + maxLength: '资源类图标长度超出限制255', + minLength: '资源类图标长度过短', + }, + }, + resourceClassRelationId: { + type: ['integer'], + minimum: 0, + default: 0, + errorMessage: { + type: '父资源类节点ID必须是整数', + minimum: '父资源类节点ID是一个正整数', + }, + }, + }, + required: [ + 'atomModelId', + 'resourceClassBaseIdentify', + 'resourceClassBaseDescribe', + 'resourceClassBaseName', + ], + errorMessage: { + required: { + atomModelId: '元分类/模型ID为必填项', + resourceClassBaseIdentify: '资源类标识为必填项', + resourceClassBaseDescribe: '资源类描述为必填项', + resourceClassBaseName: '资源类名称为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +// @ 编辑资源类 +export function EditResourceClassItemDTO(data) { + const schema = { + type: 'object', + properties: { + resourceClassBaseId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '资源类ID必须是整数', + minimum: '资源类ID是一个正整数', + }, + }, + resourceClassBaseDefine: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '资源类来源必须是整数', + minimum: '资源类来源是一个正整数', + }, + }, + resourceClassBaseName: { + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '资源类名必须是一个字符串', + maxLength: '资源类名长度超出限制255', + minLength: '资源类名长度过短', + }, + }, + resourceClassBaseDescribe: { + type: 'string', + minLength: 1, + maxLength: 2048, + errorMessage: { + type: '资源类描述必须是一个字符串', + maxLength: '资源类描述长度超出限制2048', + minLength: '资源类描述长度过短', + }, + }, + resourceClassBaseType: { + type: ['integer'], + minimum: 0, + default: 0, + errorMessage: { + type: '资源类业务类型必须是整数', + minimum: '资源类业务类型是一个正整数', + }, + }, + resourceClassBaseIdentify: { + type: 'string', + minLength: 8, + maxLength: 8, + pattern: '^[a-zA-Z\\s]+$', + errorMessage: { + type: '资源类标识必须是一个字符串', + maxLength: '资源类标识是一个8位字符串', + minLength: '资源类标识是一个8位字符串', + pattern: '资源类标识必须为纯英文', + }, + }, + resourceClassBaseColor: { + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '资源类颜色描述必须是一个字符串', + maxLength: '资源类颜色描述长度超出限制255', + minLength: '资源类颜色描述长度过短', + }, + }, + resourceClassBaseAvatar: { + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '资源类图标必须是一个字符串', + maxLength: '资源类图标长度超出限制255', + minLength: '资源类图标长度过短', + }, + }, + }, + required: [ + 'resourceClassBaseId', + 'resourceClassBaseIdentify', + 'resourceClassBaseName', + ], + errorMessage: { + required: { + resourceClassBaseId: '资源类ID为必填项', + resourceClassBaseIdentify: '资源类标识为必填项', + resourceClassBaseName: '资源类名称为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +// @ 删除资源类 +export function DeleteResourceClassItemDTO(data) { + const schema = { + type: 'object', + properties: { + nodeId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '资源类节点ID必须是整数', + minimum: '资源类节点ID是一个正整数', + }, + }, + }, + required: ['nodeId'], + errorMessage: { + required: { + nodeId: '资源类节点ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +// @ 创建资源类关联 +export function CreateResourceClassRelationDTO(data) { + const schema = { + type: 'object', + properties: { + resourceClassRelationFather: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '父级资源类ID必须是整数', + minimum: '父级资源类ID是一个正整数', + }, + }, + resourceClassRelationTarget: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '父级资源类ID必须是整数', + minimum: '目标资源类ID是一个正整数', + }, + }, + }, + required: [ + 'resourceClassRelationFather', + 'resourceClassRelationTarget', + ], + errorMessage: { + required: { + resourceClassRelationFather: '父级资源类ID为必填项', + resourceClassRelationTarget: '目标资源类ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +// @ 删除资源类关联 +export function DeleteResourceClassRelationDTO(data) { + const schema = { + type: 'object', + properties: { + resourceClassRelationId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '资源类关联ID必须是整数', + minimum: '资源类关联ID是一个正整数', + }, + }, + }, + required: ['resourceClassRelationId'], + errorMessage: { + required: { + resourceClassRelationId: '资源类关联ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +// @ 获取资源类完整信息 +export function GetResourceClassCompleteInfoDTO(data) { + const schema = { + type: 'object', + properties: { + resourceClassBaseId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '资源类关联ID必须是整数', + minimum: '资源类关联ID是一个正整数', + }, + }, + resourceClassBaseIdentify: { + type: 'string', + minLength: 8, + maxLength: 8, + pattern: '^[a-zA-Z\\s]+$', + errorMessage: { + type: '资源类标识必须是一个字符串', + maxLength: '资源类标识是一个8位字符串', + minLength: '资源类标识是一个8位字符串', + pattern: '资源类标识必须为纯英文', + }, + }, + }, + }; + return makeDTO(data, schema); +} + +// @ 创建资源类拓展字段 +export function CreateResourceClassExpandFieldItemDTO(data) { + const schema = { + type: 'object', + properties: { + resourceClassBaseId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '资源类ID必须是整数', + minimum: '资源类ID是一个正整数', + }, + }, + resourceClassExpandFieldName: { + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '资源类拓展字段名必须是一个字符串', + maxLength: '资源类拓展字段名长度超出限制255', + minLength: '资源类拓展字段名长度过短', + }, + }, + resourceClassExpandFieldIdentify: { + type: 'string', + minLength: 1, + maxLength: 64, + pattern: '^[a-zA-Z\\s]+$', + errorMessage: { + type: '资源类拓展字段标识必须是一个字符串', + maxLength: '资源类拓展字段标识是一个8位字符串', + minLength: '资源类拓展字段标识是一个8位字符串', + pattern: '资源类拓展字段标识必须为纯英文', + }, + }, + resourceClassExpandFieldDisplayType: { + type: ['integer'], + minimum: 0, + default: 0, + errorMessage: { + type: '拓展字段显示类型必须是整数', + minimum: '拓展字段显示类型是一个正整数', + }, + }, + resourceClassExpandFieldRelationType: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '拓展字段关联类型必须是整数', + minimum: '拓展字段关联类型是一个正整数', + }, + }, + resourceClassExpandFieldValue: { + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '资源类拓展字段值必须是一个字符串', + maxLength: '资源类拓展字段值长度超出限制255', + minLength: '资源类拓展字段值长度过短', + }, + }, + }, + required: ['resourceClassBaseId', 'resourceClassExpandFieldName', 'resourceClassExpandFieldIdentify', 'resourceClassExpandFieldValue'], + errorMessage: { + required: { + resourceClassBaseId: '资源类ID为必填项', + resourceClassExpandFieldName: '资源类拓展字段名为必填项', + resourceClassExpandFieldIdentify: '资源类拓展字段标识为必填项', + resourceClassExpandFieldValue: '资源类拓展字段值为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +// @ 编辑资源类拓展字段 +export function EditResourceClassExpandFieldItemDTO(data) { + const schema = { + type: 'object', + properties: { + resourceClassExpandFieldId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '资源类拓展字段ID必须是整数', + minimum: '资源类拓展字段ID是一个正整数', + }, + }, + resourceClassExpandFieldName: { + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '资源类拓展字段名必须是一个字符串', + maxLength: '资源类拓展字段名长度超出限制255', + minLength: '资源类拓展字段名长度过短', + }, + }, + resourceClassExpandFieldIdentify: { + type: 'string', + minLength: 1, + maxLength: 64, + pattern: '^[a-zA-Z\\s]+$', + errorMessage: { + type: '资源类拓展字段标识必须是一个字符串', + maxLength: '资源类拓展字段标识是一个8位字符串', + minLength: '资源类拓展字段标识是一个8位字符串', + pattern: '资源类拓展字段标识必须为纯英文', + }, + }, + resourceClassExpandFieldDisplayType: { + type: ['integer'], + minimum: 0, + default: 0, + errorMessage: { + type: '拓展字段显示类型必须是整数', + minimum: '拓展字段显示类型是一个正整数', + }, + }, + resourceClassExpandFieldRelationType: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '拓展字段关联类型必须是整数', + minimum: '拓展字段关联类型是一个正整数', + }, + }, + resourceClassExpandFieldValue: { + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '资源类拓展字段值必须是一个字符串', + maxLength: '资源类拓展字段值长度超出限制255', + minLength: '资源类拓展字段值长度过短', + }, + }, + }, + required: ['resourceClassExpandFieldId', 'resourceClassExpandFieldName', 'resourceClassExpandFieldIdentify', 'resourceClassExpandFieldValue'], + errorMessage: { + required: { + resourceClassExpandFieldId: '资源类拓展字段ID为必填项', + resourceClassExpandFieldName: '资源类拓展字段名为必填项', + resourceClassExpandFieldIdentify: '资源类拓展字段标识为必填项', + resourceClassExpandFieldValue: '资源类拓展字段值为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +// @ 删除资源类拓展字段 +export function DeleteResourceClassExpandFieldItemDTO(data) { + const schema = { + type: 'object', + properties: { + resourceClassExpandFieldId: { + type: ['integer'], + minimum: 0, + errorMessage: { + type: '资源类拓展字段ID必须是整数', + minimum: '资源类拓展字段ID是一个正整数', + }, + }, + }, + required: ['resourceClassExpandFieldId', ], + errorMessage: { + required: { + resourceClassExpandFieldId: '资源类拓展字段ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} diff --git a/13=graphResource2/src/routes/graphResource2/resourceClass/index.js b/13=graphResource2/src/routes/graphResource2/resourceClass/index.js new file mode 100644 index 0000000..e18bd12 --- /dev/null +++ b/13=graphResource2/src/routes/graphResource2/resourceClass/index.js @@ -0,0 +1,650 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.js - +// | @创建时间: 2023-12-03 15:24 +// | @更新时间: 2023-12-03 15:24 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import Router from 'koa-router'; +import { + CreateResourceClassExpandFieldItemDTO, + CreateResourceClassItemDTO, + CreateResourceClassRelationDTO, + DeleteResourceClassExpandFieldItemDTO, + DeleteResourceClassItemDTO, + DeleteResourceClassRelationDTO, + EditResourceClassExpandFieldItemDTO, + EditResourceClassItemDTO, + GetResourceClassCompleteInfoDTO, + GetResourceClassListDTO, + GetResourceClassPageDTO, + GetResourceClassTreeDTO, +} from '#routes/graphResource2/resourceClass/index.dto.js'; +import getPage from '#common/tools/getArrayPage.js'; +import getNoSpacesStr from '#common/tools/getNoSpacesStr.js'; +import binarySearch from '#common/tools/binarySearch.js'; +import binarySearchMore from '#common/tools/binarySearchMore.js'; +import { Op } from 'sequelize'; + +const resourceClass = new Router(); + +// @ 获取资源类列表 +resourceClass.get('/getResourceClassList', async (ctx, next) => { + const verif = GetResourceClassListDTO(ctx.query); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + const RAP = resourceCache.atomModelPool; + const { searchData, atomModelId } = ctx.query; + if (!RAP.normalData.some((i) => i.atomModelId == atomModelId)) { + return ctx.throw(400, { e: '不存在该元分类/模型' }); + } + const RRP = resourceCache.resourcePool; + const classListForAtomModel = RRP.classListForAtomModel[atomModelId].map( + (i) => ({ + resourceClassBaseId: i.resourceClassBaseId, + resourceClassBaseName: i.resourceClassBaseName, + resourceClassBaseIdentify: i.resourceClassBaseIdentify, + resourceClassBaseColor: i.resourceClassBaseColor, + resourceClassBaseAvatar: i.resourceClassBaseAvatar, + }), + ); + ctx.body = classListForAtomModel; + if (searchData) { + ctx.body = classListForAtomModel.filter((i) => + i.resourceClassBaseName.includes(searchData.trim()), + ); + } +}); + +// @ 获取资源类分页 +resourceClass.get('/getResourceClassPage', async (ctx, next) => { + const verif = GetResourceClassPageDTO(ctx.query); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + const RAP = resourceCache.atomModelPool; + const { searchData, atomModelId, pageSize, pageNum } = ctx.query; + if (!RAP.normalData.some((i) => i.atomModelId == atomModelId)) { + return ctx.throw(400, { e: '不存在该元分类/模型' }); + } + const RRP = resourceCache.resourcePool; + let classListForAtomModel = RRP.classListForAtomModel[atomModelId]; + if (searchData) { + classListForAtomModel = classListForAtomModel.filter((i) => + i.resourceClassBaseName.includes(searchData.trim()), + ); + } + const pageList = getPage(classListForAtomModel, pageSize, pageNum); + ctx.body = { + total: classListForAtomModel.length, + data: classListForAtomModel, + }; +}); + +// @ 获取资源类树 +resourceClass.get('/getResourceClassTree', async (ctx, next) => { + const verif = GetResourceClassTreeDTO(ctx.query); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + const RAP = resourceCache.atomModelPool; + const { searchData, atomModelId } = ctx.query; + if (!RAP.normalData.some((i) => i.atomModelId == atomModelId)) { + return ctx.throw(400, { e: '不存在该元分类/模型' }); + } + const RRP = resourceCache.resourcePool; + ctx.body = RRP.classNodeObjectForAtomModel[atomModelId].map( + (i) => i.nodeZeroInfo, + ); +}); + +// @ 添加资源类 +resourceClass.post('/createResourceClassItem', async (ctx, next) => { + const verif = CreateResourceClassItemDTO(ctx.request.body); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + const { + atomModelId, + resourceClassBaseName, + resourceClassBaseDescribe, + resourceClassBaseIdentify, + resourceClassBaseAvatar, + resourceClassBaseDefine, + resourceClassBaseColor, + resourceClassRelationId, + resourceClassBaseType, + } = ctx.request.body; + const RAP = resourceCache.atomModelPool; + const RRP = resourceCache.resourcePool; + // @ 判断是否存在元分类/模型 + if (!RAP.normalData.some((i) => i.atomModelId == atomModelId)) { + return ctx.throw(400, { e: '不存在目标元分类/模型' }); + } + // @ 判断是否重名 + if ( + RRP.classListForAtomModel[atomModelId].some( + (i) => + i.resourceClassBaseName == + getNoSpacesStr(resourceClassBaseName), + ) + ) { + return ctx.throw(400, { e: '资源类在目标元分类/模型已存在' }); + } + // @ 判断是否已存在资源类标识 + if ( + RRP.classList.some( + (i) => + i.resourceClassBaseIdentify == + getNoSpacesStr(resourceClassBaseIdentify).toUpperCase(), + ) + ) { + return ctx.throw(400, { e: '资源类标识已存在' }); + } + // @ 判断是否存在父节点 + if (resourceClassRelationId != 0) { + if (RRP.classRelationObject[resourceClassRelationId] == undefined) { + return ctx.throw(400, { e: '不存在目标资源类树节点' }); + } + if ( + !RRP.classListForAtomModel[atomModelId].some( + (i) => + i.resourceClassBaseId == + RRP.classRelationObject[resourceClassRelationId] + .resourceClassRelationTarget, + ) + ) { + return ctx.throw(400, { + e: '目标资源类树节点不存在于目标元分类/模型中', + }); + } + } + + // 写入资源类 + const newClassItem = await ctx.sequelize.models.ResourceClassBase.create({ + atomModel: atomModelId, + resourceClassBaseName: getNoSpacesStr(resourceClassBaseName), + resourceClassBaseDescribe, + resourceClassBaseIdentify: getNoSpacesStr( + resourceClassBaseIdentify, + ).toUpperCase(), + resourceClassBaseAvatar, + resourceClassBaseDefine, + resourceClassBaseColor, + resourceClassBaseType, + }); + const newClassData = newClassItem.dataValues; + const classId = newClassData.resourceClassBaseId; + // | 建立缓存 + // @ 资源类基础信息 + // ! 写入classList + RRP.classList.push(newClassData); + // ! 写入classListForAtomModel + if (RRP.classListForAtomModel[atomModelId] === undefined) { + RRP.classListForAtomModel[atomModelId] = []; + } + RRP.classListForAtomModel[atomModelId].push(newClassData); + // ! 写入classIdList + RRP.classIdList.push(classId); + // ! 写入classObject + RRP.classObject[classId] = newClassData; + + // @ 资源类拓展字段信息 + // ! 写入classExpandForClassBaseObject + RRP.classExpandForClassBaseObject[classId] = {}; + + // @ 资源实体结构表 + // ! 写入entityStructForClassBaseObject + RRP.entityStructForClassBaseObject[classId] = {}; + + // @ 资源类关系 + // ! 写入classRelationObjectForTargetClass + RRP.classRelationObjectForTargetClass[classId] = []; + // @ 获取目标资源关系节点的资源类ID + const fatherClassId = + resourceClassRelationId == 0 + ? 0 + : RRP.classRelationObject[resourceClassRelationId] + .resourceClassRelationTarget; + // 在数据库添加这条关系 + const newClassRelation = + await ctx.sequelize.models.ResourceClassRelation.create({ + resourceClassRelationFather: fatherClassId, + resourceClassRelationTarget: classId, + }); + const newClassRelationData = newClassRelation.dataValues; + const newRelationId = newClassRelationData.resourceClassRelationId; + + RRP.classRelationList.push(newClassRelationData); + RRP.classRelationIdList.push(newRelationId); + RRP.classRelationObject[newRelationId] = newClassRelationData; + RRP.classRelationObjectForTargetClass[classId].push(newClassRelationData); + + // @ 资源类数据模型对象集合 + // ! 写入classModelObject + RRP.classModelObject[classId] = new RRP.ClassModel( + RRP.classObject[classId], + ); + await RRP.classModelObject[ + newClassData.resourceClassBaseId + ].createSequelizeModel(); + + // @ 关系节点数据模型 + // ! 这里生成关系节点数据模型 + // 拿到当前资源类模型 + const nowClassModel = RRP.classModelObject[classId]; + // 获取当前资源类模型的关联列表 + const nowRelationList = nowClassModel.classRelationList; + // 拿到父节点和节点ID + const nodeId = nowRelationList[0].resourceClassRelationId; + const classNode = new RRP.ClassNodeModel(nowClassModel, nodeId); + RRP.classNodeObject[nodeId] = classNode; + RRP.classNodeObject[resourceClassRelationId].children.push(classNode); + + if (resourceClassRelationId == 0) { + RRP.classNodeObjectForAtomModel[atomModelId].push(classNode); + } + + ctx.body = { + message: '创建资源类成功', + data: { + resourceClassBase: newClassData, + resourceClassRelation: newClassRelationData, + }, + }; +}); + +// @ 编辑资源类 +resourceClass.post('/editResourceClassItem', async (ctx, next) => { + const verif = EditResourceClassItemDTO(ctx.request.body); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + const { + resourceClassBaseName, + resourceClassBaseDescribe, + resourceClassBaseIdentify, + resourceClassBaseId, + resourceClassBaseAvatar, + resourceClassBaseDefine, + resourceClassBaseColor, + resourceClassBaseType, + } = ctx.request.body; + const RRP = resourceCache.resourcePool; + let oldName, oldIdentify, atomModelId; + // @ 判断ID是否存在 + if (!RRP.classIdList.includes(resourceClassBaseId)) { + return ctx.throw(400, { e: '资源类不存在' }); + } else { + oldName = RRP.classObject[resourceClassBaseId].resourceClassBaseId; + oldIdentify = + RRP.classObject[resourceClassBaseId].resourceClassBaseIdentify; + atomModelId = RRP.classObject[resourceClassBaseId].atomModel; + } + // @ 判断名称是否重复 + if ( + RRP.classListForAtomModel[atomModelId].some( + (i) => + i.resourceClassBaseName == + getNoSpacesStr(resourceClassBaseName) && + i.resourceClassBaseId != resourceClassBaseId, + ) + ) { + return ctx.throw(400, { e: '资源类重名' }); + } + // @ 判断标识是否重复 + if ( + RRP.classList.some( + (i) => + i.resourceClassBaseIdentify == + getNoSpacesStr(resourceClassBaseIdentify).toUpperCase() && + i.resourceClassBaseId != resourceClassBaseId, + ) + ) { + return ctx.throw(400, { e: '资源类标识已存在' }); + } + // 修改信息 + RRP.classObject[resourceClassBaseId].resourceClassBaseName = getNoSpacesStr( + resourceClassBaseName, + ); + RRP.classObject[resourceClassBaseId].resourceClassBaseDescribe = + resourceClassBaseDescribe; + RRP.classObject[resourceClassBaseId].resourceClassBaseIdentify = + getNoSpacesStr(resourceClassBaseIdentify).toUpperCase(); + RRP.classObject[resourceClassBaseId].resourceClassBaseId = + resourceClassBaseId; + RRP.classObject[resourceClassBaseId].resourceClassBaseAvatar = + resourceClassBaseAvatar; + RRP.classObject[resourceClassBaseId].resourceClassBaseDefine = + resourceClassBaseDefine; + RRP.classObject[resourceClassBaseId].resourceClassBaseColor = + resourceClassBaseColor; + RRP.classObject[resourceClassBaseId].resourceClassBaseType = + resourceClassBaseType; + + // @ 是否修改标识 + if ( + oldIdentify != getNoSpacesStr(resourceClassBaseIdentify).toUpperCase() + ) { + // 需要更改表明 + // ! 删除模型 + delete ctx.sequelize.models[oldIdentify.toLowerCase()]; + // ! 修改表名 + const results = await ctx.sequelize.queryInterface.renameTable( + 'entity_' + oldIdentify.toLowerCase(), + 'entity_' + getNoSpacesStr(resourceClassBaseIdentify).toLowerCase(), + ); + // ! 启动新模型 + await RRP.classModelObject[resourceClassBaseId].createSequelizeModel(); + // | 更新资源实体ID + } + ctx.body = { + message: '修改资源类信息成功', + }; + await next(); + await ctx.sequelize.models.ResourceClassBase.update( + { + resourceClassBaseName: getNoSpacesStr(resourceClassBaseName), + resourceClassBaseDescribe: resourceClassBaseDescribe, + resourceClassBaseIdentify: getNoSpacesStr( + resourceClassBaseIdentify, + ).toUpperCase(), + resourceClassBaseId: resourceClassBaseId, + resourceClassBaseAvatar: resourceClassBaseAvatar, + resourceClassBaseDefine: resourceClassBaseDefine, + resourceClassBaseColor: resourceClassBaseColor, + resourceClassBaseType: resourceClassBaseType, + }, + { + where: { + resourceClassBaseId, + }, + }, + ); +}); + +// @ 删除资源类 +resourceClass.delete('/deleteResourceClassItem', async (ctx, next) => { + const verif = DeleteResourceClassItemDTO(ctx.query); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + const nodeId = ctx.query.nodeId; + // 判断是否存在节点 + const RRP = resourceCache.resourcePool; + const findNodeId = binarySearch(RRP.classRelationIdList, nodeId); + if (findNodeId == -1) { + return ctx.throw(400, { e: '不存在此资源类节点ID' }); + } + const classNodeObject = RRP.classNodeObject[nodeId]; + if (classNodeObject.children.length != 0) { + return ctx.throw(400, { + e: '该资源类节点下存在子节点,无法删除,请先删除子节点。', + }); + } + const classId = classNodeObject.classId; + const fatherId = classNodeObject.fatherId; + const atomModel = classNodeObject.atomModel; + const classIdentify = classNodeObject.classIdentify; + + let entityListB, expandListB; + + // @ 删掉关联列表 + RRP.classRelationList.splice(findNodeId, 1); + // @ 删掉关联ID列表 + RRP.classRelationIdList.splice(findNodeId, 1); + // @ 删掉关联ID对象集合 + delete RRP.classRelationObject[nodeId]; + // @ 删除资源类的关联对象中的当前节点 + const relationList = RRP.classRelationObjectForTargetClass[classId]; + relationList.splice( + binarySearch(relationList, nodeId, 'resourceClassRelationId'), + 1, + ); + + // @ 删除父节点下的children的此节点 + RRP.classNodeObject[fatherId].children.splice( + binarySearch(RRP.classNodeObject[fatherId].children, nodeId, 'nodeId'), + 1, + ); + // @ 删除节点列表上的此节点 + delete RRP.classNodeObject[nodeId]; + // 删除原分类下的根节点 + if (fatherId == 0) { + RRP.classNodeObjectForAtomModel[atomModel].splice( + binarySearch( + RRP.classNodeObjectForAtomModel[atomModel], + nodeId, + 'nodeId', + ), + 1, + ); + } + if (classNodeObject.classRelationIdList.length == 0) { + // 最后一个节点了,删掉的话就删掉了资源类 + // @ 删掉资源类的关联列表 + delete RRP.classRelationObjectForTargetClass[classId]; + // @ 删资源类 + const classIdIndex = binarySearch(RRP.classIdList, classId); + RRP.classList.splice(classIdIndex, 1); + RRP.classIdList.splice(classIdIndex, 1); + delete RRP.classObject[classId]; + RRP.classListForAtomModel[atomModel].splice( + binarySearch( + RRP.classListForAtomModel[atomModel], + classId, + 'resourceClassBaseId', + ), + ); + // @ 删资源类拓展字段 + if ( + Object.keys(RRP.classExpandForClassBaseObject).includes( + classId.toString(), + ) + ) { + const expandList = RRP.classExpandForClassBaseObject[classId]; + const expandIdList = Object.keys(expandList).map((i) => { + delete RRP.classExpandObject[ + expandList[i].resourceClassExpandFieldId + ]; + return expandList[i].resourceClassExpandFieldId; + }); + expandListB = expandIdList; + delete RRP.classExpandForClassBaseObject[classId]; + const expandIdIndexList = binarySearchMore( + RRP.classExpandList, + expandIdList, + 'resourceClassExpandFieldId', + 0, + RRP.classExpandList.length, + ).sort((a, b) => b - a); + for (let i of expandIdIndexList) { + RRP.classExpandList.splice(i, 1); + RRP.classExpandIdList.splice(i, 1); + } + } + + // @ 删除资源实体字段 + if ( + Object.keys(RRP.entityStructForClassBaseObject).includes( + classId.toString(), + ) + ) { + const entityNameObject = + RRP.entityStructForClassBaseObject[classId]; + const entityIdList = Object.keys(entityNameObject).map((i) => { + delete RRP.entityStructObject[ + entityNameObject[i].resourceEntityStructId + ]; + return entityNameObject[i].resourceEntityStructId; + }); + entityListB = entityIdList; + delete RRP.entityStructForClassBaseObject[classId]; + const entityIndexList = binarySearchMore( + RRP.entityStructList, + entityIdList, + 'resourceEntityStructId', + 0, + RRP.entityStructList.length, + ).sort((a, b) => b - a); + for (let i of entityIndexList) { + RRP.entityStructList.splice(i, 1); + RRP.entityStructIdList.splice(i, 1); + } + } + // ! @ 删资源对象 + // @ 删除表 + const data = await ctx.sequelize.query( + 'DROP TABLE IF EXISTS ' + 'entity_' + classIdentify.toLowerCase(), + ); + // 删除资源对象缓存 + } + ctx.body = { + message: '删除资源类节点成功。', + }; + // 删除关联 + ctx.sequelize.models.ResourceClassRelation.update( + { + isDelete: new Date().toISOString(), + }, + { + where: { + resourceClassRelationId: nodeId, + }, + }, + ); + + if (classNodeObject.classRelationIdList.length == 0) { + // 删除资源类 + ctx.sequelize.models.ResourceClassBase.update( + { + isDelete: new Date().toISOString(), + }, + { + where: { + resourceClassBaseId: classId, + }, + }, + ); + // 删除拓展字段 + if (expandListB) { + ctx.sequelize.models.ResourceClassExpandField.update( + { + isDelete: new Date().toISOString(), + }, + { + where: { + resourceClassExpandFieldId: { + [Op.in]: expandListB, + }, + }, + }, + ); + } + + // 删除实体字段 + if (entityListB) { + ctx.sequelize.models.ResourceEntityStruct.update( + { + isDelete: new Date().toISOString(), + }, + { + where: { + resourceEntityStructId: { + [Op.in]: entityListB, + }, + }, + }, + ); + } + } +}); + +// @ 创建资源类关联 +resourceClass.post('/createResourceClassRelation', async (ctx, next) => { + const verif = CreateResourceClassRelationDTO(ctx.request.body); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + ctx.body = 7; +}); + +// @ 删除资源类关联 +resourceClass.delete('/deleteResourceClassRelation', async (ctx, next) => { + const verif = DeleteResourceClassRelationDTO(ctx.query); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + const RRP = resourceCache.resourcePool; + ctx.body = 8; +}); + +// @ 获取资源类完整信息 +resourceClass.get('/getResourceClassCompleteInfo', async (ctx, next) => { + const verif = GetResourceClassCompleteInfoDTO(ctx.query); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + const { resourceClassBaseId, resourceClassBaseIdentify } = ctx.query; + const RRP = resourceCache.resourcePool; + let classId; + if (resourceClassBaseIdentify) { + RRP.classIdList.find((i) => { + if ( + RRP.classModelObject[i].classIdentify == + getNoSpacesStr(resourceClassBaseIdentify).toUpperCase() + ) { + classId = RRP.classModelObject[i].classId; + } + }); + if (!classId) { + return ctx.throw(400, { e: '未找到该资源类' }); + } + } + if (resourceClassBaseId) { + if (RRP.classIdList.includes(resourceClassBaseId)) { + classId = resourceClassBaseId; + } else { + return ctx.throw(400, { e: '未找到该资源类' }); + } + } + ctx.body = RRP.classModelObject[classId].info; +}); + +// @ 创建资源类拓展字段 +resourceClass.post('/createResourceClassExpandFieldItem', async (ctx, next) => { + const verif = CreateResourceClassExpandFieldItemDTO(ctx.request.body); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + ctx.body = 10; +}); + +// @ 编辑资源类拓展字段 +resourceClass.post('/editResourceClassExpandFieldItem', async (ctx, next) => { + const verif = EditResourceClassExpandFieldItemDTO(ctx.request.body); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + ctx.body = 11; +}); + +// @ 删除资源类拓展字段 +resourceClass.delete( + '/deleteResourceClassExpandFieldItem', + async (ctx, next) => { + const verif = DeleteResourceClassExpandFieldItemDTO(ctx.query); + if (!verif.status) { + return ctx.throw(400, { e: verif.error.map((i) => i.message) }); + } + ctx.body = 12; + }, +); + +export default resourceClass; diff --git a/13=graphResource2/src/routes/index.dto.js b/13=graphResource2/src/routes/index.dto.js new file mode 100644 index 0000000..7cc85b9 --- /dev/null +++ b/13=graphResource2/src/routes/index.dto.js @@ -0,0 +1,28 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.dto.js - +// | @创建时间: 2023-11-26 15:10 +// | @更新时间: 2023-11-26 15:10 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import makeDTO from "#common/dto/index.js"; + +export default function testDTO(data){ + const schema = { + "type": "object", + "properties": { + "name": { "type": "string" }, + "age": { "type": "number" }, + "email": { "type": "string", + "pattern": "^\\S+@\\S+\\.\\S+$" } + }, + "required": ["name", "age"] + } + return makeDTO(data, schema) +} diff --git a/13=graphResource2/src/routes/index.js b/13=graphResource2/src/routes/index.js new file mode 100644 index 0000000..6c015a2 --- /dev/null +++ b/13=graphResource2/src/routes/index.js @@ -0,0 +1,41 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.js - +// | @创建时间: 2023-11-26 01:34 +// | @更新时间: 2023-11-26 01:34 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Router from 'koa-router'; + +import graphResource2 from "#routes/graphResource2/index.js"; +import testDTO from '#routes/index.dto.js'; + +// const rootRouter = new Router({ +// prefix: '/api', // 添加前缀 +// }); + +// const apiRouter = new Router(); +// apiRouter.get('/', async (ctx) => { +// ctx.body = 'Hello /API!'; +// }); +// apiRouter.use('/user', userRouter.routes()); + +const rootRouter = new Router(); +rootRouter.get('/', async (ctx) => { + const data = testDTO({ + name: 'hexi', + age: 32, + email: 'expressgy', + }); + console.log(data); + ctx.body = 'Hello World!'; +}); +rootRouter.use('/graphResource2', graphResource2.routes()); + +export default rootRouter; diff --git a/13=graphResource2/test/ajvTest.js b/13=graphResource2/test/ajvTest.js new file mode 100644 index 0000000..ebcc887 --- /dev/null +++ b/13=graphResource2/test/ajvTest.js @@ -0,0 +1,82 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: ajvTest.js - +// | @创建时间: 2023-11-25 21:59 +// | @更新时间: 2023-11-25 21:59 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +const Ajv = require('ajv'); +const ajv = new Ajv({ allErrors: true }); + +const schema = { + type: 'object', + properties: { + name: { type: 'string' }, + age: { type: 'integer', minimum: 18 }, + }, + required: ['name', 'age'], + errorMessage: { + type: '数据应该是一个对象', // 整体 schema 错误消息 + required: '对象缺少必要属性', // 缺少必要属性错误消息 + properties: { + name: '姓名应该是一个字符串', + age: '年龄应该是一个大于或等于 18 的整数', + }, + }, +}; + +const validate = ajv.compile(schema); + +const data = { + name: 123, + age: 17, +}; + +validate(data); +if (validate.errors) { + console.log(validate.errors); // 输出自定义错误消息 +} + +// ================================ + +const Ajv = require('ajv'); +const ajv = new Ajv({ allErrors: true }); + +// 添加自定义关键字 +ajv.addKeyword('isOldEnough', { + validate: function (schema, data) { + ajv.errors = [ + { + keyword: 'isOldEnough', + message: '年龄必须大于18岁', + params: { keyword: 'isOldEnough' }, + }, + ]; + return data >= 18; + }, + errors: true, // 使用自定义的错误列表 +}); + +const schema = { + type: 'object', + properties: { + age: { type: 'integer', isOldEnough: true }, + }, + required: ['age'], +}; + +const validate = ajv.compile(schema); + +const data = { + age: 17, +}; + +validate(data); +if (validate.errors) { + console.log(validate.errors); // 输出自定义错误消息 +} diff --git a/13=graphResource2/test/koa-body使用.md b/13=graphResource2/test/koa-body使用.md new file mode 100644 index 0000000..ce2162f --- /dev/null +++ b/13=graphResource2/test/koa-body使用.md @@ -0,0 +1,286 @@ +`koa-body` 是一个流行的 Koa 请求体解析中间件,支持解析常见的请求体数据类型,包括 JSON 数据、表单数据,以及文件上传。下面是 `koa-body` 的详细配置和使用方式: + +## 安装 + +使用 npm 安装 `koa-body` 中间件: + +``` +npm install koa-body --save +``` + +## 使用 + +要使用 `koa-body` 中间件,只需要在 Koa 应用程序中使用 `app.use` 方法将其注册,然后可以在请求处理程序和中间件中使用 `ctx.request.body` 来访问已解析的请求体数据。 + +以下是一个使用 `koa-body` 中间件的示例: + +```javascript +const Koa = require('koa'); +const koaBody = require('koa-body'); + +const app = new Koa(); + +// 将 koaBody 中间件注册到应用程序中 +app.use( + koaBody({ + multipart: true, + formidable: { + maxFileSize: 100 * 1024 * 1024, + }, + }) +); + +// 处理请求 +app.use((ctx) => { + // 访问已解析的请求体数据 + console.log(ctx.request.body); + ctx.body = 'Hello Koa'; +}); + +// 启动应用程序 +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上面的示例中,我们将 `koa-body` 中间件注册到应用程序中,并通过参数对象配置解析器。其中,`multipart` 选项是用于启用文件上传支持的选项,`formidable` 对象包括有关文件上传的配置选项,例如 `maxFileSize`,用于限制文件的大小。 + +在请求处理程序中,我们可以使用 `ctx.request.body` 访问已解析的请求体数据。 + +## 配置选项 + +下面是 `koa-body` 可用的配置选项及其默认值: + +- `form`:是否解析 `application/x-www-form-urlencoded` 格式的请求体数据,默认为 `true` +- `json`:是否解析 `application/json` 格式的请求体数据,默认为 `true` +- `text`:是否解析 `text/*` 格式的请求体数据,默认为 `true` +- `encoding`:请求体的编码方式,默认为 `'utf-8'` +- `xml`:是否解析 `application/xml` 和 `text/xml` 格式的请求体数据,默认为 `false` +- `jsonLimit`:限制解析 `application/json` 格式请求体数据的大小(以字节为单位),默认为 `1mb` +- `formLimit`:限制解析 `application/x-www-form-urlencoded` 格式的请求体数据大小(以字节为单位),默认为 `56kb` +- `textLimit`:限制解析 `text/*` 格式的请求体数据大小(以字节为单位),默认为 `56kb` +- `xmlLimit`:限制解析 `application/xml` 和 `text/xml` 格式的请求体数据大小(以字节为单位),默认为 `1mb` +- `multipart`:是否解析 `multipart/*` 格式的请求体数据(用于文件上传),默认为 `false` +- `multiples`:是否解析多个文件上传,默认为 `false` +- `onError`:错误处理程序,用于处理请求体解析错误,默认为 `ctx.throw` +- `includeUnparsed`:是否将未解析的请求体数据存储在 `ctx.request.body` 中,默认为 `false` +- `textLimit`:限制解析 `text/*` 格式的请求体数据大小(以字节为单位),默认为 `56kb` + +## 示例 + +### 解析表单数据和 JSON 数据 + +以下示例演示如何将 `koa-body` 中间件配置为仅解析表单数据和 JSON 数据: + +```javascript +const Koa = require('koa'); +const koaBody = require('koa-body'); + +const app = new Koa(); + +// 仅解析表单数据和 JSON 数据 +app.use(koaBody({ form: true, json: true })); + +app.use((ctx) => { + console.log(ctx.request.body); + ctx.body = 'Hello Koa'; +}); + +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上面的示例中,我们将 `koa-body` 中间件配置为仅解析表单数据和 JSON 数据。我们可以在请求处理程序中使用 `ctx.request.body` 访问已解析的请求体数据。 + +### 解析文件上传 + +以下示例演示如何使用 `koa-body` 中间件解析文件上传: + +```javascript +const Koa = require('koa'); +const koaBody = require('koa-body'); + +const app = new Koa(); + +// 启用文件上传支持 +app.use( + koaBody({ + multipart: true, + formidable: { + maxFileSize: 100 * 1024 * 1024, + }, + }) +); + +app.use((ctx) => { + // 文件上传信息存储在 ctx.request.files 中 + console.log(ctx.request.files); + ctx.body = 'Hello Koa'; +}); + +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上面的示例中,我们将 `koa-body` 中间件配置为启用文件上传支持,并使用 `formidable` 对象配置文件上传选项。在请求处理程序中,我们可以使用 `ctx.request.files` 访问文件上传信息。 + +### 错误处理 + +`koa-body` 中间件的默认错误处理程序是 `ctx.throw`,它会抛出一个 HTTP 400 错误响应。你可以自定义一个错误处理程序来处理请求体解析错误。 + +以下示例演示如何自定义错误处理程序: + +```javascript +const Koa = require('koa'); +const koaBody = require('koa-body'); + +const app = new Koa(); + +app.use( + koaBody({ + onError: (err, ctx) => { + ctx.throw('Body parse error', 422); + }, + }) +); + +app.use((ctx) => { + console.log(ctx.request.body); + ctx.body = 'Hello Koa'; +}); + +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上面的示例中,我们自定义了一个错误处理程序,当发生请求体解析错误时,它会抛出一个 HTTP 422 错误响应。 + +## 总结 + +`koa-body` 是一个流行的 Koa 请求体解析中间件,它支持解析常见的请求体数据类型,包括 JSON 数据、表单数据,以及文件上传。你可以通过配置选项来自定义解析器的行为,并使用 `ctx.request.body` 和 `ctx.request.files` 在请求处理程序中访问已解析的请求体数据和上传的文件信息。同时,你也可以自定义错误处理程序来处理请求体解析错误。 + + + + + + + + + + + + + + +一、需求 +之前使用 koa2 的时候,处理 post 请求使用的是 koa-bodyparser,同时如果是图片上传使用的是 koa-multer。 + +这两者的组合没什么问题,不过 koa-multer 和 koa-route(注意不是 koa-router) 存在不兼容的问题。 + +这个问题已经在这篇文章中说明了: + +使用koa-multer实现文件上传并自定义文件名和目录 +关于 koa-bodyparser 的使用,见下面文章: + +手动实现koa2 body-parser中间件及koa-boayparser的使用 +但是这两者可以通过 koa-body 代替,并且只是用 koa-body 即可。 + +koa-body 主要是下面两个依赖: + +"co-body": "^5.1.1", +"formidable": "^1.1.1" +具体的实现可以在 github 上查看 : https://github.com/dlau/koa-body + +二、koa-body 的基本使用 +在 koa2 中使用 koa-body,我使用的是全局引入,而不是路由级别的引入,因为考虑到很多地方都有 post 请求或者是文件上传请求,没必要只在路由级别引入。 + +1、安装依赖 +yarn add koa-body +## npm i koa-body -S +2、app.js +省略了 koa 的一些基本代码 + +const koaBody = require('koa-body'); +const app = new koa(); +app.use(koaBody({ +multipart:true, // 支持文件上传 +encoding:'gzip', +formidable:{ +uploadDir:path.join(__dirname,'public/upload/'), // 设置文件上传目录 +keepExtensions: true, // 保持文件的后缀 +maxFieldsSize:2 * 1024 * 1024, // 文件上传大小 +onFileBegin:(name,file) => { // 文件上传前的设置 +// console.log(`name: ${name}`); +// console.log(file); +}, +} +})); +3、有用的参数 +1)koa-body 的基本参数 + +参数名 描述 类型 默认值 +patchNode 将请求体打到原生 node.js 的ctx.req中 Boolean false +patchKoa 将请求体打到 koa 的 ctx.request 中 Boolean true +jsonLimit JSON 数据体的大小限制 String / Integer 1mb +formLimit 限制表单请求体的大小 String / Integer 56kb +textLimit 限制 text body 的大小 String / Integer 56kb +encoding 表单的默认编码 String utf-8 +multipart 是否支持 multipart-formdate 的表单 Boolean false +urlencoded 是否支持 urlencoded 的表单 Boolean true +text 是否解析 text/plain 的表单 Boolean true +json 是否解析 json 请求体 Boolean true +jsonStrict 是否使用 json 严格模式,true 会只处理数组和对象 Boolean true +formidable 配置更多的关于 multipart 的选项 Object {} +onError 错误处理 Function function(){} +stict 严格模式,启用后不会解析 GET, HEAD, DELETE 请求 Boolean true +2)formidable 的相关配置参数 + +参数名 描述 类型 默认值 +maxFields 限制字段的数量 Integer 1000 +maxFieldsSize 限制字段的最大大小 Integer 2 * 1024 * 1024 +uploadDir 文件上传的文件夹 String os.tmpDir() +keepExtensions 保留原来的文件后缀 Boolean false +hash 如果要计算文件的 hash,则可以选择 md5/sha1 String false +multipart 是否支持多文件上传 Boolean true +onFileBegin 文件上传前的一些设置操作 Function function(name,file){} +关于 onFileBegin 的更多信息可以查看: + +https://github.com/felixge/node-formidable#filebegin +4、获取文件上传后的信息 +这些代码是在路由中体现的 + +需要注意的是,如果是获取上传后文件的信息,则需要在 ctx.request.files 中获取。 + +如果是获取其他的表单字段,则需要在 ctx.request.body 中获取,这是由 co-body 决定的(默认情况)。 + +router.get('/', async (ctx) => { +await ctx.render('index'); +}); + +router.post('/',async (ctx)=>{ +console.log(ctx.request.files); +console.log(ctx.request.body); +ctx.body = JSON.stringify(ctx.request.files); +}); +三、结果 + + +因为默认开启多个文件上传,因此 ctx.request.files 是一个对象, + +而且是通过表单的 name=photo 属性作为对象的 key,值便是一个 File 对象,有用的字段如下: + +字段名 描述 +size 文件大小 +path 文件上传后的目录 +name 文件的原始名称 +type 文件类型 +lastModifiedDate 上次更新的时间 + + +http://www.ptbird.cn/koa-body.html +———————————————— +版权声明:本文为CSDN博主「after you」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 +原文链接:https://blog.csdn.net/gwdgwd123/article/details/103561817 diff --git a/13=graphResource2/test/koa-compress说明.md b/13=graphResource2/test/koa-compress说明.md new file mode 100644 index 0000000..4e23269 --- /dev/null +++ b/13=graphResource2/test/koa-compress说明.md @@ -0,0 +1,104 @@ + + +koa-compress 是一个 Koa 中间件,用于压缩 HTTP 响应。使用该中间件可减少 HTTP 响应的大小,从而提升应用程序的性能。 + +下面是使用 koa-compress 的简单示例: + +```javascript +const Koa = require('koa'); +const compress = require('koa-compress'); + +const app = new Koa(); + +// 注册中间件 +app.use(compress()); + +// 定义路由 +app.use(async (ctx) => { + ctx.body = 'Hello, world!'; +}); + +app.listen(3000, () => { + console.log('Server started on 3000'); +}); +``` + +在上面的示例中,我们首先通过 `require` 引入了 Koa 和 koa-compress,然后创建了一个 Koa 应用程序实例。 + +在注册中间件时,我们使用了 `compress()` 函数来创建 koa-compress 中间件的实例,并将其添加到应用程序中间件栈中。 + +最后,我们定义了一个非常简单的路由,在该路由中,我们设置了响应的正文内容为 "Hello, world!"。由于我们已经注册了 koa-compress 中间件,因此响应的内容将被压缩后返回给客户端。 + +需要注意的是,koa-compress 的默认配置已经适用于大多数情况。如果需要对其进行个性化配置,请参阅 koa-compress 的文档。 + + +虽然 koa-compress 是一个非常有用的中间件,但它也有一些缺点,包括: + +1. CPU 开销:压缩和解压缩数据需要消耗一定的 CPU 资源。对于大量并发请求的应用程序,尤其是在处理大型响应时,这可能会占用大量的 CPU 时间,并可能成为性能瓶颈。 + +2. 内存消耗:压缩和解压缩数据可能会占用一定的内存。对于包含大量压缩数据的响应,这可能会导致应用程序的内存占用增加。 + +3. 配置复杂性:虽然 koa-compress 的默认配置适用于大多数情况,但某些情况下可能需要进行个性化的配置。配置复杂性可能会增加,特别是在需要针对不同的响应类型或路径进行不同的压缩设置时。 + +4. 不适用于动态内容:由于压缩是在响应生成后进行的,因此对于动态内容(如实时数据或流式响应)无法实时压缩。这可能会导致传输过程中的数据量较大,影响网络传输速度。 + +总体来说,koa-compress 是一个功能强大的中间件,可以提高应用程序的性能和网络传输效率。然而,在使用它时,需要权衡使用压缩所带来的性能消耗和配置复杂性,以确保最佳的应用程序性能和用户体验。 + +koa-compress 提供了一系列的配置选项,可以根据需要进行个性化的配置。下面是常用的一些选项: + +- `filter`:指定哪些 HTTP 响应需要被压缩。可以是一个布尔值、字符串、正则表达式或一个自定义函数。默认为压缩所有响应。 + +- `threshold`:指定响应正文的大小下限,只有当响应正文大小超过指定值时才会进行压缩。默认为 `1024` 字节。 + +- `gzip`:指定是否启用 Gzip 压缩。默认为 `true`。 + +- `deflate`:指定是否启用 Deflate 压缩。默认为 `true`。 + +- `br`:指定是否启用 Brotli 压缩。默认为 `false`。 + +- `chunkSize`:指定压缩块的大小。默认为 `16 * 1024` 字节。 + +- `mimeTypes`:指定要压缩的 MIME 类型。默认为 `['text/*']`。 + +- `enableTypes`:指定要启用压缩的 MIME 类型。默认为所有 MIME 类型。 + +- `skip`:指定一个自定义函数,以跳过指定的请求或响应。默认为 `null`。 + +下面是一个配置示例: + +```javascript +const Koa = require('koa'); +const compress = require('koa-compress'); + +const app = new Koa(); + +// 注册中间件并进行个性化配置 +app.use(compress({ + filter (content_type) { + return /text/i.test(content_type) + }, + threshold: 1024, + gzip: true, + deflate: false, + br: false, + chunkSize: 16 * 1024, + mimeTypes: ['text/plain', 'application/json'], + enableTypes: ['text/plain', 'application/json'], + skip (ctx) { + return ctx.path === '/healthcheck'; + } +})); + +// 定义路由 +app.use(async (ctx) => { + ctx.body = 'Hello, world!'; +}); + +app.listen(3000, () => { + console.log('Server started on 3000'); +}); +``` + +在上面的示例中,我们使用了一些常见的配置选项。我们指定了只对文本类型的响应进行压缩,并且启用了 Gzip 压缩。我们还指定了要启用的 MIME 类型和要跳过的路径,以及其他一些选项。 + +需要注意的是,配置选项可以根据需要进行个性化的调整。可以根据实际情况进行选择。在使用 koa-compress 时,确保在经过测试和评估后再进行个性化的配置。 diff --git a/13=graphResource2/test/koa-ratelimit限制批量请求工具的应用.md b/13=graphResource2/test/koa-ratelimit限制批量请求工具的应用.md new file mode 100644 index 0000000..8f682ce --- /dev/null +++ b/13=graphResource2/test/koa-ratelimit限制批量请求工具的应用.md @@ -0,0 +1,33 @@ +要限制同一个客户端的请求数量,可以使用 `koa-ratelimit` 插件。该插件可以按照一定的速率限制客户端的请求数量。以下是使用 `koa-ratelimit` 的示例代码: + +```javascript +const Koa = require('koa'); +const ratelimit = require('koa-ratelimit'); + +const app = new Koa(); + +app.use(ratelimit({ + driver: 'memory', // 存储限流数据的驱动,这里使用内存驱动 + db: new Map(), // 存储被限制的客户端信息的数据结构 + duration: 60000, // 时间窗口,单位毫秒 + max: 10, // 时间窗口内允许的最大请求数量 + id: ctx => ctx.ip, // 提取每个请求的唯一标识符,默认使用请求的 IP 地址 +})); + +// 添加其他中间件和路由 + +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上述代码中,我们使用 `koa-ratelimit` 插件来限制同一个客户端的请求数量。插件配置中的关键参数如下: +- `driver`:存储限流数据的驱动,可以选择内存 (`memory`)、Redis (`redis`)、MongoDB (`mongodb`) 等。在示例中我们使用内存驱动。 +- `db`:存储被限制的客户端信息的数据结构,这里我们使用 `Map`。 +- `duration`:时间窗口的持续时间,单位为毫秒。 +- `max`:时间窗口内允许的最大请求数量。 +- `id`:提取每个请求的唯一标识符,默认使用请求的 IP 地址。 + +当某个客户端超过设定的最大请求数量时,该插件会返回 HTTP 状态码 429 Too Many Requests,并且设置 `Retry-After` 头部,表示重新尝试请求的时间。 + +通过使用 `koa-ratelimit` 插件,可以有效地限制同一个客户端的请求数量,从而保护服务器免受过多的请求负载。同时,你也可以根据实际需求调整时间窗口和最大请求数量的配置。 diff --git a/13=graphResource2/test/koa-send方法.md b/13=graphResource2/test/koa-send方法.md new file mode 100644 index 0000000..29bca8d --- /dev/null +++ b/13=graphResource2/test/koa-send方法.md @@ -0,0 +1,46 @@ +`koa-send` 是一个 Koa 中间件,用于发送文件或目录响应给客户端。它提供了一种简单的方式来处理静态文件的发送。下面是一个使用示例: + +```javascript +const Koa = require('koa'); +const send = require('koa-send'); +const app = new Koa(); + +app.use(async (ctx, next) => { + // 使用 koa-send 发送文件 + await send(ctx, 'path/to/file.txt'); +}); + +app.listen(3000, () => { + console.log('Server started on 3000'); +}); +``` + +在上面的示例中,`koa-send` 中间件用于处理所有的请求,并将文件 `path/to/file.txt` 发送给客户端。 + +除了发送单个文件外,你还可以发送整个目录: + +```javascript +app.use(async (ctx, next) => { + // 使用 koa-send 发送目录 + await send(ctx, 'path/to/directory'); +}); +``` + +这将发送指定目录下的文件,可以在请求的 URL 中指定特定的文件。 + +`koa-send` 还提供了一些选项,用于设置发送文件时的行为。例如,你可以指定根目录、设置缓存控制头、设置内容类型等。以下是一个使用选项的示例: + +```javascript +app.use(async (ctx, next) => { + await send(ctx, 'path/to/file.txt', { + root: 'public', // 设置根目录 + maxage: 1 * 24 * 60 * 60 * 1000, // 设置缓存时间 + immutable: true, // 设置不可变性(immutable) + contentType: 'text/plain' // 设置内容类型 + }); +}); +``` + +在上面的示例中,我们将根目录设置为 `public`,将缓存时间设置为 1 天,启用不可变性,并设置内容类型为 `text/plain`。 + +通过这些选项,你可以对发送的文件进行更细致的控制。更多的选项和详细的使用方式可以查看 `koa-send` 的文档。 diff --git a/13=graphResource2/test/koa修改code.md b/13=graphResource2/test/koa修改code.md new file mode 100644 index 0000000..9257db2 --- /dev/null +++ b/13=graphResource2/test/koa修改code.md @@ -0,0 +1,39 @@ +要在 Koa 中修改 HTTP 响应的状态码(code),可以简单地通过 ctx.status 属性进行修改。例如,将响应状态码修改为 404: + +```js +app.use(async (ctx, next) => { + ctx.status = 404; + // 继续执行后续中间件,并在之后对响应进行修改 + await next(); +}); +``` + +在上述代码中,我们将响应状态码设置为 404,并在之后继续执行后续中间件。这意味着你可以在后续中间件中进一步修改响应内容,比如设置响应体、设置 headers 等。 + +如果你想要在响应发送之前中止中间件的执行,可以通过 ctx.throw 方法或在抛出一个 Error 对象,同时设置其 status 或者 statusCode 属性: + +```js +app.use(async (ctx, next) => { + if (someCondition) { + ctx.throw(400, 'Bad Request'); + } else { + await next(); + } +}); +``` + +或者: + +```js +app.use(async (ctx, next) => { + if (someCondition) { + const err = new Error('Bad Request'); + err.status = 400; + throw err; + } else { + await next(); + } +}); +``` + +在上述代码中,当 someCondition 符合时,我们通过 ctx.throw 或抛出 Error 对象来中止中间件执行,并将响应状态码设置为 400。 diff --git a/13=graphResource2/test/makeClass.js b/13=graphResource2/test/makeClass.js new file mode 100644 index 0000000..22becfd --- /dev/null +++ b/13=graphResource2/test/makeClass.js @@ -0,0 +1,131 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: makeClass.js - +// | @创建时间: 2023-12-03 16:41 +// | @更新时间: 2023-12-03 16:41 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + + +const obj = { + id: 1, + name: '何希', + age: 25 +} + +const f1 = { + id: 2, + name: '何希的妈妈', + age: 45 +} + +const f2 = { + id: 3, + name: '何希的爸爸', + age: 45 +} + +class resourceClass{ + baseInfo; + expandInfo; + fatherObject = {} + constructor(baseInfo, expandInfo = {}) { + this.baseInfo = baseInfo; + this.expandInfo = expandInfo + } + addFather(obj){ + this.fatherObject[obj.id] = obj + } + delFather(obj){ + delete this.fatherObject[obj.id] + } + get baseInfo(){ + return this.baseInfo + } + get expandInfo(){ + return this.expandInfo + } + get fatherId(){ + return Object.keys(this.fatherObject) + } + get fatherObj(){ + return this.fatherObj + } + get fatherList(){ + return Object.keys(this.fatherObj).map(i => this.fatherObject[i]) + } +} + +function makeClass(obj1, obj2 = {}){ + return new resourceClass(obj1, obj2) +} + + + +const R1 = makeClass(obj); +const R2 = makeClass(obj); + +obj.age++ + +console.log(R1.baseInfo) +console.log(R1) +console.log(R2.baseInfo) + + + +const resourceCache = { + // 基础数据库信息 + baseData:{ + // 基础资源类信息 + resourceClassList: [], + resourceClassObject:{}, + // 拓展资源类信息 + resourceClassExpandFieldList: [], + resourceClassExpandFieldObject: {}, + // 实体字段信息 + resourceEntityStructList: [], + resourceEntityStructObject: {}, + // 资源实体信息 + resourceEntityList: [], + resourceEntityObject: {}, + // 资源类关系信息 + resourceClassRelationList: [], + resourceClassRelationObject: {} + }, + // 合成资源信息,计算数据 + computedData:{ + // 资源类完整数据 - 继承于baseData-resourceClassObject + resourceClassObject: { + resourceClassId: { + // 基础资源类信息,查找字典值 + baseClassData: { + + }, + // 拓展资源类信息,查找字典值 + expandClassData:{ + + }, + // 资源实体结构转化为对象格式 + entityStructData:{ + + }, + // 资源类的父节点,及其关联下的子节点 + relationClass:{ + fatherId:['childId'] + } + } + } + }, + // 资源关联信息 + relationData:{} +} + +// 第一步加载数据库数据 + + + diff --git a/13=graphResource2/test/slice.js b/13=graphResource2/test/slice.js new file mode 100644 index 0000000..cc2749c --- /dev/null +++ b/13=graphResource2/test/slice.js @@ -0,0 +1,15 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: slice.js - +// | @创建时间: 2023-12-03 01:43 +// | @更新时间: 2023-12-03 01:43 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + + +console.log([1, 2, 3].slice(1)) diff --git a/13=graphResource2/test/testClassExtents.js b/13=graphResource2/test/testClassExtents.js new file mode 100644 index 0000000..633894e --- /dev/null +++ b/13=graphResource2/test/testClassExtents.js @@ -0,0 +1,36 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: testClassExtents.js - +// | @创建时间: 2023-12-03 17:58 +// | @更新时间: 2023-12-03 17:58 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +console.log('START') +console.time(1) +let list = [] + +const a1 = performance.now(); +for(let i = 0; i < 100000000; i ++){ + list.push({ + name: '何希', + age: 35, + love: 'GY', + key: parseInt(Math.random() * 100000000) + }) +} +console.log('A') +const a2 = performance.now(); +const data = list.filter(i => { + return (i.name + i.love + i.key).includes('GY21') +}) +const a3 = performance.now(); + +console.log('makeData', a2-a1) +console.log('filterData', a3-a2) +console.log(data.length) +console.timeEnd(1) diff --git a/13=graphResource2/test/压力/getClassTreeForAtomMOdel.js b/13=graphResource2/test/压力/getClassTreeForAtomMOdel.js new file mode 100644 index 0000000..72a62f4 --- /dev/null +++ b/13=graphResource2/test/压力/getClassTreeForAtomMOdel.js @@ -0,0 +1,39 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: getClassTreeForAtomMOdel.js - +// | @创建时间: 2023-12-06 21:23 +// | @更新时间: 2023-12-06 21:23 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import loadtest from 'loadtest' + +// 定义要测试的目标 URL +const url = 'http://localhost:3001' +// 定义 loadtest 的参数 +const options = { + url: url, + maxRequests: 50000, // 总请求数 + concurrency: 20 // 并发请求数 +}; + +loadtest.loadTest(options, function(error, result) { + if (error) { + console.error('压力测试失败:', error); + } else { + console.log('压力测试结果:'); + console.log('总请求数:', result.totalRequests); + console.log('请求失败数:', result.totalErrors); + console.log('总运行时间(秒):', result.totalTimeSeconds); + console.log('平均延迟时间(毫秒):', result.meanLatencyMs); + console.log('最小延迟时间(毫秒):', result.minLatencyMs); + console.log('最大延迟时间(毫秒):', result.maxLatencyMs); + // console.log('请求总字节数:', result.requestBytes); + // console.log('响应总字节数:', result.responseBytes); + console.log('每秒请求数:', result.rps); + } +}); diff --git a/14=vue3/.env b/14=vue3/.env new file mode 100644 index 0000000..0fcc3b6 --- /dev/null +++ b/14=vue3/.env @@ -0,0 +1 @@ +VITE_BASE_URL = "/GY" diff --git a/14=vue3/.eslintrc.cjs b/14=vue3/.eslintrc.cjs new file mode 100644 index 0000000..b64731a --- /dev/null +++ b/14=vue3/.eslintrc.cjs @@ -0,0 +1,14 @@ +/* eslint-env node */ +require('@rushstack/eslint-patch/modern-module-resolution') + +module.exports = { + root: true, + 'extends': [ + 'plugin:vue/vue3-essential', + 'eslint:recommended', + '@vue/eslint-config-prettier/skip-formatting' + ], + parserOptions: { + ecmaVersion: 'latest' + } +} diff --git a/14=vue3/.gitignore b/14=vue3/.gitignore new file mode 100644 index 0000000..8ee54e8 --- /dev/null +++ b/14=vue3/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/14=vue3/.prettierrc.json b/14=vue3/.prettierrc.json new file mode 100644 index 0000000..e40e633 --- /dev/null +++ b/14=vue3/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": false, + "tabWidth": 4, + "singleQuote": true, + "printWidth": 100, + "trailingComma": "none" +} diff --git a/14=vue3/README.md b/14=vue3/README.md new file mode 100644 index 0000000..83f125e --- /dev/null +++ b/14=vue3/README.md @@ -0,0 +1,10 @@ +# HotoKiss + +vue3的快乐学习 + +前端: + +1. 页面缓存 +2. pinia +3. 逻辑服用 +4. 路由 diff --git a/14=vue3/docs/学习vue3/vue3.assets/3b3bd03e11464112b94ed3afd66e7fbf.png b/14=vue3/docs/学习vue3/vue3.assets/3b3bd03e11464112b94ed3afd66e7fbf.png new file mode 100644 index 0000000..02820e6 Binary files /dev/null and b/14=vue3/docs/学习vue3/vue3.assets/3b3bd03e11464112b94ed3afd66e7fbf.png differ diff --git a/14=vue3/docs/学习vue3/vue3.assets/48618779e6cc4d9c82bacbc11a59dcae.png b/14=vue3/docs/学习vue3/vue3.assets/48618779e6cc4d9c82bacbc11a59dcae.png new file mode 100644 index 0000000..7cb7a7a Binary files /dev/null and b/14=vue3/docs/学习vue3/vue3.assets/48618779e6cc4d9c82bacbc11a59dcae.png differ diff --git a/14=vue3/docs/学习vue3/vue3.assets/8761f9becf244a3e93973c3a03858dc6.png b/14=vue3/docs/学习vue3/vue3.assets/8761f9becf244a3e93973c3a03858dc6.png new file mode 100644 index 0000000..f0d86ca Binary files /dev/null and b/14=vue3/docs/学习vue3/vue3.assets/8761f9becf244a3e93973c3a03858dc6.png differ diff --git a/14=vue3/docs/学习vue3/vue3.assets/c0eed55cafc0418c813d4a6e77ed2835.png b/14=vue3/docs/学习vue3/vue3.assets/c0eed55cafc0418c813d4a6e77ed2835.png new file mode 100644 index 0000000..0b43181 Binary files /dev/null and b/14=vue3/docs/学习vue3/vue3.assets/c0eed55cafc0418c813d4a6e77ed2835.png differ diff --git a/14=vue3/docs/学习vue3/vue3.assets/d791b0e7431b492b9d5dafe186d884b0.png b/14=vue3/docs/学习vue3/vue3.assets/d791b0e7431b492b9d5dafe186d884b0.png new file mode 100644 index 0000000..7cf6038 Binary files /dev/null and b/14=vue3/docs/学习vue3/vue3.assets/d791b0e7431b492b9d5dafe186d884b0.png differ diff --git a/14=vue3/docs/学习vue3/vue3.assets/ecdb8a0d231140ab8584b83992c41b62.png b/14=vue3/docs/学习vue3/vue3.assets/ecdb8a0d231140ab8584b83992c41b62.png new file mode 100644 index 0000000..4c90fe6 Binary files /dev/null and b/14=vue3/docs/学习vue3/vue3.assets/ecdb8a0d231140ab8584b83992c41b62.png differ diff --git a/14=vue3/docs/学习vue3/vue3.md b/14=vue3/docs/学习vue3/vue3.md new file mode 100644 index 0000000..668930b --- /dev/null +++ b/14=vue3/docs/学习vue3/vue3.md @@ -0,0 +1,910 @@ +# 基础 + +```bash +npm create vue@latest +``` + +## 创建应用 + +### 应用配置 + +> **确保在挂载应用实例之前完成所有应用配置!** + +- 应用级的错误处理器,用来捕获所有子组件上的错误 + +```javascript +app.config.errorHandler = (err) => { + /* 处理错误 */ +} +``` + +- 注册全局资源,**注册一个组件** + +```javascript +app.component('TodoDeleteButton', TodoDeleteButton) +``` + +### 多实例 + +```javascript +const app1 = createApp({ + /* ... */ +}) +app1.mount('#container-1') + +const app2 = createApp({ + /* ... */ +}) +app2.mount('#container-2') +``` + +--- + +## 模板语法 + +> 如果偏好使用JavaScript,JSX 支持直接**手写渲染函数**而不采用模板。但JSX不会享受到和模板同等级别的**编译时优化**。 + +### 文本插值 + +```vue +Message: {{ msg }} +``` + +### 使用原始HTML,不被vue编译 + +```vue +

      Using text interpolation: {{ rawHtml }}

      +

      Using v-html directive:

      +``` + +![原始HTML](./vue3.assets/c0eed55cafc0418c813d4a6e77ed2835.png) + +![安全警告](./vue3.assets/3b3bd03e11464112b94ed3afd66e7fbf.png) + +### Attribute 绑定 + +```vue +
      + +
      + + + +
      + + +
      +``` + +### _布尔型 Attribute ???_ + +当 isButtonDisabled 为真值或一个空字符串 (即 ` +``` + +### ` + + +``` + +### DOM 更新时机 + +```js +import { nextTick } from 'vue' + +async function increment() { + count.value++ + await nextTick() + // 现在 DOM 已经更新了 +} +``` + +### reactive() + +- `reactive()` 将使对象本身具有响应性 + +```vue + + + + +``` + +- `reactive()` 返回的是一个原始对象的 Proxy + +```js +const raw = {} +const proxy = reactive(raw) + +// 代理对象和原始对象不是全等的 +console.log(proxy === raw) // false + +// 在同一个对象上调用 reactive() 会返回相同的代理 +console.log(reactive(raw) === proxy) // true + +// 在一个代理上调用 reactive() 会返回它自己 +console.log(reactive(proxy) === proxy) // true +``` + +- **这个规则对嵌套对象也适用。依靠深层响应性,响应式对象内的嵌套对象依然是代理:** + +```js +const proxy = reactive({}) + +const raw = {} +proxy.nested = raw + +console.log(proxy.nested === raw) // false +``` + +### `reactive()` 的局限性 + +- 有限的值类型:不能持有如 string、number 或 boolean 这样的原始类型。 + +- 不能替换整个对象: + +```js +let state = reactive({ count: 0 }) + +// 上面的 ({ count: 0 }) 引用将不再被追踪 +// (响应性连接已丢失!) +state = reactive({ count: 1 }) +``` + +- 对解构操作不友好 + +```js +const state = reactive({ count: 0 }) + +// 当解构时,count 已经与 state.count 断开连接 +let { count } = state +// 不会影响原始的 state +count++ + +// 该函数接收到的是一个普通的数字 +// 并且无法追踪 state.count 的变化 +// 我们必须传入整个对象以保持响应性 +callSomeFunction(state.count) +``` + +## 计算属性 + +### 基础示例 + +```vue + + + +``` + +- 计算属性有缓存,当响应值没变化时,计算属性不会执行,如果用函数的话,函数每次都会执行 + +```js +// now永远不会更新,因为他没有用到响应值 +const now = computed(() => Date.now()) +``` + +### 可写计算属性 + +```vue + +``` + +## 类与样式绑定 + +```vue + + +``` + +渲染结果: + +`
      ` + +### 组件的类会叠加 + +```vue + +

      Hi!

      + + + + + +

      Hi!

      +``` + +## 条件渲染基本没变 + +```vue + +``` + +## 列表渲染 + +### `v-for`可以遍历对象,顺序基于Object.keys() + +### 使用范围值 【整数值】 + +```vue + +{{ n }} +``` + +### `