From 9340e9a11251fc13703bc4ee20e39ddcea501280 Mon Sep 17 00:00:00 2001 From: robinhoodjim Date: Fri, 12 Sep 2025 15:54:52 +0800 Subject: [PATCH 1/7] ConvertUtil refactor --- .../fs/ApacheVfsFileSystemAccessor.java | 14 +- .../com/robin/core/base/dao/SqlMapperDao.java | 3 +- .../core/base/datameta/BaseDataBaseMeta.java | 2 +- .../core/base/datameta/DataBaseParam.java | 2 +- .../robin/core/base/reflect/ReflectUtils.java | 2 - .../base/service/AbstractMybatisService.java | 2 +- .../base/service/util/QueryWrapperUtils.java | 5 +- .../collection/util/CollectionMapConvert.java | 3 +- .../robin/core/convert/util/ConvertUtil.java | 201 +++++++++++------- .../fileaccess/meta/DataCollectionMeta.java | 2 +- .../java/com/robin/basis/dto/SysMenuDTO.java | 2 +- .../basis/service/system/LoginService.java | 4 +- .../frameset/DataMappingContoller.java | 4 +- .../frameset/ProjectInfoContorller.java | 6 +- .../controller/system/SysOrgController.java | 2 +- .../system/SysResourceContorller.java | 2 +- .../system/SysResponsiblityController.java | 4 +- .../controller/system/SysRoleContorller.java | 5 +- .../controller/user/LoginController.java | 4 +- .../frameset/DataMappingContoller.java | 4 +- .../frameset/ProjectInfoContorller.java | 6 +- .../controller/system/SysOrgController.java | 2 +- .../system/SysResponsiblityController.java | 4 +- .../controller/system/SysRoleContorller.java | 4 +- .../controller/user/LoginController.java | 2 +- hadooptool/pom.xml | 69 +++++- .../com/robin/basis/VueBackApplication.java | 3 +- .../java/com/robin/basis/config/DbConfig.java | 29 ++- .../controller/system/SysOrgController.java | 2 +- .../system/SysUserCrudController.java | 6 +- .../controller/user/LoginController.java | 2 +- .../java/com/robin/basis/dto/RouterDTO.java | 2 +- .../com/robin/basis/model/user/SysUser.java | 7 +- .../basis/sercurity/LoginDetailsService.java | 8 +- .../robin/basis/sercurity/SysLoginUser.java | 2 +- .../system/impl/SysUserServiceImpl.java | 2 +- .../java/com/robin/basis/utils/WebUtils.java | 17 ++ vueback/src/main/resources/application.yml | 10 +- vueback/src/main/resources/logback-spring.xml | 6 +- .../controller/AbstractAutoController.java | 8 +- .../web/controller/AbstractController.java | 6 +- .../controller/AbstractCrudController.java | 8 +- .../AbstractCrudDhtmlxController.java | 2 +- .../controller/AbstractMyBatisController.java | 17 +- 44 files changed, 328 insertions(+), 169 deletions(-) diff --git a/common/src/main/java/com/robin/core/fileaccess/fs/ApacheVfsFileSystemAccessor.java b/common/src/main/java/com/robin/core/fileaccess/fs/ApacheVfsFileSystemAccessor.java index e15b649f..ac8a22f3 100644 --- a/common/src/main/java/com/robin/core/fileaccess/fs/ApacheVfsFileSystemAccessor.java +++ b/common/src/main/java/com/robin/core/fileaccess/fs/ApacheVfsFileSystemAccessor.java @@ -49,7 +49,7 @@ public Pair getInResourceByReader(String resourcePa VfsParam param = new VfsParam(); InputStream stream; try { - ConvertUtil.convertToTarget(param, colmeta.getResourceCfgMap()); + ConvertUtil.convertToTarget(colmeta.getResourceCfgMap(), param); FileObject fileObject = manager.resolveFile(getUriByParam(param, resourcePath).toString(), getOptions(param)); checkAndSetFileObject(fileObject); stream = getInResource(fileObject, colmeta); @@ -92,7 +92,7 @@ public OutputStream getOutResourceByStream(String resourcePath) throws IOExcepti public InputStream getInResourceByStream(String resourcePath) throws IOException { VfsParam param = new VfsParam(); try { - ConvertUtil.convertToTarget(param, colmeta.getResourceCfgMap()); + ConvertUtil.convertToTarget(colmeta.getResourceCfgMap(), param); FileObject fileObject = manager.resolveFile(getUriByParam(param, resourcePath).toString(), getOptions(param)); checkAndSetFileObject(fileObject); return getInResource(fileObject, colmeta); @@ -104,7 +104,7 @@ public InputStream getInResourceByStream(String resourcePath) throws IOException public static FileObject getFileObject(FileSystemManager manager, DataCollectionMeta meta, String resPath) throws IOException { VfsParam param = new VfsParam(); try { - ConvertUtil.convertToTarget(param, meta.getResourceCfgMap()); + ConvertUtil.convertToTarget(meta.getResourceCfgMap(), param); return manager.resolveFile(getUriByParam(param, resPath).toString(), getOptions(param)); } catch (Exception ex) { throw new IOException(ex); @@ -162,7 +162,7 @@ public List listFilePath(VfsParam param, String path) { public FileObject createNotExists(DataCollectionMeta meta, String resourcePath) throws Exception { VfsParam param = new VfsParam(); - ConvertUtil.convertToTarget(param, meta.getResourceCfgMap()); + ConvertUtil.convertToTarget(meta.getResourceCfgMap(), param); try (FileObject fo = manager.resolveFile(getUriByParam(param, resourcePath).toString(), getOptions(param))) { if (fo.exists()) { if (FileType.FOLDER.equals(fo.getType())) { @@ -209,7 +209,7 @@ public OutputStream getRawOutputStream(String resourcePath) throws IOException { public InputStream getRawInputStream(String resourcePath) throws IOException { VfsParam param = new VfsParam(); try { - ConvertUtil.convertToTarget(param, colmeta.getResourceCfgMap()); + ConvertUtil.convertToTarget(colmeta.getResourceCfgMap(), param); FileObject fileObject = manager.resolveFile(getUriByParam(param, resourcePath).toString(), getOptions(param)); checkAndSetFileObject(fileObject); return getRawInResource(fileObject, colmeta); @@ -284,7 +284,7 @@ public VfsParam returnFtpParam(String hostName, int port, String userName, Strin public boolean exists(String resourcePath) throws IOException { VfsParam param = new VfsParam(); try { - ConvertUtil.convertToTarget(param, colmeta.getResourceCfgMap()); + ConvertUtil.convertToTarget(colmeta.getResourceCfgMap(), param); } catch (Exception ex) { throw new IOException(ex); } @@ -299,7 +299,7 @@ public boolean exists(String resourcePath) throws IOException { public long getInputStreamSize(String resourcePath) throws IOException { VfsParam param = new VfsParam(); try { - ConvertUtil.convertToTarget(param, colmeta.getResourceCfgMap()); + ConvertUtil.convertToTarget(colmeta.getResourceCfgMap(), param); } catch (Exception ex) { throw new IOException(ex); } diff --git a/core/src/main/java/com/robin/core/base/dao/SqlMapperDao.java b/core/src/main/java/com/robin/core/base/dao/SqlMapperDao.java index c18c86b3..4a662596 100644 --- a/core/src/main/java/com/robin/core/base/dao/SqlMapperDao.java +++ b/core/src/main/java/com/robin/core/base/dao/SqlMapperDao.java @@ -23,7 +23,6 @@ import javax.sql.DataSource; import java.lang.invoke.MethodHandle; -import java.lang.reflect.Method; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; @@ -120,7 +119,7 @@ private Map wrapSqlAndParameter(String nameSpace, String id, Str } } else { try { - ConvertUtil.objectToMapObj(paramMap, params[0]); + ConvertUtil.objectToMapObj(params[0], paramMap); } catch (Exception ex) { throw new DAOException(ex); } diff --git a/core/src/main/java/com/robin/core/base/datameta/BaseDataBaseMeta.java b/core/src/main/java/com/robin/core/base/datameta/BaseDataBaseMeta.java index 2a7fdec5..16ea1aba 100644 --- a/core/src/main/java/com/robin/core/base/datameta/BaseDataBaseMeta.java +++ b/core/src/main/java/com/robin/core/base/datameta/BaseDataBaseMeta.java @@ -61,7 +61,7 @@ public String getUrl(){ return param.getUrlByMeta(this); } protected void processParam(Map map) throws Exception{ - ConvertUtil.objectToMap(map, param); + ConvertUtil.objectToMap(param, map); } protected BaseDataBaseMeta(DataBaseParam param){ diff --git a/core/src/main/java/com/robin/core/base/datameta/DataBaseParam.java b/core/src/main/java/com/robin/core/base/datameta/DataBaseParam.java index 8ed5b24d..38070b24 100644 --- a/core/src/main/java/com/robin/core/base/datameta/DataBaseParam.java +++ b/core/src/main/java/com/robin/core/base/datameta/DataBaseParam.java @@ -70,7 +70,7 @@ public String getUrlByMeta(BaseDataBaseMeta dbMeta){ } protected Map processParam() throws Exception{ Map map=new HashMap<>(); - ConvertUtil.objectToMap(map, this); + ConvertUtil.objectToMap(this, map); return map; } diff --git a/core/src/main/java/com/robin/core/base/reflect/ReflectUtils.java b/core/src/main/java/com/robin/core/base/reflect/ReflectUtils.java index a89f8e84..72d8407c 100644 --- a/core/src/main/java/com/robin/core/base/reflect/ReflectUtils.java +++ b/core/src/main/java/com/robin/core/base/reflect/ReflectUtils.java @@ -14,9 +14,7 @@ import java.lang.invoke.MethodHandles; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; - import java.lang.reflect.Method; -import java.lang.reflect.Type; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; diff --git a/core/src/main/java/com/robin/core/base/service/AbstractMybatisService.java b/core/src/main/java/com/robin/core/base/service/AbstractMybatisService.java index 7ab45072..0dd9c69a 100644 --- a/core/src/main/java/com/robin/core/base/service/AbstractMybatisService.java +++ b/core/src/main/java/com/robin/core/base/service/AbstractMybatisService.java @@ -467,7 +467,7 @@ public boolean createWithRequest(Object requsetObj) { try { T obj = voType.newInstance(); if (requsetObj.getClass().getInterfaces().length > 0 && requsetObj.getClass().getInterfaces()[0].isAssignableFrom(Map.class)) { - ConvertUtil.mapToBaseObject(obj, (HashMap) requsetObj); + ConvertUtil.mapToBaseObject((HashMap) requsetObj, obj); } else { Map modelGetMetholds = ReflectUtils.returnGetMethodHandle(requsetObj.getClass()); Iterator> iter = modelGetMetholds.entrySet().iterator(); diff --git a/core/src/main/java/com/robin/core/base/service/util/QueryWrapperUtils.java b/core/src/main/java/com/robin/core/base/service/util/QueryWrapperUtils.java index 4ca21e85..0a154d77 100644 --- a/core/src/main/java/com/robin/core/base/service/util/QueryWrapperUtils.java +++ b/core/src/main/java/com/robin/core/base/service/util/QueryWrapperUtils.java @@ -11,15 +11,12 @@ import com.robin.core.convert.util.ConvertUtil; import com.robin.core.query.util.Condition; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import java.lang.invoke.MethodHandle; -import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.sql.Timestamp; import java.time.LocalDate; import java.time.LocalDateTime; @@ -185,7 +182,7 @@ protected static Object returnTimeColumn(String value, Class clazz) { } private static Map returnValueMap(PageDTO targetObj) throws Exception { Map getMap = new HashMap<>(); - ConvertUtil.objectToMapObj(getMap,targetObj,"param","order","page","limit","size","orderField","orderBy"); + ConvertUtil.objectToMapObj(targetObj, getMap, "param","order","page","limit","size","orderField","orderBy"); if (!CollectionUtils.isEmpty(targetObj.getParam())) { getMap.putAll(targetObj.getParam()); } diff --git a/core/src/main/java/com/robin/core/collection/util/CollectionMapConvert.java b/core/src/main/java/com/robin/core/collection/util/CollectionMapConvert.java index 4c4ba1a6..96b89f8f 100644 --- a/core/src/main/java/com/robin/core/collection/util/CollectionMapConvert.java +++ b/core/src/main/java/com/robin/core/collection/util/CollectionMapConvert.java @@ -29,7 +29,6 @@ import javax.script.CompiledScript; import java.lang.invoke.MethodHandle; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -181,7 +180,7 @@ public static List filterListByColumnCondition(List listobj, String sc Map valueMap = new HashMap<>(); try { bindings.clear(); - ConvertUtil.objectToMapObj(valueMap, f); + ConvertUtil.objectToMapObj(f, valueMap); bindings.putAll(valueMap); return (Boolean) script.eval(bindings); }catch (Exception ex){ diff --git a/core/src/main/java/com/robin/core/convert/util/ConvertUtil.java b/core/src/main/java/com/robin/core/convert/util/ConvertUtil.java index d863340c..0e0efc1b 100644 --- a/core/src/main/java/com/robin/core/convert/util/ConvertUtil.java +++ b/core/src/main/java/com/robin/core/convert/util/ConvertUtil.java @@ -38,9 +38,7 @@ import java.math.BigDecimal; import java.sql.Timestamp; import java.sql.Types; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; +import java.time.*; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.*; @@ -53,23 +51,34 @@ public class ConvertUtil { public static final DateTimeFormatter ymdSepSecondformatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); public static final DateTimeFormatter ymdEupformatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); private static ThreadLocal currentFormatter = new ThreadLocal<>(); + private static ThreadLocal timeFormatStrLocal=new ThreadLocal<>(); + private static List formatStrList=Lists.newArrayList("yyyyMMdd","yyyy-MM-dd","yyyyMMddHHmmss","yyyy-MM-dd HH:mm:ss","yyyy/MM/dd"); + private static List formatterList=Lists.newArrayList(ymdformatter,ymdSepformatter,ymdSecondformatter,ymdSepSecondformatter,ymdEupformatter); + private ConvertUtil() { } - public static void convertToTargetObj(Object target, Object src, String... ignoreColumns) throws Exception { - if (target == null || src == null) { + /** + * + * @param source + * @param target + * @param ignoreColumns + * @throws Exception + */ + public static void convertToTargetObj(Object source, Object target, String... ignoreColumns) throws Exception { + if (target == null || source == null) { return; } - Map srcmap = ReflectUtils.returnGetMethodHandle(src.getClass()); + Map srcmap = ReflectUtils.returnGetMethodHandle(source.getClass()); Map targetMap = ReflectUtils.returnSetMethodHandle(target.getClass()); List ignoreColumnList = getIgnoreColumns(ignoreColumns); try { for (Map.Entry entry : srcmap.entrySet()) { if (targetMap.containsKey(entry.getKey()) && (ObjectUtils.isEmpty(ignoreColumnList) || !ignoreColumnList.contains(entry.getKey()))) { - Object value = parseParameter(targetMap.get(entry.getKey()).type().parameterType(1), srcmap.get(entry.getKey()).bindTo(src).invoke()); + Object value = parseParameter(targetMap.get(entry.getKey()).type().parameterType(1), srcmap.get(entry.getKey()).bindTo(source).invoke()); targetMap.get(entry.getKey()).bindTo(target).invoke(value); } } @@ -86,16 +95,16 @@ private static List getIgnoreColumns(String[] ignoreColumns) { return ignoreColumnList; } - public static void objectToMap(Map target, Object src) throws IllegalAccessException, IllegalArgumentException, + public static void objectToMap(Object source, Map target) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { - if (src == null || target == null) { + if (source == null || target == null) { return; } - Map getMethods = ReflectUtils.returnGetMethodHandle(src.getClass()); + Map getMethods = ReflectUtils.returnGetMethodHandle(source.getClass()); try { for (Map.Entry entry : getMethods.entrySet()) { if (entry.getValue().type().parameterCount() == 1) { - Object value = entry.getValue().bindTo(src).invoke(); + Object value = entry.getValue().bindTo(source).invoke(); target.put(entry.getKey(), value == null ? "" : value.toString().trim()); } } @@ -104,16 +113,16 @@ public static void objectToMap(Map target, Object src) throws Il } } - public static void objectToMapObj(Map target, Object src) throws IllegalAccessException, IllegalArgumentException, + public static void objectToMapObj(Object source, Map target) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { - if (ObjectUtils.isEmpty(src)) { + if (ObjectUtils.isEmpty(source)) { return; } - Map getMetholds = ReflectUtils.returnGetMethodHandle(src.getClass()); + Map getMetholds = ReflectUtils.returnGetMethodHandle(source.getClass()); try { for (Map.Entry entry : getMetholds.entrySet()) { if (entry.getValue().type().parameterCount() == 1) { - Object value = entry.getValue().bindTo(src).invoke(); + Object value = entry.getValue().bindTo(source).invoke(); if (!ObjectUtils.isEmpty(value)) { target.put(entry.getKey(), value); } @@ -124,17 +133,17 @@ public static void objectToMapObj(Map target, Object src) throws } } - public static void objectToMapObj(Map target, Object src, String... ignoreColumns) throws IllegalAccessException, IllegalArgumentException, + public static void objectToMapObj(Object source, Map target, String... ignoreColumns) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { Set ignoreSets = ignoreColumns.length > 0 ? Sets.newHashSet(ignoreColumns) : null; - if (ObjectUtils.isEmpty(src)) { + if (ObjectUtils.isEmpty(source)) { return; } - Map getMetholds = ReflectUtils.returnGetMethodHandle(src.getClass()); + Map getMetholds = ReflectUtils.returnGetMethodHandle(source.getClass()); try { for (Map.Entry entry : getMetholds.entrySet()) { if (entry.getValue().type().parameterCount() == 1 && (CollectionUtils.isEmpty(ignoreSets) || !ignoreSets.contains(entry.getKey()))) { - Object value = entry.getValue().bindTo(target).invoke(src); + Object value = entry.getValue().bindTo(target).invoke(source); if (!ObjectUtils.isEmpty(value)) { target.put(entry.getKey(), value); } @@ -145,11 +154,11 @@ public static void objectToMapObj(Map target, Object src, String } } - public static void mapToBaseObject(BaseObject target, Map src, String... ignoreColumns) throws Exception { - if (src == null || target == null) { + public static void mapToBaseObject(Map source, BaseObject target, String... ignoreColumns) throws Exception { + if (source == null || target == null) { return; } - Iterator> it = src.entrySet().iterator(); + Iterator> it = source.entrySet().iterator(); Map methodMap = ReflectUtils.returnSetMethodHandle(target.getClass()); List ignoreColumnList = getIgnoreColumns(ignoreColumns); try { @@ -175,11 +184,11 @@ public static void mapToBaseObject(BaseObject target, Map src, S } - public static void mapToObject(Object target, Map src, String... ignoreColumns) throws Exception { - if (src == null || target == null) { + public static void mapToObject(Map source, Object target, String... ignoreColumns) throws Exception { + if (source == null || target == null) { return; } - Iterator> it = src.entrySet().iterator(); + Iterator> it = source.entrySet().iterator(); Map targetMap = ReflectUtils.returnSetMethodHandle(target.getClass()); List ignoreColumnList = getIgnoreColumns(ignoreColumns); try { @@ -208,14 +217,14 @@ private static String camelCase(String value) { return value.substring(0, 1).toUpperCase() + value.substring(1); } - public static void convertSerializableForUpdate(Serializable target, Serializable src, String... ignoreColumns) throws Exception { - if (target == null || src == null) { + public static void convertSerializableForUpdate(Serializable source, Serializable target, String... ignoreColumns) throws Exception { + if (target == null || source == null) { return; } - if (!target.getClass().equals(src.getClass())) { + if (!target.getClass().equals(source.getClass())) { throw new GenericException("source and target class mismatch"); } - Map srcmap = ReflectUtils.returnGetMethodHandle(src.getClass()); + Map srcmap = ReflectUtils.returnGetMethodHandle(source.getClass()); Map targetMap = ReflectUtils.returnSetMethodHandle(target.getClass()); List ignoreColumnList = getIgnoreColumns(ignoreColumns); try { @@ -223,7 +232,7 @@ public static void convertSerializableForUpdate(Serializable target, Serializabl String field = entry.getKey(); if (ObjectUtils.isEmpty(ignoreColumnList) || !ignoreColumnList.contains(field)) { - Object value = entry.getValue().bindTo(src).invoke(); + Object value = entry.getValue().bindTo(source).invoke(); if (value != null && targetMap.get(entry.getKey()) != null) { setObjectValue(target, value, targetMap.get(entry.getKey())); } @@ -235,21 +244,21 @@ public static void convertSerializableForUpdate(Serializable target, Serializabl } - public static void convertToModelForUpdate(BaseObject target, BaseObject src) throws Exception { - if (target == null || src == null) { + public static void convertToModelForUpdate(BaseObject source, BaseObject target) throws Exception { + if (target == null || source == null) { return; } - if (!target.getClass().equals(src.getClass())) { + if (!target.getClass().equals(source.getClass())) { throw new RuntimeException("must have unique type"); } - Map srcmap = ReflectUtils.returnGetMethodHandle(src.getClass()); - Map targetmap = ReflectUtils.returnSetMethodHandle(src.getClass()); + Map srcmap = ReflectUtils.returnGetMethodHandle(source.getClass()); + Map targetmap = ReflectUtils.returnSetMethodHandle(source.getClass()); try { - if (!ObjectUtils.isEmpty(src.getDirtyColumn())) { - for (String s : src.getDirtyColumn()) { + if (!ObjectUtils.isEmpty(source.getDirtyColumn())) { + for (String s : source.getDirtyColumn()) { MethodHandle method = srcmap.get(s); if (method != null) { - Object value = method.bindTo(src).invoke(); + Object value = method.bindTo(source).invoke(); if (value != null) { targetmap.get(s).bindTo(target).invoke(value); } else { @@ -306,38 +315,58 @@ private static void setObjectValue(Serializable target, Object value, MethodHand } @SuppressWarnings("unchecked") - public static void convertToTarget(Object target, Object src, String... ignoreColumns) throws Exception { - if (target == null || src == null) { + public static void convertToTarget(Object source, Object target, String... ignoreColumns) throws Exception { + if (target == null || source == null) { return; } - Map targetMethodMap = ReflectUtils.returnSetMethodHandle(target.getClass()); - Map sourceMethodMap = ReflectUtils.returnGetMethodHandle(src.getClass()); + List ignoreColumnList = getIgnoreColumns(ignoreColumns); try { - if (Map.class.isAssignableFrom(src.getClass())) { - Map vMap = (Map) src; - for (Map.Entry entry : vMap.entrySet()) { - String field = entry.getKey(); - MethodHandle setMethod = targetMethodMap.get(field); - if (setMethod != null) { - if (target instanceof BaseObject) { - setBaseObjectValue((BaseObject) target, entry.getValue(), field, setMethod); - } else { - if (targetMethodMap.containsKey(field) && (ObjectUtils.isEmpty(ignoreColumnList) || !ignoreColumnList.contains(field))) { - Object retValue = parseParameter(targetMethodMap.get(field).type().parameterType(1), entry.getValue()); - if (retValue != null) { - setObjectValue(targetMethodMap.get(field), target, retValue); + if (Map.class.isAssignableFrom(source.getClass())) { + if(!Map.class.isAssignableFrom(target.getClass())) { + Map vMap = (Map) source; + Map targetMethodMap = ReflectUtils.returnSetMethodHandle(target.getClass()); + for (Map.Entry entry : vMap.entrySet()) { + String field = entry.getKey(); + MethodHandle setMethod = targetMethodMap.get(field); + if (setMethod != null) { + if (target instanceof BaseObject) { + setBaseObjectValue((BaseObject) target, entry.getValue(), field, setMethod); + } else { + if (targetMethodMap.containsKey(field) && canFill(ignoreColumnList,field)) { + Object retValue = parseParameter(targetMethodMap.get(field).type().parameterType(1), entry.getValue()); + if (retValue != null) { + setObjectValue(targetMethodMap.get(field), target, retValue); + } } } } } + }else{ + ((Set>)((Map)source).entrySet()).forEach(entry->{ + if(entry.getValue()!=null && canFill(ignoreColumnList,entry.getKey().toString())){ + ((Map) target).put(entry.getKey(),entry.getValue()); + } + }); } } else { - for (Map.Entry entry : sourceMethodMap.entrySet()) { - if (targetMethodMap.containsKey(entry.getKey()) && entry.getValue().type().parameterCount() == 1) { - Object retValue = parseParameter(targetMethodMap.get(entry.getKey()).type().parameterType(1), entry.getValue().bindTo(src).invoke()); - if (null != retValue) { - setObjectValue(targetMethodMap.get(entry.getKey()), target, retValue); + if(!Map.class.isAssignableFrom(target.getClass())) { + Map targetMethodMap = ReflectUtils.returnSetMethodHandle(target.getClass()); + Map sourceMethodMap = ReflectUtils.returnGetMethodHandle(source.getClass()); + for (Map.Entry entry : sourceMethodMap.entrySet()) { + if (targetMethodMap.containsKey(entry.getKey()) && entry.getValue().type().parameterCount() == 1) { + Object retValue = parseParameter(targetMethodMap.get(entry.getKey()).type().parameterType(1), entry.getValue().bindTo(source).invoke()); + if (null != retValue) { + setObjectValue(targetMethodMap.get(entry.getKey()), target, retValue); + } + } + } + }else{ + Map sourceMethodMap = ReflectUtils.returnGetMethodHandle(source.getClass()); + for (Map.Entry entry : sourceMethodMap.entrySet()) { + Object retValue=entry.getValue().bindTo(source).invoke(); + if(retValue!=null && canFill(ignoreColumnList,entry.getKey())) { + ((Map) target).put(entry.getKey(), retValue); } } } @@ -346,6 +375,9 @@ public static void convertToTarget(Object target, Object src, String... ignoreCo throw new IllegalAccessException(ex1.getMessage()); } } + private static boolean canFill(List ignoreColumnList,String field){ + return ObjectUtils.isEmpty(ignoreColumnList) || !ignoreColumnList.contains(field); + } private static void setObjectValue(MethodHandle setMethod, Object target, Object value) throws Throwable { setMethod.bindTo(target).invoke(value); @@ -459,24 +491,21 @@ public static Object parseParameter(Class type, Object strValue) throws Excep if (java.util.Date.class.isAssignableFrom(strValue.getClass())) { ret = strValue; } else { - formatter = !ObjectUtils.isEmpty(currentFormatter.get()) ? currentFormatter.get() : getFormatter(strValue.toString()); - LocalDateTime localDateTime = LocalDateTime.parse(strValue.toString(), formatter); + LocalDateTime localDateTime = getLocalDateTimeFrom(strValue.toString()); ret = new java.util.Date(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); } } else if (type.isAssignableFrom(Timestamp.class)) { if (Timestamp.class.isAssignableFrom(strValue.getClass())) { ret = strValue; } else { - formatter = !ObjectUtils.isEmpty(currentFormatter.get()) ? currentFormatter.get() : getFormatter(strValue.toString()); - LocalDateTime localDateTime = LocalDateTime.parse(strValue.toString(), formatter); + LocalDateTime localDateTime = getLocalDateTimeFrom(strValue.toString()); ret = new Timestamp(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); } } else if (type.isAssignableFrom(LocalDateTime.class)) { if (LocalDateTime.class.isAssignableFrom(strValue.getClass())) { ret = strValue; } else { - formatter = !ObjectUtils.isEmpty(currentFormatter.get()) ? currentFormatter.get() : getFormatter(strValue.toString()); - ret = LocalDateTime.parse(strValue.toString(), formatter); + ret = getLocalDateTimeFrom(strValue); } } } else if (type.isAssignableFrom(String.class)) { @@ -500,6 +529,22 @@ public static Object parseParameter(Class type, Object strValue) throws Excep return ret; } + private static LocalDateTime getLocalDateTimeFrom(Object strValue) { + LocalDateTime ret=null; + DateTimeFormatter formatter; + formatter = !ObjectUtils.isEmpty(currentFormatter.get()) ? currentFormatter.get() : getFormatter(strValue.toString()); + if(formatter!=null) { + if (ymdformatter.equals(formatter) || ymdEupformatter.equals(formatter) || ymdEupformatter.equals(formatter)) { + ret = LocalDate.parse(strValue.toString(), formatter).atStartOfDay(); + } else { + ret = LocalDateTime.parse(strValue.toString(), formatter); + } + }else if(NumberUtils.isNumber(strValue.toString())){ + ret=LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.valueOf(strValue.toString())),ZoneId.systemDefault()); + } + return ret; + } + public static DateTimeFormatter getFormatter(String value) { DateTimeFormatter retFormatter = currentFormatter.get(); if (ObjectUtils.isEmpty(retFormatter)) { @@ -514,7 +559,9 @@ public static DateTimeFormatter getFormatter(String value) { } else if (isFormatterFit(value, ymdEupformatter)) { retFormatter = ymdEupformatter; } - currentFormatter.set(retFormatter); + if(retFormatter!=null) { + currentFormatter.set(retFormatter); + } } return retFormatter; } @@ -694,12 +741,24 @@ public static void sourceToMap(Map map, T sourceObj, String } } - public static void setDateFormat(String formatStr) { - currentFormatter.set(DateTimeFormatter.ofPattern(formatStr)); + public static void setDateTimeFormat(String formatStr) { + int pos=formatStrList.indexOf(formatStr); + if(pos!=-1){ + currentFormatter.set(formatterList.get(pos)); + }else { + currentFormatter.set(DateTimeFormatter.ofPattern(formatStr)); + } + timeFormatStrLocal.set(formatStr); } - public static void setDateFormat(DateTimeFormatter formatter) { - currentFormatter.set(formatter); + public static void setDateTimeFormat(DateTimeFormatter formatter) { + int pos=formatStrList.indexOf(formatter.toString()); + if(pos!=-1){ + currentFormatter.set(formatterList.get(pos)); + }else { + currentFormatter.set(formatter); + } + timeFormatStrLocal.set(formatter.toString()); } public static void finishConvert() { diff --git a/core/src/main/java/com/robin/core/fileaccess/meta/DataCollectionMeta.java b/core/src/main/java/com/robin/core/fileaccess/meta/DataCollectionMeta.java index 8cd74ade..b60154ef 100644 --- a/core/src/main/java/com/robin/core/fileaccess/meta/DataCollectionMeta.java +++ b/core/src/main/java/com/robin/core/fileaccess/meta/DataCollectionMeta.java @@ -203,7 +203,7 @@ public static DataCollectionMeta fromYamlConfig(String yamlConfigPath) throws IO public String constructUrl() { VfsParam param = new VfsParam(); try { - ConvertUtil.convertToTarget(param, getResourceCfgMap()); + ConvertUtil.convertToTarget(getResourceCfgMap(), param); param.adjustProtocol(); StringBuilder builder = new StringBuilder(); builder.append(param.getProtocol()).append("://"); diff --git a/example/base-example/src/main/java/com/robin/basis/dto/SysMenuDTO.java b/example/base-example/src/main/java/com/robin/basis/dto/SysMenuDTO.java index fca54151..03323c60 100644 --- a/example/base-example/src/main/java/com/robin/basis/dto/SysMenuDTO.java +++ b/example/base-example/src/main/java/com/robin/basis/dto/SysMenuDTO.java @@ -30,7 +30,7 @@ public static SysMenuDTO fromVO(SysResource source){ public static SysMenuDTO fromMap(Map map){ SysMenuDTO dto=new SysMenuDTO(); try{ - ConvertUtil.mapToObject(dto,map); + ConvertUtil.mapToObject(map, dto); dto.setAssignType(map.get("assignType").toString()); dto.setTitle(map.get("name").toString()); dto.setPath(map.get("url").toString()); diff --git a/example/base-example/src/main/java/com/robin/basis/service/system/LoginService.java b/example/base-example/src/main/java/com/robin/basis/service/system/LoginService.java index 4e1b1615..0b48a44b 100644 --- a/example/base-example/src/main/java/com/robin/basis/service/system/LoginService.java +++ b/example/base-example/src/main/java/com/robin/basis/service/system/LoginService.java @@ -115,7 +115,7 @@ public Map getUserAndResp(String userName) { List respList = sysUserResponsiblityService.queryByField("userId", Const.OPERATOR.EQ, queryUser.getId()); try { - ConvertUtil.objectToMapObj(retMap, queryUser); + ConvertUtil.objectToMapObj(queryUser, retMap); } catch (Exception ex) { throw new ServiceException(ex); } @@ -373,7 +373,7 @@ private void fillRights(Long id, @NonNull Map resMap, Map tmap = new HashMap<>(); if (!idMap.containsKey(pid.toString())) { - ConvertUtil.objectToMapObj(tmap, resMap.get(pid)); + ConvertUtil.objectToMapObj(resMap.get(pid), tmap); tmap.put("assignType", "0"); fillRights(pid, resMap, privMap, tmap, idMap); } diff --git a/example/boot-example/src/main/java/com/robin/basis/controller/frameset/DataMappingContoller.java b/example/boot-example/src/main/java/com/robin/basis/controller/frameset/DataMappingContoller.java index 2afeadfe..f93622cf 100644 --- a/example/boot-example/src/main/java/com/robin/basis/controller/frameset/DataMappingContoller.java +++ b/example/boot-example/src/main/java/com/robin/basis/controller/frameset/DataMappingContoller.java @@ -276,7 +276,7 @@ public Map genCode(HttpServletRequest request, HttpServletRespon String basePath = info.getProjBasePath(); String className = enmap.getJavaClass().substring(0, 1).toUpperCase() + enmap.getJavaClass().substring(1, enmap.getJavaClass().length()); Map entityMap = new HashMap<>(); - ConvertUtil.objectToMap(entityMap, enmap); + ConvertUtil.objectToMap(enmap, entityMap); entityMap.put("pkType", pktype); entityMap.put("upperName", className); if (!basePath.endsWith("/")) { @@ -437,7 +437,7 @@ public Map saveConfig(HttpServletRequest request, HttpServletRes Map retMap = new HashMap<>(); mapping = new EntityMapping(); try { - ConvertUtil.mapToObject(mapping, wrapRequest(request)); + ConvertUtil.mapToObject(wrapRequest(request), mapping); String javaClass = mapping.getJavaClass(); if (mapping.getSpringName() == null || mapping.getSpringName().isEmpty()) { mapping.setSpringName(javaClass.substring(0, 1).toLowerCase() + javaClass.substring(1)); diff --git a/example/boot-example/src/main/java/com/robin/basis/controller/frameset/ProjectInfoContorller.java b/example/boot-example/src/main/java/com/robin/basis/controller/frameset/ProjectInfoContorller.java index 3796ee8f..ab2bfa37 100644 --- a/example/boot-example/src/main/java/com/robin/basis/controller/frameset/ProjectInfoContorller.java +++ b/example/boot-example/src/main/java/com/robin/basis/controller/frameset/ProjectInfoContorller.java @@ -64,7 +64,7 @@ public Map saveProjectInfo(HttpServletRequest request, HttpServl Map retmap = new HashMap(); try { ProjectInfo projectInfo = new ProjectInfo(); - ConvertUtil.mapToObject(projectInfo, wrapRequest(request)); + ConvertUtil.mapToObject(wrapRequest(request), projectInfo); //DataSourceService DataSourceService = (DataSourceService) getBean("DataSourceService"); this.service.saveEntity(projectInfo); constructRetMap(retmap); @@ -138,7 +138,7 @@ public Map viewProjectInfo(HttpServletRequest request, HttpServl try { //DataSourceService DataSourceService = (DataSourceService) getBean("DataSourceService"); ProjectInfo projectInfo = this.service.getEntity(id); - ConvertUtil.objectToMapObj(retmap, projectInfo); + ConvertUtil.objectToMapObj(projectInfo, retmap); wrapSuccessMap(retmap, "OK"); } catch (Exception e) { retmap.put("success", false); @@ -175,7 +175,7 @@ public Map updateProjectInfo(HttpServletRequest request, HttpSer Map retmap = new HashMap<>(); try { ProjectInfo projectInfo = new ProjectInfo(); - ConvertUtil.mapToObject(projectInfo, wrapRequest(request)); + ConvertUtil.mapToObject(wrapRequest(request), projectInfo); this.service.updateEntity(projectInfo); retmap.put("success", true); } catch (Exception e) { diff --git a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysOrgController.java b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysOrgController.java index f62e150c..df693c8b 100644 --- a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysOrgController.java +++ b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysOrgController.java @@ -59,7 +59,7 @@ public Map saveOrg(HttpServletRequest request, HttpServletRespon String orgCode = ""; try { SysOrg vo = new SysOrg(); - ConvertUtil.mapToObject(vo, wrapRequest(request)); + ConvertUtil.mapToObject(wrapRequest(request), vo); PageQuery> query = new PageQuery<>(); query.setSelectParamId("GET_ORGMAXCODE"); service.queryBySelectId(query); diff --git a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResourceContorller.java b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResourceContorller.java index 699062f2..8401c8a5 100644 --- a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResourceContorller.java +++ b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResourceContorller.java @@ -127,7 +127,7 @@ public Map updateSysResource(HttpServletRequest request, SysResource user=service.getEntity(id); SysResource tmpuser=new SysResource(); ConvertUtil.convertToModel(tmpuser, map); - ConvertUtil.convertToModelForUpdate(user, tmpuser); + ConvertUtil.convertToModelForUpdate(tmpuser, user); service.updateEntity(user); retmap.put("id", String.valueOf(id)); retmap.put("success", "true"); diff --git a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java index 45783462..4788e4ac 100644 --- a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java +++ b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java @@ -105,8 +105,8 @@ public Map updateRole(HttpServletRequest request, Long id=Long.valueOf(request.getParameter("id")); SysResponsibility user=service.getEntity(id); SysRole tmpuser=new SysRole(); - ConvertUtil.mapToObject(tmpuser, map); - ConvertUtil.convertToModelForUpdate(user, tmpuser); + ConvertUtil.mapToObject(map, tmpuser); + ConvertUtil.convertToModelForUpdate(tmpuser, user); service.updateEntity(user); retmap.put("id", String.valueOf(id)); retmap.put("success", "true"); diff --git a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java index 19a0691e..73ff8199 100644 --- a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java +++ b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java @@ -4,7 +4,6 @@ import com.robin.basis.model.system.SysResource; import com.robin.basis.service.system.SysResourceService; import com.robin.core.base.util.Const; -import com.robin.core.collection.util.CollectionBaseConvert; import com.robin.core.convert.util.ConvertUtil; import com.robin.core.query.util.PageQuery; import com.robin.core.web.controller.AbstractCrudDhtmlxController; @@ -83,8 +82,8 @@ public Map updateRole(HttpServletRequest request, Long id=Long.valueOf(request.getParameter("id")); SysRole user=service.getEntity(id); SysRole tmpuser=new SysRole(); - ConvertUtil.mapToObject(tmpuser, map); - ConvertUtil.convertToModelForUpdate(user, tmpuser); + ConvertUtil.mapToObject(map, tmpuser); + ConvertUtil.convertToModelForUpdate(tmpuser, user); service.updateEntity(user); retmap.put("id", String.valueOf(id)); retmap.put("success", "true"); diff --git a/example/boot-example/src/main/java/com/robin/basis/controller/user/LoginController.java b/example/boot-example/src/main/java/com/robin/basis/controller/user/LoginController.java index 3ad3bb40..e90feb78 100644 --- a/example/boot-example/src/main/java/com/robin/basis/controller/user/LoginController.java +++ b/example/boot-example/src/main/java/com/robin/basis/controller/user/LoginController.java @@ -72,7 +72,7 @@ public Map login(HttpServletRequest request, HttpServletResponse headerMap.put("type", "JWT"); headerMap.put("alg", "RS256"); - ConvertUtil.objectToMapObj(sessionMap, session); + ConvertUtil.objectToMapObj(session, sessionMap); Environment environment= SpringContextHolder.getBean(Environment.class); Integer expireDays = !environment.containsProperty("session.expireDay") ? 15 : Integer.parseInt(environment.getProperty("session.expireDay")); @@ -123,7 +123,7 @@ public Map ajaxlogin(HttpServletRequest request, HttpServletResp headerMap.put("type", "JWT"); headerMap.put("alg", "RS256"); - ConvertUtil.objectToMapObj(sessionMap, session); + ConvertUtil.objectToMapObj(session, sessionMap); Integer expireDays = !environment.containsProperty("session.expireDay") ? 15 : Integer.parseInt(environment.getProperty("session.expireDay")); LocalDateTime dateTime = LocalDateTime.now(); diff --git a/example/config-example/src/main/java/com/robin/basis/controller/frameset/DataMappingContoller.java b/example/config-example/src/main/java/com/robin/basis/controller/frameset/DataMappingContoller.java index 753dad14..81e5960b 100644 --- a/example/config-example/src/main/java/com/robin/basis/controller/frameset/DataMappingContoller.java +++ b/example/config-example/src/main/java/com/robin/basis/controller/frameset/DataMappingContoller.java @@ -275,7 +275,7 @@ public Map genCode(HttpServletRequest request, HttpServletRespon String basePath = info.getProjBasePath(); String className = enmap.getJavaClass().substring(0, 1).toUpperCase() + enmap.getJavaClass().substring(1, enmap.getJavaClass().length()); Map entityMap = new HashMap<>(); - ConvertUtil.objectToMap(entityMap, enmap); + ConvertUtil.objectToMap(enmap, entityMap); entityMap.put("pkType", pktype); entityMap.put("upperName", className); if (!basePath.endsWith("/")) { @@ -436,7 +436,7 @@ public Map saveConfig(HttpServletRequest request, HttpServletRes Map retMap = new HashMap<>(); mapping = new EntityMapping(); try { - ConvertUtil.mapToObject(mapping, wrapRequest(request)); + ConvertUtil.mapToObject(wrapRequest(request), mapping); String javaClass = mapping.getJavaClass(); if (mapping.getSpringName() == null || mapping.getSpringName().isEmpty()) { mapping.setSpringName(javaClass.substring(0, 1).toLowerCase() + javaClass.substring(1)); diff --git a/example/config-example/src/main/java/com/robin/basis/controller/frameset/ProjectInfoContorller.java b/example/config-example/src/main/java/com/robin/basis/controller/frameset/ProjectInfoContorller.java index 75715600..11526d97 100644 --- a/example/config-example/src/main/java/com/robin/basis/controller/frameset/ProjectInfoContorller.java +++ b/example/config-example/src/main/java/com/robin/basis/controller/frameset/ProjectInfoContorller.java @@ -65,7 +65,7 @@ public Map saveProjectInfo(HttpServletRequest request, HttpServl Map retmap = new HashMap(); try { ProjectInfo projectInfo = new ProjectInfo(); - ConvertUtil.mapToObject(projectInfo, wrapRequest(request)); + ConvertUtil.mapToObject(wrapRequest(request), projectInfo); //DataSourceService DataSourceService = (DataSourceService) getBean("DataSourceService"); this.service.saveEntity(projectInfo); constructRetMap(retmap); @@ -139,7 +139,7 @@ public Map viewProjectInfo(HttpServletRequest request, HttpServl try { //DataSourceService DataSourceService = (DataSourceService) getBean("DataSourceService"); ProjectInfo projectInfo = this.service.getEntity(id); - ConvertUtil.objectToMapObj(retmap, projectInfo); + ConvertUtil.objectToMapObj(projectInfo, retmap); wrapSuccessMap(retmap, "OK"); } catch (Exception e) { retmap.put("success", false); @@ -176,7 +176,7 @@ public Map updateProjectInfo(HttpServletRequest request, HttpSer Map retmap = new HashMap<>(); try { ProjectInfo projectInfo = new ProjectInfo(); - ConvertUtil.mapToObject(projectInfo, wrapRequest(request)); + ConvertUtil.mapToObject(wrapRequest(request), projectInfo); this.service.updateEntity(projectInfo); retmap.put("success", true); } catch (Exception e) { diff --git a/example/config-example/src/main/java/com/robin/basis/controller/system/SysOrgController.java b/example/config-example/src/main/java/com/robin/basis/controller/system/SysOrgController.java index 7203efa0..b84c6a42 100644 --- a/example/config-example/src/main/java/com/robin/basis/controller/system/SysOrgController.java +++ b/example/config-example/src/main/java/com/robin/basis/controller/system/SysOrgController.java @@ -52,7 +52,7 @@ public Map saveOrg(HttpServletRequest request, HttpServletRespon String orgCode = ""; try { SysOrg vo = new SysOrg(); - ConvertUtil.mapToObject(vo, wrapRequest(request)); + ConvertUtil.mapToObject(wrapRequest(request), vo); PageQuery> query = new PageQuery(); query.setSelectParamId("GET_ORGMAXCODE"); service.queryBySelectId(query); diff --git a/example/config-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java b/example/config-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java index 8f86cdce..1f162560 100644 --- a/example/config-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java +++ b/example/config-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java @@ -105,8 +105,8 @@ public Map updateRole(HttpServletRequest request, Long id=Long.valueOf(request.getParameter("id")); SysResponsibility user=service.getEntity(id); SysRole tmpuser=new SysRole(); - ConvertUtil.mapToObject(tmpuser, map); - ConvertUtil.convertToModelForUpdate(user, tmpuser); + ConvertUtil.mapToObject(map, tmpuser); + ConvertUtil.convertToModelForUpdate(tmpuser, user); service.updateEntity(user); retmap.put("id", String.valueOf(id)); retmap.put("success", "true"); diff --git a/example/config-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java b/example/config-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java index 48295f20..cd0354f6 100644 --- a/example/config-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java +++ b/example/config-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java @@ -74,8 +74,8 @@ public Map updateRole(HttpServletRequest request, Long id=Long.valueOf(request.getParameter("id")); SysRole user=service.getEntity(id); SysRole tmpuser=new SysRole(); - ConvertUtil.mapToObject(tmpuser, map); - ConvertUtil.convertToModelForUpdate(user, tmpuser); + ConvertUtil.mapToObject(map, tmpuser); + ConvertUtil.convertToModelForUpdate(tmpuser, user); service.updateEntity(user); retmap.put("id", String.valueOf(id)); retmap.put("success", "true"); diff --git a/example/config-example/src/main/java/com/robin/basis/controller/user/LoginController.java b/example/config-example/src/main/java/com/robin/basis/controller/user/LoginController.java index c8eb55a6..1acae0cf 100644 --- a/example/config-example/src/main/java/com/robin/basis/controller/user/LoginController.java +++ b/example/config-example/src/main/java/com/robin/basis/controller/user/LoginController.java @@ -61,7 +61,7 @@ public Map login(HttpServletRequest request, HttpServletResponse headerMap.put("type", "JWT"); headerMap.put("alg", "RS256"); - ConvertUtil.objectToMapObj(sessionMap, session); + ConvertUtil.objectToMapObj(session, sessionMap); ResourceBundle bundle = ResourceBundle.getBundle("application"); Integer expireDays = !bundle.containsKey("session.expireDay") ? 15 : Integer.parseInt(bundle.getString("session.expireDay")); LocalDateTime dateTime = LocalDateTime.now(); diff --git a/hadooptool/pom.xml b/hadooptool/pom.xml index aaf80e90..44957c1c 100644 --- a/hadooptool/pom.xml +++ b/hadooptool/pom.xml @@ -23,7 +23,6 @@ 3.17.0 0.10.353 3.11.12 - 1.20.0 17.0.0 @@ -76,6 +75,10 @@ jdk.tools jdk.tools + + javax.servlet + servlet-api + @@ -808,7 +811,28 @@ 0.7.3 true - + + com.fasterxml + aalto-xml + 1.3.3 + true + + + org.apache.poi + poi + true + + + org.apache.poi + poi-ooxml + true + + + com.github.chrisvest + stormpot + 2.4.1 + true + @@ -863,6 +887,47 @@ UTF-8 + + maven-deploy-plugin + 2.8.2 + + + internal.repo::default::file://${project.build.directory}/mvn-repo + + + + + + + com.github.github + site-maven-plugin + 0.12 + + Maven artifacts for ${project.version} + true + + ${project.build.directory}/mvn-repo + + refs/heads/main + true + + **/* + + + mvn-repo + + robinhood-jim + github + + + + + site + + deploy + + + diff --git a/vueback/src/main/java/com/robin/basis/VueBackApplication.java b/vueback/src/main/java/com/robin/basis/VueBackApplication.java index 88a5fed0..d95b8d63 100644 --- a/vueback/src/main/java/com/robin/basis/VueBackApplication.java +++ b/vueback/src/main/java/com/robin/basis/VueBackApplication.java @@ -4,11 +4,12 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; @SpringBootApplication(exclude = {FreeMarkerAutoConfiguration.class}) @EnableTransactionManagement(proxyTargetClass = true) -//@ComponentScan("com.robin") +@ComponentScan("com.robin") @MapperScan("com.robin.basis.mapper") public class VueBackApplication { public static void main(String[] args) throws Exception{ diff --git a/vueback/src/main/java/com/robin/basis/config/DbConfig.java b/vueback/src/main/java/com/robin/basis/config/DbConfig.java index e6c43bf1..d13acd2c 100644 --- a/vueback/src/main/java/com/robin/basis/config/DbConfig.java +++ b/vueback/src/main/java/com/robin/basis/config/DbConfig.java @@ -2,7 +2,13 @@ import com.robin.core.base.dao.JdbcDao; +import com.robin.core.base.exception.MissingConfigException; import com.robin.core.base.spring.SpringContextHolder; +import com.robin.core.base.util.Const; +import com.robin.core.fileaccess.fs.AbstractFileSystemAccessor; +import com.robin.core.fileaccess.fs.FileSystemAccessorFactory; +import com.robin.core.fileaccess.fs.LocalFileSystemAccessor; +import com.robin.core.fileaccess.meta.DataCollectionMeta; import com.robin.core.query.util.QueryFactory; import com.robin.core.sql.util.BaseSqlGen; import com.robin.core.sql.util.MysqlSqlGen; @@ -20,10 +26,13 @@ import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Primary; import org.springframework.context.support.ResourceBundleMessageSource; +import org.springframework.core.env.Environment; import org.springframework.jdbc.support.lob.DefaultLobHandler; import org.springframework.jdbc.support.lob.LobHandler; +import javax.annotation.Resource; import javax.sql.DataSource; +import java.io.IOException; @Configuration public class DbConfig { @@ -31,6 +40,8 @@ public class DbConfig { @Value("${project.queryConfigPath}") private String queryConfigPath; + @Resource + private Environment environment; @Bean(name = "dataSource") @@ -94,7 +105,23 @@ public SpringContextHolder getHolder(){ return new SpringContextHolder(); } - + @Bean + public AbstractFileSystemAccessor getAccessor(){ + String ossType= Const.FILESYSTEM.LOCAL.getValue(); + if(environment.containsProperty("oss.type")){ + ossType=environment.getProperty("oss.type"); + } + if(Const.FILESYSTEM.LOCAL.getValue().equals(ossType)){ + return LocalFileSystemAccessor.getInstance(); + }else{ + try { + DataCollectionMeta meta = DataCollectionMeta.fromYamlConfig("classpath:" + ossType + ".yaml"); + return FileSystemAccessorFactory.getResourceAccessorByType(ossType,meta); + }catch (IOException ex){ + throw new MissingConfigException("oss type config err "+ex.getMessage()); + } + } + } diff --git a/vueback/src/main/java/com/robin/basis/controller/system/SysOrgController.java b/vueback/src/main/java/com/robin/basis/controller/system/SysOrgController.java index b8fde3aa..8baac759 100644 --- a/vueback/src/main/java/com/robin/basis/controller/system/SysOrgController.java +++ b/vueback/src/main/java/com/robin/basis/controller/system/SysOrgController.java @@ -61,7 +61,7 @@ public Map saveOrg(HttpServletRequest request, HttpServletRespon String orgCode = ""; try { SysOrg vo = new SysOrg(); - ConvertUtil.mapToObject(vo, wrapRequest(request)); + ConvertUtil.mapToObject(wrapRequest(request), vo); PageQuery> query = new PageQuery(); query.setSelectParamId("GET_ORGMAXCODE"); service.queryBySelectId(query); diff --git a/vueback/src/main/java/com/robin/basis/controller/system/SysUserCrudController.java b/vueback/src/main/java/com/robin/basis/controller/system/SysUserCrudController.java index 91323b3c..72584f33 100644 --- a/vueback/src/main/java/com/robin/basis/controller/system/SysUserCrudController.java +++ b/vueback/src/main/java/com/robin/basis/controller/system/SysUserCrudController.java @@ -15,14 +15,12 @@ */ package com.robin.basis.controller.system; -import com.baomidou.mybatisplus.core.metadata.IPage; import com.robin.basis.dto.SysUserDTO; import com.robin.basis.mapper.SysUserMapper; import com.robin.basis.model.user.SysUser; import com.robin.basis.service.system.ISysOrgService; import com.robin.basis.service.system.ISysResourceService; import com.robin.basis.service.system.ISysUserService; -import com.robin.basis.utils.WebUtils; import com.robin.core.base.exception.ServiceException; import com.robin.core.base.exception.WebException; import com.robin.core.base.util.Const; @@ -146,7 +144,7 @@ public Map activeUser(@PathVariable Long id) { if (user.getUserPassword() == null || user.getUserPassword().isEmpty()) { throw new ServiceException(messageSource.getMessage("message.passwordEmpty", null, Locale.getDefault())); } else { - user.setUserStatus(Const.VALID); + user.setStatus(Const.VALID); this.service.updateModelById(user); constructRetMap(retMap); } @@ -163,7 +161,7 @@ public Map deactiveUser(@PathVariable Long id){ if (user.getUserPassword() == null || user.getUserPassword().isEmpty()) { throw new ServiceException(messageSource.getMessage("message.passwordEmpty", null, Locale.getDefault())); } else { - user.setUserStatus(Const.INVALID); + user.setStatus(Const.INVALID); this.service.updateModelById(user); constructRetMap(retMap); } diff --git a/vueback/src/main/java/com/robin/basis/controller/user/LoginController.java b/vueback/src/main/java/com/robin/basis/controller/user/LoginController.java index 00a3e021..a30bb322 100644 --- a/vueback/src/main/java/com/robin/basis/controller/user/LoginController.java +++ b/vueback/src/main/java/com/robin/basis/controller/user/LoginController.java @@ -102,7 +102,7 @@ public Map login(HttpServletRequest request, HttpServletResponse headerMap.put("type", "JWT"); headerMap.put("alg", "RS256"); - ConvertUtil.objectToMapObj(sessionMap, loginUser); + ConvertUtil.objectToMapObj(loginUser, sessionMap); Integer expireDays = !environment.containsProperty("session.expireDay") ? 15 : Integer.parseInt(environment.getProperty("session.expireDay")); LocalDateTime dateTime = LocalDateTime.now(); diff --git a/vueback/src/main/java/com/robin/basis/dto/RouterDTO.java b/vueback/src/main/java/com/robin/basis/dto/RouterDTO.java index e7924072..79a7cda1 100644 --- a/vueback/src/main/java/com/robin/basis/dto/RouterDTO.java +++ b/vueback/src/main/java/com/robin/basis/dto/RouterDTO.java @@ -39,7 +39,7 @@ public static RouterDTO fromVO(SysResource source){ public static RouterDTO fromMap(Map map){ RouterDTO dto=new RouterDTO(); try{ - ConvertUtil.mapToObject(dto,map); + ConvertUtil.mapToObject(map, dto); dto.setAssignType(map.get("assignType").toString()); dto.getMeta().setTitle(map.get("name").toString()); dto.setPath(map.get("routerPath").toString()); diff --git a/vueback/src/main/java/com/robin/basis/model/user/SysUser.java b/vueback/src/main/java/com/robin/basis/model/user/SysUser.java index fc28a64f..bade516f 100644 --- a/vueback/src/main/java/com/robin/basis/model/user/SysUser.java +++ b/vueback/src/main/java/com/robin/basis/model/user/SysUser.java @@ -19,13 +19,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.robin.basis.model.AbstractMybatisModel; -import com.robin.core.base.annotation.MappingEntity; -import com.robin.core.base.annotation.MappingField; -import com.robin.core.base.model.BaseObject; import lombok.Data; -import java.time.LocalDateTime; - @Data @TableName("t_sys_user_info") @@ -34,7 +29,7 @@ public class SysUser extends AbstractMybatisModel { private Long id; private Long orgId; private String accountType; - private String userStatus; + private String status; private String userAccount; private String userName; private String remark; diff --git a/vueback/src/main/java/com/robin/basis/sercurity/LoginDetailsService.java b/vueback/src/main/java/com/robin/basis/sercurity/LoginDetailsService.java index 983ea298..86ff24cb 100644 --- a/vueback/src/main/java/com/robin/basis/sercurity/LoginDetailsService.java +++ b/vueback/src/main/java/com/robin/basis/sercurity/LoginDetailsService.java @@ -35,10 +35,10 @@ public class LoginDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException { SysUser user=new SysUser(); - user.setUserStatus(Const.VALID); + user.setStatus(Const.VALID); user.setUserAccount(userName); LambdaQueryWrapper queryWrapper=new QueryWrapper().lambda(); - queryWrapper.eq(SysUser::getUserStatus,Const.VALID); + queryWrapper.eq(SysUser::getStatus,Const.VALID); queryWrapper.eq(SysUser::getUserAccount,userName); List users=sysUserService.list(queryWrapper); SysLoginUser.Builder builder=SysLoginUser.Builder.newBuilder(); @@ -74,7 +74,9 @@ public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundEx Map readMap=new HashMap<>(); pageQuery.getRecordSet().forEach(f->{ if(!Const.RESOURCE_ASSIGN_DENIED.equals(f.get("assignType").toString()) && !readMap.containsKey((Long)f.get("id"))){ - permissions.add(f.get("permission").toString()); + if(!ObjectUtils.isEmpty(f.get("permission"))) { + permissions.add(f.get("permission").toString()); + } } readMap.put((Long)f.get("id"),1); }); diff --git a/vueback/src/main/java/com/robin/basis/sercurity/SysLoginUser.java b/vueback/src/main/java/com/robin/basis/sercurity/SysLoginUser.java index 85d0b079..b4fead2d 100644 --- a/vueback/src/main/java/com/robin/basis/sercurity/SysLoginUser.java +++ b/vueback/src/main/java/com/robin/basis/sercurity/SysLoginUser.java @@ -75,7 +75,7 @@ public Builder withSysUser(SysUser user){ loginUser.setId(user.getId()); loginUser.setUserName(user.getUserAccount()); loginUser.setDisplayName(user.getUserName()); - loginUser.setUserStatus(user.getUserStatus()); + loginUser.setUserStatus(user.getStatus()); loginUser.setPassword(user.getUserPassword()); loginUser.setAvatar(user.getAvatar()); loginUser.setEmail(user.getEmail()); diff --git a/vueback/src/main/java/com/robin/basis/service/system/impl/SysUserServiceImpl.java b/vueback/src/main/java/com/robin/basis/service/system/impl/SysUserServiceImpl.java index 588eecc8..87fe00af 100644 --- a/vueback/src/main/java/com/robin/basis/service/system/impl/SysUserServiceImpl.java +++ b/vueback/src/main/java/com/robin/basis/service/system/impl/SysUserServiceImpl.java @@ -55,7 +55,7 @@ public Map listUser(SysUserDTO queryDTO){ subIds=sysOrgService.getSubIdByParentOrgId(queryDTO.getOrgId()); } IPage page = this.lambdaQuery() - .eq(ObjectUtil.isNotNull(queryDTO.getStatus()), SysUser::getUserStatus, queryDTO.getStatus()) + .eq(ObjectUtil.isNotNull(queryDTO.getStatus()), SysUser::getStatus, queryDTO.getStatus()) .like(StrUtil.isNotBlank(queryDTO.getPhone()), SysUser::getPhoneNum, queryDTO.getPhone()) .in(ObjectUtil.isNotEmpty(queryDTO.getOrgId()),SysUser::getOrgId,subIds) .and(StrUtil.isNotBlank(queryDTO.getName()), wrapper -> wrapper.like(SysUser::getUserAccount, queryDTO.getName()) diff --git a/vueback/src/main/java/com/robin/basis/utils/WebUtils.java b/vueback/src/main/java/com/robin/basis/utils/WebUtils.java index f5fae083..d7a163c7 100644 --- a/vueback/src/main/java/com/robin/basis/utils/WebUtils.java +++ b/vueback/src/main/java/com/robin/basis/utils/WebUtils.java @@ -4,10 +4,17 @@ import com.robin.core.base.exception.ServiceException; import com.robin.core.base.exception.WebException; import com.robin.core.base.service.IMybatisBaseService; +import com.robin.core.base.util.FileUtils; +import com.robin.core.base.util.IOUtils; import com.robin.core.base.util.MessageUtils; +import com.robin.core.fileaccess.fs.AbstractFileSystemAccessor; import com.robin.core.query.util.PageQuery; +import org.springframework.lang.NonNull; import org.springframework.util.ObjectUtils; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -59,4 +66,14 @@ else if(ex instanceof WebException){ retMap.put(COL_MESSAGE, ex.getMessage()); } } + public static void returnOSSResource(HttpServletResponse response, @NonNull AbstractFileSystemAccessor accessor, String ossPath) throws IOException { + FileUtils.FileContent content= FileUtils.parseFile(ossPath); + try(InputStream inputStream=accessor.getInResourceByStream(ossPath)) { + response.setHeader("content-type", content.getContentType()); + IOUtils.copyBytes(inputStream, response.getOutputStream()); + }catch (IOException ex){ + throw ex; + } + } + } diff --git a/vueback/src/main/resources/application.yml b/vueback/src/main/resources/application.yml index 09b08530..7621d27e 100644 --- a/vueback/src/main/resources/application.yml +++ b/vueback/src/main/resources/application.yml @@ -17,7 +17,7 @@ spring: password: vue logging: level: - root: DEBUG + root: INFO pagehelper: helperDialect: mysql @@ -43,5 +43,9 @@ project: jwt: salt: 123456 login: - ignoreUrls: /index,/login,/logout,/captchaImage - ignoreResources: gif,bmp,png,jpg,js,flash,css,swf,flv,metaget \ No newline at end of file + ignoreUrls: /index,/login,/logout,/captchaImage,/ossres + ignoreResources: gif,bmp,png,jpg,js,flash,css,swf,flv,metaget + +oss: + type: file + startPath: file:///f:/tmp/ \ No newline at end of file diff --git a/vueback/src/main/resources/logback-spring.xml b/vueback/src/main/resources/logback-spring.xml index 724e771e..758390c8 100644 --- a/vueback/src/main/resources/logback-spring.xml +++ b/vueback/src/main/resources/logback-spring.xml @@ -1,7 +1,7 @@ - - + + @@ -57,7 +57,7 @@ - + diff --git a/web/src/main/java/com/robin/core/web/controller/AbstractAutoController.java b/web/src/main/java/com/robin/core/web/controller/AbstractAutoController.java index 64016ee5..75c9ced3 100644 --- a/web/src/main/java/com/robin/core/web/controller/AbstractAutoController.java +++ b/web/src/main/java/com/robin/core/web/controller/AbstractAutoController.java @@ -150,7 +150,7 @@ protected final Map doSave(@RequestBody Map reqM Map retMap = new HashMap<>(); try { O vo = potype.newInstance(); - ConvertUtil.mapToBaseObject(vo, reqMap); + ConvertUtil.mapToBaseObject(reqMap, vo); P p = service.getSaveFunction().apply(vo); retMap.put(WebConstant.DATA, p); constructRetMap(retMap); @@ -178,7 +178,7 @@ protected final Map doUpdate(@RequestBody Map re Map retmap = new HashMap<>(); try { O vo = potype.newInstance(); - ConvertUtil.mapToBaseObject(vo, reqMap); + ConvertUtil.mapToBaseObject(reqMap, vo); this.service.updateEntity(vo); retmap.put(WebConstant.SUCCESS, true); } catch (Exception e) { @@ -207,7 +207,7 @@ protected Map doPage(@RequestBody Map paramMap){ PageQuery query=new PageQuery<>(); try{ if(paramMap.containsKey("_pageQuery")) { - ConvertUtil.mapToObject(query, (Map)paramMap.get("_pageQuery")); + ConvertUtil.mapToObject((Map)paramMap.get("_pageQuery"), query); } FilterCondition condition=getCondition(paramMap); service.queryByCondition(condition,query); @@ -272,7 +272,7 @@ protected P[] parseId(String ids) throws ServiceException { protected PageQuery> wrapPageQueryReq(Map reqMap) { PageQuery> query = new PageQuery<>(); try { - ConvertUtil.mapToObject(query, reqMap); + ConvertUtil.mapToObject(reqMap, query); } catch (Exception ex) { ex.printStackTrace(); } diff --git a/web/src/main/java/com/robin/core/web/controller/AbstractController.java b/web/src/main/java/com/robin/core/web/controller/AbstractController.java index 17a2f333..e0dbc9a8 100644 --- a/web/src/main/java/com/robin/core/web/controller/AbstractController.java +++ b/web/src/main/java/com/robin/core/web/controller/AbstractController.java @@ -60,7 +60,7 @@ protected List> convertObjToMapList(List orglist) for (Object object : orglist) { Map map = new HashMap<>(); - ConvertUtil.objectToMap(map, object); + ConvertUtil.objectToMap(object, map); list.add(map); } } @@ -331,7 +331,7 @@ protected PageQuery wrapPageQuery(Map paramMap){ PageQuery query = new PageQuery(); try { - ConvertUtil.mapToObject(query, paramMap); + ConvertUtil.mapToObject(paramMap, query); } catch (Exception ex) { @@ -354,7 +354,7 @@ protected PageQuery> wrapPageQuery(HttpServletRequest request } try { - ConvertUtil.mapToObject(query, tmpmap); + ConvertUtil.mapToObject(tmpmap, query); if(!ObjectUtils.isEmpty(tmpmap.get("pageNum"))){ query.setCurrentPage(Integer.parseInt(tmpmap.get("pageNum").toString())); } diff --git a/web/src/main/java/com/robin/core/web/controller/AbstractCrudController.java b/web/src/main/java/com/robin/core/web/controller/AbstractCrudController.java index 57df8b31..899e3a83 100644 --- a/web/src/main/java/com/robin/core/web/controller/AbstractCrudController.java +++ b/web/src/main/java/com/robin/core/web/controller/AbstractCrudController.java @@ -91,7 +91,7 @@ protected Map doSave(Map paramMap) { Map retMap = new HashMap<>(); try { O object=this.objectType.newInstance(); - ConvertUtil.setDateFormat(ConvertUtil.ymdSepformatter); + ConvertUtil.setDateTimeFormat(ConvertUtil.ymdSepformatter); ConvertUtil.convertToModel(object,paramMap); P pk=this.service.saveEntity(object); constructRetMap(retMap); @@ -136,7 +136,7 @@ protected Map doUpdate(Map paramMap,P id) { Map retMap = new HashMap<>(); try { O originObj= this.objectType.newInstance(); - ConvertUtil.setDateFormat(ConvertUtil.ymdSepformatter); + ConvertUtil.setDateTimeFormat(ConvertUtil.ymdSepformatter); ConvertUtil.convertToModel(originObj,paramMap); updateWithOrigin(id, retMap, originObj); } catch (Exception ex) { @@ -151,8 +151,8 @@ protected Map doUpdate(Map paramMap,P id) { private void updateWithOrigin(P id, Map retMap, O originObj) throws WebException { try { O updateObj = service.getEntity(id); - ConvertUtil.setDateFormat(ConvertUtil.ymdSepformatter); - ConvertUtil.convertToModelForUpdate(updateObj, originObj); + ConvertUtil.setDateTimeFormat(ConvertUtil.ymdSepformatter); + ConvertUtil.convertToModelForUpdate(originObj, updateObj); service.updateEntity(updateObj); doAfterUpdate(updateObj, retMap); constructRetMap(retMap); diff --git a/web/src/main/java/com/robin/core/web/controller/AbstractCrudDhtmlxController.java b/web/src/main/java/com/robin/core/web/controller/AbstractCrudDhtmlxController.java index f71c111c..e9e9a878 100644 --- a/web/src/main/java/com/robin/core/web/controller/AbstractCrudDhtmlxController.java +++ b/web/src/main/java/com/robin/core/web/controller/AbstractCrudDhtmlxController.java @@ -109,7 +109,7 @@ private Map wrapDhtmlxGridOutputWithCheck(List returnCodeSetDhtmlxCombo(String codeSetNo, boolean allowNulls) { diff --git a/web/src/main/java/com/robin/core/web/controller/AbstractMyBatisController.java b/web/src/main/java/com/robin/core/web/controller/AbstractMyBatisController.java index 09b2cda4..3bc4a8f4 100644 --- a/web/src/main/java/com/robin/core/web/controller/AbstractMyBatisController.java +++ b/web/src/main/java/com/robin/core/web/controller/AbstractMyBatisController.java @@ -15,7 +15,6 @@ import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; -import javax.servlet.http.HttpServletRequest; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; @@ -72,7 +71,7 @@ protected boolean save(Object obj) throws WebException { return service.save((T)obj); }else{ T voObj = BeanUtils.instantiateClass(voType); - ConvertUtil.convertToTarget(voObj,obj); + ConvertUtil.convertToTarget(obj, voObj); return service.save(voObj); } }catch (Exception ex){ @@ -86,7 +85,7 @@ protected boolean update(Object obj) throws WebException{ return service.updateById((T) obj); }else{ T voObj = BeanUtils.instantiateClass(voType); - ConvertUtil.convertToTarget(voObj,obj); + ConvertUtil.convertToTarget(obj, voObj); return service.updateById(voObj); } @@ -119,11 +118,11 @@ protected IPage queryPage(PageDTO dto, Class targetClazz) throws WebE try { if (targetClazz.getInterfaces().length>0 && targetClazz.getInterfaces()[0].isAssignableFrom(Map.class)) { Map valueMap = new HashMap<>(); - ConvertUtil.objectToMapObj(valueMap, f); + ConvertUtil.objectToMapObj(f, valueMap); retList.add((D)valueMap); } else { D obj = BeanUtils.instantiateClass(targetClazz); - ConvertUtil.convertToTarget(obj, f); + ConvertUtil.convertToTarget(f, obj); retList.add(obj); } }catch (Exception ex){ @@ -142,7 +141,7 @@ protected Map doSave(Map paramMap, Consumer co Map retMap = new HashMap<>(); try { T object=this.voType.newInstance(); - ConvertUtil.setDateFormat(ConvertUtil.ymdSepformatter); + ConvertUtil.setDateTimeFormat(ConvertUtil.ymdSepformatter); ConvertUtil.convertToModel(object,paramMap); if(consumer!=null){ consumer.accept(object); @@ -200,7 +199,7 @@ protected Map doUpdate(Map paramMap,P id) { Map retMap = new HashMap<>(); try { T originObj= this.voType.getDeclaredConstructor().newInstance(); - ConvertUtil.setDateFormat(ConvertUtil.ymdSepformatter); + ConvertUtil.setDateTimeFormat(ConvertUtil.ymdSepformatter); ConvertUtil.convertToModel(originObj,paramMap); updateWithOrigin(id, retMap, originObj); } catch (Exception ex) { @@ -239,8 +238,8 @@ protected Map doDeleteLogic(List

ids){ private void updateWithOrigin(P id, Map retMap, T originObj) throws WebException { try { T updateObj = service.getById(id); - ConvertUtil.setDateFormat(ConvertUtil.ymdSepformatter); - ConvertUtil.convertToModelForUpdate(updateObj, originObj); + ConvertUtil.setDateTimeFormat(ConvertUtil.ymdSepformatter); + ConvertUtil.convertToModelForUpdate(originObj, updateObj); service.updateById(updateObj); constructRetMap(retMap); }catch (Exception ex){ From a5962fe1fe1bfff665f63a75aac8ce1f2f643cec Mon Sep 17 00:00:00 2001 From: robinhoodjim Date: Tue, 16 Sep 2025 10:50:34 +0800 Subject: [PATCH 2/7] fix test problem --- .../iterator/AbstractFileIterator.java | 19 ++ .../iterator/IResourceIterator.java | 1 + .../iterator/TextFileIteratorFactory.java | 4 +- .../fileaccess/writer/AbstractFileWriter.java | 7 +- .../writer/AbstractResourceWriter.java | 13 +- .../writer/TextFileWriterFactory.java | 2 +- .../java/com/robin/core/base/util/Const.java | 19 ++ .../com/robin/core/base/util/FileUtils.java | 6 +- .../core/compress/util/CompressEncoder.java | 2 +- .../robin/core/convert/util/ConvertUtil.java | 40 +-- .../iterator/ArrowFileIterator.java | 3 + .../fileaccess/iterator/AvroFileIterator.java | 25 +- .../fileaccess/iterator/OrcFileIterator.java | 203 ++------------- .../iterator/ParquetFileIterator.java | 15 +- .../iterator/ParquetStreamIterator.java | 10 +- .../iterator/ProtoBufFileIterator.java | 3 +- .../fileaccess/util/CustomParquetReader.java | 2 +- .../fileaccess/util/CustomRowReadSupport.java | 9 +- .../robin/comm/fileaccess/util/OrcUtil.java | 237 +++++++++++++++++- .../fileaccess/writer/ArrowFileWriter.java | 29 ++- .../fileaccess/writer/AvroFileWriter.java | 10 +- .../comm/fileaccess/writer/OrcFileWriter.java | 16 +- .../fileaccess/writer/ParquetFileWriter.java | 18 +- .../fileaccess/writer/ProtoBufFileWriter.java | 5 + .../java/com/robin/dfs/minio/MinioUtils.java | 6 +- .../meta/contorller/SchemaController.java | 16 +- .../com/robin/meta/mvc/config/DbConfig.java | 7 +- .../resource/GlobalResourceService.java | 69 +++-- .../controller/system/EmployeeController.java | 81 +++++- .../system/SysUserCrudController.java | 4 +- .../controller/user/LoginController.java | 3 +- .../java/com/robin/basis/dto/EmployeeDTO.java | 1 + .../java/com/robin/basis/dto/RouterDTO.java | 2 +- .../robin/basis/mapper/SysResourceMapper.java | 2 +- .../basis/sercurity/LoginDetailsService.java | 3 - .../service/biz/impl/CustomerServiceImpl.java | 1 + .../service/system/IEmployeeService.java | 2 +- .../system/impl/EmployeeServiceImpl.java | 24 +- .../system/impl/SysResourceServiceImpl.java | 18 +- .../java/com/robin/basis/utils/WebUtils.java | 4 +- .../com/robin/config/TransactionConfig.java | 5 +- .../{logback.xml => logback-spring.xml} | 2 +- 42 files changed, 599 insertions(+), 349 deletions(-) rename mybatisproj/src/main/resources/{logback.xml => logback-spring.xml} (97%) diff --git a/common/src/main/java/com/robin/core/fileaccess/iterator/AbstractFileIterator.java b/common/src/main/java/com/robin/core/fileaccess/iterator/AbstractFileIterator.java index b921b4ff..2d8ce6d6 100644 --- a/common/src/main/java/com/robin/core/fileaccess/iterator/AbstractFileIterator.java +++ b/common/src/main/java/com/robin/core/fileaccess/iterator/AbstractFileIterator.java @@ -30,6 +30,7 @@ import com.robin.core.fileaccess.util.PolandNotationUtil; import com.robin.core.fileaccess.util.ResourceUtil; import com.robin.core.fileaccess.util.SqlContentResolver; +import org.apache.avro.Schema; import org.apache.calcite.config.Lex; import org.apache.calcite.sql.*; import org.apache.commons.lang3.StringUtils; @@ -73,6 +74,7 @@ public abstract class AbstractFileIterator implements IResourceIterator { protected SqlSegment segment; protected Iterator>> groupIter; + protected Schema avroSchema; public AbstractFileIterator() { @@ -328,4 +330,21 @@ private void appendByType(StringBuilder builder,Object value){ builder.append(value).append("|"); } } + + @Override + public void remove() { + hasNext(); + } + + public Schema getSchema() { + return avroSchema; + } + + public Map getColumnMap() { + return columnMap; + } + + public SqlSegment getSegment() { + return segment; + } } diff --git a/common/src/main/java/com/robin/core/fileaccess/iterator/IResourceIterator.java b/common/src/main/java/com/robin/core/fileaccess/iterator/IResourceIterator.java index a274deb9..9e03b85e 100644 --- a/common/src/main/java/com/robin/core/fileaccess/iterator/IResourceIterator.java +++ b/common/src/main/java/com/robin/core/fileaccess/iterator/IResourceIterator.java @@ -1,5 +1,6 @@ package com.robin.core.fileaccess.iterator; import com.robin.core.fileaccess.fs.AbstractFileSystemAccessor; +import org.apache.avro.Schema; import java.io.BufferedReader; import java.io.Closeable; diff --git a/common/src/main/java/com/robin/core/fileaccess/iterator/TextFileIteratorFactory.java b/common/src/main/java/com/robin/core/fileaccess/iterator/TextFileIteratorFactory.java index a36f1ab7..aa33e8fd 100644 --- a/common/src/main/java/com/robin/core/fileaccess/iterator/TextFileIteratorFactory.java +++ b/common/src/main/java/com/robin/core/fileaccess/iterator/TextFileIteratorFactory.java @@ -116,7 +116,7 @@ public static IResourceIterator getProcessIteratorByType(DataCollectionMeta colm public static IResourceIterator getProcessIteratorByPath(DataCollectionMeta colmeta,InputStream in) throws IOException{ FileUtils.FileContent content=FileUtils.parseFile(colmeta.getPath()); colmeta.setContent(content); - String fileFormat=content.getFileFormat(); + String fileFormat=content.getFileFormat().getValue(); if(StringUtils.isEmpty(colmeta.getFileFormat())){ colmeta.setFileFormat(fileFormat); } @@ -170,7 +170,7 @@ private static String getFileType(DataCollectionMeta colmeta) { if(ObjectUtils.isEmpty(fileType)){ FileUtils.FileContent content=FileUtils.parseFile(colmeta.getPath()); colmeta.setContent(content); - fileType=content.getFileFormat(); + fileType=content.getFileFormat().getValue(); } return fileType; } diff --git a/common/src/main/java/com/robin/core/fileaccess/writer/AbstractFileWriter.java b/common/src/main/java/com/robin/core/fileaccess/writer/AbstractFileWriter.java index 5c756c13..c473baf9 100644 --- a/common/src/main/java/com/robin/core/fileaccess/writer/AbstractFileWriter.java +++ b/common/src/main/java/com/robin/core/fileaccess/writer/AbstractFileWriter.java @@ -49,6 +49,7 @@ public abstract class AbstractFileWriter implements IResourceWriter { protected AbstractFileSystemAccessor accessUtil; protected String identifier; protected boolean useBufferedWriter=false; + protected boolean useRawOutputStream=false; public AbstractFileWriter(){ @@ -105,7 +106,11 @@ public void initalize() throws IOException{ public void beginWrite() throws IOException{ if(out==null){ checkAccessUtil(colmeta.getPath()); - out = accessUtil.getOutResourceByStream(ResourceUtil.getProcessPath(colmeta.getPath())); + if(!useRawOutputStream) { + out = accessUtil.getOutResourceByStream(ResourceUtil.getProcessPath(colmeta.getPath())); + }else{ + out = accessUtil.getRawOutputStream(ResourceUtil.getProcessPath(colmeta.getPath())); + } if(useBufferedWriter) { writer = new BufferedWriter(new OutputStreamWriter(out)); } diff --git a/common/src/main/java/com/robin/core/fileaccess/writer/AbstractResourceWriter.java b/common/src/main/java/com/robin/core/fileaccess/writer/AbstractResourceWriter.java index 2e0bddd6..8b580194 100644 --- a/common/src/main/java/com/robin/core/fileaccess/writer/AbstractResourceWriter.java +++ b/common/src/main/java/com/robin/core/fileaccess/writer/AbstractResourceWriter.java @@ -16,18 +16,7 @@ import java.io.IOException; import java.util.*; -/** - *

Project: frame

- *

- *

Description:com.robin.core.fileaccess.writer

- *

- *

Copyright: Copyright (c) 2018 create at 2018年10月31日

- *

- *

Company: zhcx_DEV

- * - * @author robinjim - * @version 1.0 - */ + public abstract class AbstractResourceWriter implements IResourceWriter{ protected DataCollectionMeta colmeta; diff --git a/common/src/main/java/com/robin/core/fileaccess/writer/TextFileWriterFactory.java b/common/src/main/java/com/robin/core/fileaccess/writer/TextFileWriterFactory.java index 69d41728..899b3b13 100644 --- a/common/src/main/java/com/robin/core/fileaccess/writer/TextFileWriterFactory.java +++ b/common/src/main/java/com/robin/core/fileaccess/writer/TextFileWriterFactory.java @@ -113,7 +113,7 @@ private static String getFileSuffix(DataCollectionMeta colmeta) { if(ObjectUtils.isEmpty(fileSuffix)){ FileUtils.FileContent content=FileUtils.parseFile(colmeta.getPath()); colmeta.setContent(content); - fileSuffix=content.getFileFormat(); + fileSuffix=content.getFileFormat().getValue(); } return fileSuffix; } diff --git a/core/src/main/java/com/robin/core/base/util/Const.java b/core/src/main/java/com/robin/core/base/util/Const.java index 48ccc915..de421324 100644 --- a/core/src/main/java/com/robin/core/base/util/Const.java +++ b/core/src/main/java/com/robin/core/base/util/Const.java @@ -392,6 +392,8 @@ public String getValueStr(){ public enum FILESYSTEM{ LOCAL("file"), VFS("vfs"), + FTP("ftp"), + SFTP("sftp"), HDFS("hdfs"), S3("s3"), ALIYUN("oss"), @@ -407,6 +409,14 @@ public enum FILESYSTEM{ public String getValue(){ return value; } + public static FILESYSTEM forName(String name){ + for(FILESYSTEM s:FILESYSTEM.values()){ + if(s.getValue().equalsIgnoreCase(name)){ + return s; + } + } + return null; + } } public enum ACCESSRESOURCE{ JDBC("jdbc"), @@ -448,6 +458,15 @@ public enum FILEFORMATSTR { public String getValue(){ return value; } + + public static FILEFORMATSTR forName(String name){ + for(FILEFORMATSTR s:FILEFORMATSTR.values()){ + if(s.getValue().equalsIgnoreCase(name)){ + return s; + } + } + return null; + } } //定时任务触发时间点 diff --git a/core/src/main/java/com/robin/core/base/util/FileUtils.java b/core/src/main/java/com/robin/core/base/util/FileUtils.java index 1c37ced3..76d3f41f 100644 --- a/core/src/main/java/com/robin/core/base/util/FileUtils.java +++ b/core/src/main/java/com/robin/core/base/util/FileUtils.java @@ -81,7 +81,7 @@ public static FileContent parseFile(String path){ } private static void parseFileFormat(FileContent content,String suffix,List sepParts){ if(ObjectUtils.isEmpty(content.getFileFormat())){ - content.setFileFormat(suffix); + content.setFileFormat(Const.FILEFORMATSTR.forName(suffix.toLowerCase())); if(ObjectUtils.isEmpty(content.getContentType())){ if(contentTypeMap.containsKey(suffix.toLowerCase())){ content.setContentType(contentTypeMap.get(suffix.toLowerCase())); @@ -107,7 +107,7 @@ public static String getContentType(DataCollectionMeta meta){ String fileType=meta.getFileFormat(); if(ObjectUtils.isEmpty(fileType)){ FileUtils.FileContent content=FileUtils.parseFile(meta.getPath()); - fileType=content.getFileFormat(); + fileType=content.getFileFormat().getValue(); } return getContentType(fileType); } @@ -193,7 +193,7 @@ public static String getWorkingPath(DataCollectionMeta meta){ public static class FileContent{ private String fileName; private String filePath; - private String fileFormat; + private Const.FILEFORMATSTR fileFormat; private String contentType; private Const.CompressType compressType= Const.CompressType.COMPRESS_TYPE_NONE; } diff --git a/core/src/main/java/com/robin/core/compress/util/CompressEncoder.java b/core/src/main/java/com/robin/core/compress/util/CompressEncoder.java index 0e4e76d0..2ac6651e 100644 --- a/core/src/main/java/com/robin/core/compress/util/CompressEncoder.java +++ b/core/src/main/java/com/robin/core/compress/util/CompressEncoder.java @@ -54,7 +54,7 @@ public static OutputStream getOutputStreamByCompressType(String path, OutputStre break; case COMPRESS_TYPE_ZIP: ZipOutputStream stream1 = new ZipOutputStream(rawstream); - stream1.putNextEntry(new ZipEntry(content.getFileName() + "." + content.getFileFormat())); + stream1.putNextEntry(new ZipEntry(content.getFileName() + "." + content.getFileFormat().getValue())); outputStream = stream1; break; case COMPRESS_TYPE_LZ4: diff --git a/core/src/main/java/com/robin/core/convert/util/ConvertUtil.java b/core/src/main/java/com/robin/core/convert/util/ConvertUtil.java index 0e0efc1b..20b51062 100644 --- a/core/src/main/java/com/robin/core/convert/util/ConvertUtil.java +++ b/core/src/main/java/com/robin/core/convert/util/ConvertUtil.java @@ -284,7 +284,7 @@ public static void convertToModel(BaseObject target, Map src, St if (ObjectUtils.isEmpty(ignoreColumnList) || !ignoreColumnList.contains(field)) { MethodHandle setMethod = map.get(field); if (setMethod != null) { - setBaseObjectValue(target, entry.getValue(), field, setMethod); + setBaseObjectValue(target, entry.getValue(), field, setMethod,ignoreColumnList); } } } @@ -293,14 +293,16 @@ public static void convertToModel(BaseObject target, Map src, St } } - private static void setBaseObjectValue(BaseObject target, Object value, String field, MethodHandle setMethod) throws Throwable { - if (!ObjectUtils.isEmpty(value)) { - target.addDirtyColumn(field); - Class type = setMethod.type().parameterType(1); - Object retValue = parseParameter(type, value); - setMethod.bindTo(target).invoke(retValue); - } else if (target.getDirtyColumn().contains(field)) { - setMethod.bindTo(target).invoke(null); + private static void setBaseObjectValue(BaseObject target, Object value, String field, MethodHandle setMethod,List ignoreColumns) throws Throwable { + if(canFill(ignoreColumns,field)) { + if (!ObjectUtils.isEmpty(value)) { + target.addDirtyColumn(field); + Class type = setMethod.type().parameterType(1); + Object retValue = parseParameter(type, value); + setMethod.bindTo(target).invoke(retValue); + } else if (target.getDirtyColumn().contains(field)) { + setMethod.bindTo(target).invoke(null); + } } } @@ -331,13 +333,11 @@ public static void convertToTarget(Object source, Object target, String... ignor MethodHandle setMethod = targetMethodMap.get(field); if (setMethod != null) { if (target instanceof BaseObject) { - setBaseObjectValue((BaseObject) target, entry.getValue(), field, setMethod); - } else { - if (targetMethodMap.containsKey(field) && canFill(ignoreColumnList,field)) { - Object retValue = parseParameter(targetMethodMap.get(field).type().parameterType(1), entry.getValue()); - if (retValue != null) { - setObjectValue(targetMethodMap.get(field), target, retValue); - } + setBaseObjectValue((BaseObject) target, entry.getValue(), field, setMethod,ignoreColumnList); + } else if (targetMethodMap.containsKey(field) && canFill(ignoreColumnList,field)) { + Object retValue = parseParameter(targetMethodMap.get(field).type().parameterType(1), entry.getValue()); + if (retValue != null) { + setObjectValue(targetMethodMap.get(field), target, retValue); } } } @@ -354,7 +354,9 @@ public static void convertToTarget(Object source, Object target, String... ignor Map targetMethodMap = ReflectUtils.returnSetMethodHandle(target.getClass()); Map sourceMethodMap = ReflectUtils.returnGetMethodHandle(source.getClass()); for (Map.Entry entry : sourceMethodMap.entrySet()) { - if (targetMethodMap.containsKey(entry.getKey()) && entry.getValue().type().parameterCount() == 1) { + if(BaseObject.class.isAssignableFrom(target.getClass())){ + setBaseObjectValue((BaseObject) target, entry.getValue().bindTo(source).invoke(), entry.getKey(), targetMethodMap.get(entry.getKey()),ignoreColumnList); + }else if (targetMethodMap.containsKey(entry.getKey()) && entry.getValue().type().parameterCount() == 1){ Object retValue = parseParameter(targetMethodMap.get(entry.getKey()).type().parameterType(1), entry.getValue().bindTo(source).invoke()); if (null != retValue) { setObjectValue(targetMethodMap.get(entry.getKey()), target, retValue); @@ -534,7 +536,7 @@ private static LocalDateTime getLocalDateTimeFrom(Object strValue) { DateTimeFormatter formatter; formatter = !ObjectUtils.isEmpty(currentFormatter.get()) ? currentFormatter.get() : getFormatter(strValue.toString()); if(formatter!=null) { - if (ymdformatter.equals(formatter) || ymdEupformatter.equals(formatter) || ymdEupformatter.equals(formatter)) { + if (ymdformatter.equals(formatter) || ymdEupformatter.equals(formatter) || ymdSepformatter.equals(formatter)) { ret = LocalDate.parse(strValue.toString(), formatter).atStartOfDay(); } else { ret = LocalDateTime.parse(strValue.toString(), formatter); @@ -697,7 +699,7 @@ public static T sourceToTargetWithMap(Map map, Class targ } } catch (Exception e) { - log.error("convert error {}", e); + log.error("convert error {}", e.getMessage()); } return targetObject; } diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ArrowFileIterator.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ArrowFileIterator.java index d7c6bd5f..555a811e 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ArrowFileIterator.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ArrowFileIterator.java @@ -5,6 +5,7 @@ import com.robin.core.fileaccess.fs.AbstractFileSystemAccessor; import com.robin.core.fileaccess.iterator.AbstractFileIterator; import com.robin.core.fileaccess.meta.DataCollectionMeta; +import com.robin.core.fileaccess.util.AvroUtils; import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.vector.*; @@ -49,9 +50,11 @@ public ArrowFileIterator(DataCollectionMeta colmeta, AbstractFileSystemAccessor public void beforeProcess() { super.beforeProcess(); schema= ArrowSchemaUtils.getSchema(colmeta); + avroSchema= AvroUtils.getSchemaFromMeta(colmeta); allocator=new RootAllocator(Integer.MAX_VALUE); vectorSchemaRoot=VectorSchemaRoot.create(schema,allocator); streamReader=new ArrowStreamReader(instream,allocator); + } @Override diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/AvroFileIterator.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/AvroFileIterator.java index dac49f77..97a92fe5 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/AvroFileIterator.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/AvroFileIterator.java @@ -38,7 +38,6 @@ import java.util.Map; public class AvroFileIterator extends AbstractFileIterator { - private Schema schema; private FileReader fileReader; private Double allowOffHeapDumpLimit = ResourceConst.ALLOWOUFHEAPMEMLIMIT; private MemorySegment segment; @@ -73,7 +72,7 @@ public boolean hasNext1() { @Override public void beforeProcess() { try { - schema = AvroUtils.getSchemaFromMeta(colmeta); + avroSchema = AvroUtils.getSchemaFromMeta(colmeta); doInit(colmeta.getPath()); } catch (Exception ex) { logger.error("Exception {0}", ex); @@ -82,13 +81,13 @@ public void beforeProcess() { private void doInit(String resourcePath) throws Exception { - if (colmeta.getSourceType().equals(ResourceConst.IngestType.TYPE_HDFS.getValue())) { + if (Const.FILESYSTEM.HDFS.getValue().equals(colmeta.getFsType())) { HDFSUtil util = new HDFSUtil(colmeta); instream = util.getHDFSDataByRawInputStream(ResourceUtil.getProcessPath(resourcePath)); input = new AvroFSInput(new FSDataInputStream(instream), util.getHDFSFileSize(ResourceUtil.getProcessPath(resourcePath))); } else { // no hdfs input source - if (!ResourceConst.IngestType.TYPE_LOCAL.getValue().equals(colmeta.getSourceType())) { + if (!Const.FILESYSTEM.LOCAL.getValue().equals(colmeta.getFsType())) { instream = accessUtil.getRawInputStream(ResourceUtil.getProcessPath(resourcePath)); long size = accessUtil.getInputStreamSize(ResourceUtil.getProcessPath(colmeta.getPath())); Double freeMemory = SysUtils.getFreeMemory(); @@ -112,9 +111,16 @@ private void doInit(String resourcePath) throws Exception { } } Assert.notNull(input, "Seekable input is null"); - GenericDatumReader dreader = new GenericDatumReader<>(schema); + GenericDatumReader dreader ; + if(avroSchema!=null){ + dreader=new GenericDatumReader<>(avroSchema); + }else{ + dreader=new GenericDatumReader<>(); + } fileReader = new DataFileReader<>(input, dreader); - schema = fileReader.getSchema(); + if(avroSchema==null){ + avroSchema=fileReader.getSchema(); + } } @Override @@ -123,7 +129,7 @@ protected void pullNext() { cachedValue.clear(); if(fileReader.hasNext()){ GenericRecord records = fileReader.next(); - List flist = schema.getFields(); + List flist = avroSchema.getFields(); for (Field f : flist) { if (!ObjectUtils.isEmpty(records.get(f.name()))) { cachedValue.put(f.name(), records.get(f.name()).toString()); @@ -139,7 +145,7 @@ public Map next1() { Map retmap = new HashMap<>(); try { GenericRecord records = fileReader.next(); - List flist = schema.getFields(); + List flist = avroSchema.getFields(); for (Field f : flist) { if (!ObjectUtils.isEmpty(records.get(f.name()))) { retmap.put(f.name(), records.get(f.name()).toString()); @@ -151,9 +157,6 @@ public Map next1() { return retmap; } - public Schema getSchema() { - return schema; - } @Override public void remove() { diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/OrcFileIterator.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/OrcFileIterator.java index aadf07b3..38e3fd25 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/OrcFileIterator.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/OrcFileIterator.java @@ -11,8 +11,10 @@ import com.robin.core.fileaccess.meta.DataCollectionMeta; import com.robin.core.fileaccess.meta.DataSetColumnMeta; import com.robin.comm.sql.CompareNode; +import com.robin.core.fileaccess.util.AvroUtils; import com.robin.core.fileaccess.util.ResourceUtil; import com.robin.hadoop.hdfs.HDFSUtil; +import org.apache.avro.Schema; import org.apache.calcite.sql.*; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.tuple.Pair; @@ -100,12 +102,12 @@ protected void pullNext() { maxRow = batch.size; } List fieldNames=schema.getFieldNames(); - currentRow++; if(!CollectionUtils.isEmpty(fields)){ for(int i=0;i valueMap){ - if(vector.noNulls || !vector.isNull[row]){ - switch (schema.getCategory()){ - case BOOLEAN: - valueMap.put(columnName,((LongColumnVector)vector).vector[row]!=0); - break; - case SHORT: - valueMap.put(columnName,Long.valueOf(((LongColumnVector)vector).vector[row]).shortValue()); - break; - case INT: - valueMap.put(columnName,Long.valueOf(((LongColumnVector)vector).vector[row]).intValue()); - break; - case LONG: - valueMap.put(columnName,((LongColumnVector)vector).vector[row]); - break; - case FLOAT: - case DOUBLE: - valueMap.put(columnName,((DoubleColumnVector)vector).vector[row]); - break; - case DECIMAL: - valueMap.put(columnName,((DecimalColumnVector)vector).vector[row].getHiveDecimal().bigDecimalValue()); - break; - case STRING: - case CHAR: - case VARCHAR: - valueMap.put(columnName,((BytesColumnVector)vector).toString(row)); - break; - case DATE: - valueMap.put(columnName,new Timestamp(((LongColumnVector)vector).vector[row])); - break; - case TIMESTAMP: - case TIMESTAMP_INSTANT: - valueMap.put(columnName,((TimestampColumnVector)vector).asScratchTimestamp(row)); - break; - case LIST: - case MAP: - case STRUCT: - break; - default: - throw new IllegalArgumentException("Unknown type " + schema.toString()); - } - } - } - - private void walkCondition(SqlNode node, SearchArgument.Builder argumentBuilder){ - if(!super.segment.isConditionHasFunction() && !super.segment.isConditionHasFourOperations()) { - if (SqlBasicCall.class.isAssignableFrom(node.getClass())) { - List nodes = ((SqlBasicCall) node).getOperandList(); - if (SqlIdentifier.class.isAssignableFrom(nodes.get(0).getClass()) && SqlLiteral.class.isAssignableFrom(nodes.get(1).getClass())) { - parseOperator(node,argumentBuilder); - } else { - boolean canUse=false; - List nodes1=((SqlBasicCall) node).getOperandList(); - if(SqlKind.OR.equals(node.getKind())){ - argumentBuilder.startOr(); - canUse=true; - }else if(SqlKind.AND.equals(node.getKind())){ - argumentBuilder.startAnd(); - canUse=true; - } - if(canUse) { - walkCondition(nodes1.get(0), argumentBuilder); - walkCondition(nodes1.get(0), argumentBuilder); - argumentBuilder.end(); - }else{ - argumentBuilder.literal(SearchArgument.TruthValue.YES); - } - } - } - } - } - private void parseOperator(SqlNode node,SearchArgument.Builder argumentBuilder){ - List nodes=((SqlBasicCall)node).getOperandList(); - String column=((SqlIdentifier)nodes.get(0)).getSimple(); - Pair pair=returnType(column,((SqlLiteral)nodes.get(1)).getValue()); - switch (node.getKind()) { - case GREATER_THAN: - argumentBuilder.startNot(); - argumentBuilder.lessThanEquals(column,pair.getKey(),pair.getValue()); - argumentBuilder.end(); - break; - case GREATER_THAN_OR_EQUAL: - argumentBuilder.startNot(); - argumentBuilder.lessThan(column,pair.getKey(),pair.getValue()); - argumentBuilder.end(); - break; - case EQUALS: - argumentBuilder.nullSafeEquals(column, pair.getKey(), pair.getValue()); - break; - case LESS_THAN: - argumentBuilder.lessThan(column, pair.getKey(), pair.getValue()); - break; - case LESS_THAN_OR_EQUAL: - argumentBuilder.lessThanEquals(column, pair.getKey(), pair.getValue()); - break; - case BETWEEN: - argumentBuilder.between(column, pair.getKey(), pair.getValue(),pair.getValue()); - break; - case IN: - argumentBuilder.in(column,pair.getKey(),super.segment.getInPartMap().get(column).stream().map(f-> returnWithType(columnMap.get(column),f)).collect(Collectors.toList()).toArray()); - break; - case NOT_EQUALS: - argumentBuilder.startNot(); - argumentBuilder.equals(column, pair.getKey(), pair.getValue()); - argumentBuilder.end(); - break; - default: - throw new OperationNotSupportException(" not supported!"); - - } - } - private Pair returnType(String columnName,Object value){ - if(columnMap.containsKey(columnName)){ - return returnType(columnMap.get(columnName),value); - }else { - return returnType(columnMap.get(columnName.toUpperCase()),value); - } - } - private Pair returnType(DataSetColumnMeta columnMeta,Object value){ - PredicateLeaf.Type type=null; - Object targetVal=null; - try { - switch (columnMeta.getColumnType()) { - case Const.META_TYPE_INTEGER: - case Const.META_TYPE_BIGINT: - type = PredicateLeaf.Type.LONG; - targetVal = Long.parseLong(value.toString()); - break; - case Const.META_TYPE_DOUBLE: - type = PredicateLeaf.Type.FLOAT; - targetVal =Double.parseDouble(value.toString()); - break; - case Const.META_TYPE_DECIMAL: - type = PredicateLeaf.Type.DECIMAL; - targetVal =new HiveDecimalWritable(HiveDecimal.create(Double.parseDouble(value.toString()))); - break; - case Const.META_TYPE_DATE: - type = PredicateLeaf.Type.DATE; - targetVal = Long.parseLong(value.toString()); - break; - case Const.META_TYPE_TIMESTAMP: - type = PredicateLeaf.Type.TIMESTAMP; - if(Timestamp.class.isAssignableFrom(value.getClass())){ - targetVal= value; - }else { - targetVal = new Timestamp(Long.parseLong(value.toString())); - } - break; - default: - type = PredicateLeaf.Type.STRING; - targetVal = value.toString(); - } - }catch (Exception ex){ - - } - return Pair.of(type,targetVal); - } - private Object returnWithType(DataSetColumnMeta columnMeta,Object value){ - Object targetVal=null; - switch (columnMeta.getColumnType()) { - case Const.META_TYPE_INTEGER: - case Const.META_TYPE_BIGINT: - targetVal = Long.parseLong(value.toString()); - break; - case Const.META_TYPE_DOUBLE: - case Const.META_TYPE_DECIMAL: - targetVal = Double.parseDouble(value.toString()); - break; - case Const.META_TYPE_DATE: - case Const.META_TYPE_TIMESTAMP: - targetVal = new Timestamp(Long.parseLong(value.toString())); - break; - default: - targetVal = value.toString(); - } - return targetVal; - } @Override public void beforeProcess() { @@ -305,7 +130,9 @@ public void beforeProcess() { checkAccessUtil(null); if(Const.FILESYSTEM.LOCAL.getValue().equals(colmeta.getFsType())){ fs=FileSystem.get(new Configuration()); - readPath=new File(readPath).toURI().toString(); + if(!readPath.startsWith("file:/")) { + readPath = new File(readPath).toURI().toString(); + } }else { instream = accessUtil.getRawInputStream(ResourceUtil.getProcessPath(colmeta.getPath())); long size = accessUtil.getInputStreamSize(ResourceUtil.getProcessPath(colmeta.getPath())); @@ -330,15 +157,21 @@ public void beforeProcess() { } } schema=OrcUtil.getSchema(colmeta); - if(!ObjectUtils.isEmpty(super.segment.getWhereCause()) &&!super.segment.isConditionHasFunction() && !super.segment.isConditionHasFunction() && !super.segment.isHasRightColumnCmp()){ + avroSchema= AvroUtils.getSchemaFromMeta(colmeta); + if(!ObjectUtils.isEmpty(super.segment) && !ObjectUtils.isEmpty(super.segment.getWhereCause()) &&!super.segment.isConditionHasFunction() && !super.segment.isConditionHasFunction() && !super.segment.isHasRightColumnCmp()){ SearchArgument.Builder argumentBuilder=SearchArgumentFactory.newBuilder(); - walkCondition(super.segment.getWhereCause(),argumentBuilder); + OrcUtil.walkCondition(this,super.segment.getWhereCause(),argumentBuilder); options= new Reader.Options().schema(schema).allowSARGToFilter(true) .searchArgument(argumentBuilder.build(),columnList.toArray(new String[0])); } - oreader =OrcFile.createReader(new Path(readPath),OrcFile.readerOptions(conf).filesystem(fs)); - //schema= oreader.getSchema(); + if(schema==null) { + schema = oreader.getSchema(); + if(schema!=null){ + avroSchema=OrcUtil.parseSchemaByType(schema,colmeta); + } + } + if(options!=null){ rows=oreader.rows(options); }else { @@ -346,6 +179,8 @@ public void beforeProcess() { } fields=schema.getChildren(); batch= schema.createRowBatch(); + rows.nextBatch(batch); + maxRow=batch.size; }catch (Exception ex){ ex.printStackTrace(); diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ParquetFileIterator.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ParquetFileIterator.java index 2bc9791d..01256d29 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ParquetFileIterator.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ParquetFileIterator.java @@ -66,7 +66,6 @@ public class ParquetFileIterator extends AbstractFileIterator { private ParquetReader preader; private ParquetReader protoReader; - private Schema schema; private MessageType msgtype; private GenericData.Record record; private ParquetReader> ireader; @@ -100,7 +99,6 @@ public ParquetFileIterator(DataCollectionMeta colmeta, AbstractFileSystemAccesso accessUtil = accessor; } - private List fields; private File tmpFile; @Override @@ -142,7 +140,7 @@ public void beforeProcess() { } protoReader=protoBuilder.build(); }else { - ParquetReader.Builder> builder = ParquetReader.builder(new CustomRowReadSupport(), new Path(ResourceUtil.getProcessPath(colmeta.getPath()))).withConf(conf); + ParquetReader.Builder> builder = ParquetReader.builder(new CustomRowReadSupport(colmeta), new Path(ResourceUtil.getProcessPath(colmeta.getPath()))).withConf(conf); if(filter==null) { builder.withFilter(filter); } @@ -200,7 +198,6 @@ public void beforeProcess() { ireader = builder.build(); } } - fields = schema.getFields(); } catch (Exception ex) { logger.error("{}", ex.getMessage()); } @@ -218,7 +215,7 @@ private void getSchema(InputFile file, boolean seekFrist) throws IOException { } } } else { - schema = AvroUtils.getSchemaFromMeta(colmeta); + avroSchema = AvroUtils.getSchemaFromMeta(colmeta); } } @@ -240,7 +237,7 @@ protected void pullNext() { record = null; record = preader.read(); if(record!=null){ - for (Schema.Field field : fields) { + for (Schema.Field field : avroSchema.getFields()) { Object value = record.get(field.name()); if (LogicalTypes.timestampMillis().equals(field.schema().getLogicalType())) { value = new Timestamp((Long) value); @@ -424,15 +421,11 @@ private void parseSchemaByType() { for (Type type : colList) { colmeta.addColumnMeta(type.getName(), ParquetReaderUtil.parseColumnType(type.asPrimitiveType()), null); } - schema = AvroUtils.getSchemaFromMeta(colmeta); + avroSchema = AvroUtils.getSchemaFromMeta(colmeta); } - public Schema getSchema() { - return schema; - } - @Override public void remove() { try { diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ParquetStreamIterator.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ParquetStreamIterator.java index ae042bb7..8bc42ab0 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ParquetStreamIterator.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ParquetStreamIterator.java @@ -28,7 +28,6 @@ public class ParquetStreamIterator extends AbstractFileIterator { private ParquetReader preader; - private Schema schema; private MessageType msgtype; private Configuration conf; private GenericData.Record record; @@ -52,7 +51,7 @@ public void beforeProcess() { msgtype = meta.getFileMetaData().getSchema(); parseSchemaByType(); } else { - schema = AvroUtils.getSchemaFromMeta(colmeta); + avroSchema = AvroUtils.getSchemaFromMeta(colmeta); } //seek remote file to local tmp ByteArrayOutputStream byteout=new ByteArrayOutputStream(instream.available()); @@ -60,7 +59,7 @@ public void beforeProcess() { ByteArraySeekableInputStream seekableInputStream=new ByteArraySeekableInputStream(byteout.toByteArray()); preader = AvroParquetReader .builder(ParquetUtil.makeInputFile(seekableInputStream)).withConf(conf).build(); - fields = schema.getFields(); + fields = avroSchema.getFields(); }catch (Exception ex){ logger.error("{0}",ex); } @@ -99,12 +98,9 @@ private void parseSchemaByType(){ for(Type type:colList){ colmeta.addColumnMeta(type.getName(),ParquetReaderUtil.parseColumnType(type.asPrimitiveType()),null); } - schema= AvroUtils.getSchemaFromMeta(colmeta); + avroSchema= AvroUtils.getSchemaFromMeta(colmeta); } - public Schema getSchema() { - return schema; - } @Override public void remove() { diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ProtoBufFileIterator.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ProtoBufFileIterator.java index 19f33547..29017e9f 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ProtoBufFileIterator.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/iterator/ProtoBufFileIterator.java @@ -7,6 +7,7 @@ import com.robin.core.fileaccess.fs.AbstractFileSystemAccessor; import com.robin.core.fileaccess.iterator.AbstractFileIterator; import com.robin.core.fileaccess.meta.DataCollectionMeta; +import com.robin.core.fileaccess.util.AvroUtils; import com.robin.core.fileaccess.util.ResourceUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.math3.analysis.function.Abs; @@ -40,7 +41,7 @@ public ProtoBufFileIterator(DataCollectionMeta colmeta, AbstractFileSystemAccess public void beforeProcess() { try { container=ProtoBufUtil.initSchema(colmeta); - + avroSchema= AvroUtils.getSchemaFromMeta(colmeta); checkAccessUtil(null); instream = accessUtil.getInResourceByStream(ResourceUtil.getProcessPath(colmeta.getPath())); } catch (Exception ex) { diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/util/CustomParquetReader.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/util/CustomParquetReader.java index 4cd8307f..6e50f6ae 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/util/CustomParquetReader.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/util/CustomParquetReader.java @@ -49,7 +49,7 @@ public CustomParquetReader.Builder withCompatibility(boolean enableCompatibility @Override protected ReadSupport> getReadSupport() { - return new CustomRowReadSupport(); + return new CustomRowReadSupport(colMeta); } } diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/util/CustomRowReadSupport.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/util/CustomRowReadSupport.java index 54b5ad0a..19779d66 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/util/CustomRowReadSupport.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/util/CustomRowReadSupport.java @@ -1,6 +1,7 @@ package com.robin.comm.fileaccess.util; +import com.robin.core.fileaccess.meta.DataCollectionMeta; import org.apache.hadoop.conf.Configuration; import org.apache.parquet.hadoop.api.InitContext; import org.apache.parquet.hadoop.api.ReadSupport; @@ -12,15 +13,17 @@ public class CustomRowReadSupport extends ReadSupport> { MessageType type; + DataCollectionMeta colmeta; - public CustomRowReadSupport(){ + public CustomRowReadSupport(DataCollectionMeta colmeta){ + this.colmeta=colmeta; } @Override public ReadContext init(InitContext context) { - type = context.getFileSchema(); - return new ReadContext(context.getFileSchema()); + type = ParquetUtil.genSchema(colmeta); + return new ReadContext(type); } diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/util/OrcUtil.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/util/OrcUtil.java index 992889d7..bdd5eaa3 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/util/OrcUtil.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/util/OrcUtil.java @@ -1,19 +1,34 @@ package com.robin.comm.fileaccess.util; +import com.robin.core.base.exception.OperationNotSupportException; import com.robin.core.base.util.Const; +import com.robin.core.fileaccess.iterator.AbstractFileIterator; import com.robin.core.fileaccess.meta.DataCollectionMeta; import com.robin.core.fileaccess.meta.DataSetColumnMeta; +import com.robin.core.fileaccess.util.AvroUtils; +import org.apache.avro.Schema; +import org.apache.calcite.sql.*; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.hadoop.hive.common.type.HiveDecimal; +import org.apache.hadoop.hive.ql.exec.vector.*; +import org.apache.hadoop.hive.ql.io.sarg.PredicateLeaf; +import org.apache.hadoop.hive.ql.io.sarg.SearchArgument; +import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable; import org.apache.orc.TypeDescription; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import java.sql.Timestamp; import java.util.InputMismatchException; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; public class OrcUtil { public static TypeDescription getSchema(DataCollectionMeta colmeta){ - TypeDescription schema=TypeDescription.createStruct(); if(!CollectionUtils.isEmpty(colmeta.getColumnList())){ + TypeDescription schema=TypeDescription.createStruct(); for(DataSetColumnMeta columnMeta:colmeta.getColumnList()){ if(StringUtils.isEmpty(columnMeta.getColumnType())){ continue; @@ -53,7 +68,225 @@ public static TypeDescription getSchema(DataCollectionMeta colmeta){ throw new InputMismatchException("input type not support!"); } } + return schema; } - return schema; + return null; + } + public static void wrapValue(TypeDescription schema, String columnName, ColumnVector vector, int row, Map valueMap){ + if(vector.noNulls || !vector.isNull[row]){ + switch (schema.getCategory()){ + case BOOLEAN: + valueMap.put(columnName,((LongColumnVector)vector).vector[row]!=0); + break; + case SHORT: + valueMap.put(columnName,Long.valueOf(((LongColumnVector)vector).vector[row]).shortValue()); + break; + case INT: + valueMap.put(columnName,Long.valueOf(((LongColumnVector)vector).vector[row]).intValue()); + break; + case LONG: + valueMap.put(columnName,((LongColumnVector)vector).vector[row]); + break; + case FLOAT: + case DOUBLE: + valueMap.put(columnName,((DoubleColumnVector)vector).vector[row]); + break; + case DECIMAL: + valueMap.put(columnName,((DecimalColumnVector)vector).vector[row].getHiveDecimal().bigDecimalValue()); + break; + case STRING: + case CHAR: + case VARCHAR: + valueMap.put(columnName,((BytesColumnVector)vector).toString(row)); + break; + case DATE: + valueMap.put(columnName,new Timestamp(((LongColumnVector)vector).vector[row])); + break; + case TIMESTAMP: + case TIMESTAMP_INSTANT: + valueMap.put(columnName,((TimestampColumnVector)vector).asScratchTimestamp(row)); + break; + case LIST: + case MAP: + case STRUCT: + break; + default: + throw new IllegalArgumentException("Unknown type " + schema.toString()); + } + } + } + public static void walkCondition(AbstractFileIterator reader,SqlNode node, SearchArgument.Builder argumentBuilder){ + if (SqlBasicCall.class.isAssignableFrom(node.getClass())) { + List nodes = ((SqlBasicCall) node).getOperandList(); + if (SqlIdentifier.class.isAssignableFrom(nodes.get(0).getClass()) && SqlLiteral.class.isAssignableFrom(nodes.get(1).getClass())) { + OrcUtil.parseOperator(reader,node,argumentBuilder); + } else { + boolean canUse=false; + List nodes1=((SqlBasicCall) node).getOperandList(); + if(SqlKind.OR.equals(node.getKind())){ + argumentBuilder.startOr(); + canUse=true; + }else if(SqlKind.AND.equals(node.getKind())){ + argumentBuilder.startAnd(); + canUse=true; + } + if(canUse) { + walkCondition(reader,nodes1.get(0), argumentBuilder); + walkCondition(reader,nodes1.get(0), argumentBuilder); + argumentBuilder.end(); + }else{ + argumentBuilder.literal(SearchArgument.TruthValue.YES); + } + } + } + } + public static void parseOperator(AbstractFileIterator reader, SqlNode node, SearchArgument.Builder argumentBuilder){ + List nodes=((SqlBasicCall)node).getOperandList(); + String column=((SqlIdentifier)nodes.get(0)).getSimple(); + Pair pair=returnType(reader.getColumnMap(),column,((SqlLiteral)nodes.get(1)).getValue()); + switch (node.getKind()) { + case GREATER_THAN: + argumentBuilder.startNot(); + argumentBuilder.lessThanEquals(column,pair.getKey(),pair.getValue()); + argumentBuilder.end(); + break; + case GREATER_THAN_OR_EQUAL: + argumentBuilder.startNot(); + argumentBuilder.lessThan(column,pair.getKey(),pair.getValue()); + argumentBuilder.end(); + break; + case EQUALS: + argumentBuilder.nullSafeEquals(column, pair.getKey(), pair.getValue()); + break; + case LESS_THAN: + argumentBuilder.lessThan(column, pair.getKey(), pair.getValue()); + break; + case LESS_THAN_OR_EQUAL: + argumentBuilder.lessThanEquals(column, pair.getKey(), pair.getValue()); + break; + case BETWEEN: + argumentBuilder.between(column, pair.getKey(), pair.getValue(),pair.getValue()); + break; + case IN: + argumentBuilder.in(column,pair.getKey(),reader.getSegment().getInPartMap().get(column).stream().map(f-> returnWithType(reader.getColumnMap().get(column),f)).collect(Collectors.toList()).toArray()); + break; + case NOT_EQUALS: + argumentBuilder.startNot(); + argumentBuilder.equals(column, pair.getKey(), pair.getValue()); + argumentBuilder.end(); + break; + default: + throw new OperationNotSupportException(" not supported!"); + + } + } + private static Pair returnType(Map columnMap, String columnName,Object value){ + if(columnMap.containsKey(columnName)){ + return returnType(columnMap.get(columnName),value); + }else { + return returnType(columnMap.get(columnName.toUpperCase()),value); + } + } + private static Pair returnType(DataSetColumnMeta columnMeta, Object value){ + PredicateLeaf.Type type=null; + Object targetVal=null; + try { + switch (columnMeta.getColumnType()) { + case Const.META_TYPE_INTEGER: + case Const.META_TYPE_BIGINT: + type = PredicateLeaf.Type.LONG; + targetVal = Long.parseLong(value.toString()); + break; + case Const.META_TYPE_DOUBLE: + type = PredicateLeaf.Type.FLOAT; + targetVal =Double.parseDouble(value.toString()); + break; + case Const.META_TYPE_DECIMAL: + type = PredicateLeaf.Type.DECIMAL; + targetVal =new HiveDecimalWritable(HiveDecimal.create(Double.parseDouble(value.toString()))); + break; + case Const.META_TYPE_DATE: + type = PredicateLeaf.Type.DATE; + targetVal = Long.parseLong(value.toString()); + break; + case Const.META_TYPE_TIMESTAMP: + type = PredicateLeaf.Type.TIMESTAMP; + if(Timestamp.class.isAssignableFrom(value.getClass())){ + targetVal= value; + }else { + targetVal = new Timestamp(Long.parseLong(value.toString())); + } + break; + default: + type = PredicateLeaf.Type.STRING; + targetVal = value.toString(); + } + }catch (Exception ex){ + + } + return Pair.of(type,targetVal); + } + private static Object returnWithType(DataSetColumnMeta columnMeta,Object value){ + Object targetVal=null; + switch (columnMeta.getColumnType()) { + case Const.META_TYPE_INTEGER: + case Const.META_TYPE_BIGINT: + targetVal = Long.parseLong(value.toString()); + break; + case Const.META_TYPE_DOUBLE: + case Const.META_TYPE_DECIMAL: + targetVal = Double.parseDouble(value.toString()); + break; + case Const.META_TYPE_DATE: + case Const.META_TYPE_TIMESTAMP: + targetVal = new Timestamp(Long.parseLong(value.toString())); + break; + default: + targetVal = value.toString(); + } + return targetVal; + } + public static Schema parseSchemaByType(TypeDescription schema,DataCollectionMeta colmeta) { + List columns=schema.getChildren(); + for(TypeDescription column:columns){ + colmeta.addColumnMeta(column.getFullFieldName(),parseFromCategory(column.getCategory()),null); + } + return AvroUtils.getSchemaFromMeta(colmeta); + } + private static String parseFromCategory(TypeDescription.Category category){ + String columnType=Const.META_TYPE_STRING; + switch (category){ + case LONG: + columnType= Const.META_TYPE_BIGINT; + break; + case INT: + columnType=Const.META_TYPE_INTEGER; + break; + case FLOAT: + columnType=Const.META_TYPE_FLOAT; + break; + case SHORT: + columnType=Const.META_TYPE_SHORT; + break; + case DOUBLE: + case DECIMAL: + columnType=Const.META_TYPE_DOUBLE; + break; + case DATE: + columnType=Const.META_TYPE_DATE; + break; + case TIMESTAMP: + case TIMESTAMP_INSTANT: + columnType=Const.META_TYPE_TIMESTAMP; + break; + case VARCHAR: + case STRING: + columnType=Const.META_TYPE_STRING; + break; + case BINARY: + columnType=Const.META_TYPE_BLOB; + break; + } + return columnType; } } diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/ArrowFileWriter.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/ArrowFileWriter.java index 6f589593..fec5157b 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/ArrowFileWriter.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/ArrowFileWriter.java @@ -1,14 +1,22 @@ package com.robin.comm.fileaccess.writer; import com.robin.comm.fileaccess.util.ArrowSchemaUtils; +import com.robin.core.base.exception.MissingConfigException; import com.robin.core.base.util.Const; import com.robin.core.fileaccess.meta.DataCollectionMeta; import com.robin.core.fileaccess.meta.DataSetColumnMeta; +import com.robin.core.fileaccess.util.ResourceUtil; import com.robin.core.fileaccess.writer.AbstractFileWriter; +import org.apache.arrow.compression.CommonsCompressionFactory; import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.vector.*; +import org.apache.arrow.vector.compression.CompressionCodec; +import org.apache.arrow.vector.compression.CompressionUtil; +import org.apache.arrow.vector.compression.NoCompressionCodec; +import org.apache.arrow.vector.dictionary.DictionaryProvider; import org.apache.arrow.vector.ipc.ArrowStreamWriter; +import org.apache.arrow.vector.ipc.message.IpcOption; import org.apache.arrow.vector.types.pojo.Field; import org.apache.arrow.vector.types.pojo.Schema; import org.springframework.util.ObjectUtils; @@ -17,6 +25,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; +import java.nio.channels.Channels; import java.sql.Timestamp; import java.util.Map; @@ -32,11 +41,13 @@ public class ArrowFileWriter extends AbstractFileWriter { public ArrowFileWriter() { this.identifier = Const.FILEFORMATSTR.ARROW.getValue(); + useRawOutputStream=true; } public ArrowFileWriter(DataCollectionMeta colmeta) { super(colmeta); this.identifier = Const.FILEFORMATSTR.ARROW.getValue(); + useRawOutputStream=true; } @Override @@ -45,7 +56,23 @@ public void beginWrite() throws IOException { schema = ArrowSchemaUtils.getSchema(colmeta); allocator = new RootAllocator(Integer.MAX_VALUE); vectorSchemaRoot = VectorSchemaRoot.create(schema, allocator); - streamWriter = new ArrowStreamWriter(vectorSchemaRoot, null, out); + Const.CompressType type= getCompressType(); + CompressionUtil.CodecType codecType= CompressionUtil.CodecType.NO_COMPRESSION; + CompressionCodec.Factory factory=new NoCompressionCodec.Factory(); + switch (type){ + case COMPRESS_TYPE_LZ4: + codecType= CompressionUtil.CodecType.LZ4_FRAME; + factory=new CommonsCompressionFactory(); + break; + case COMPRESS_TYPE_ZSTD: + codecType= CompressionUtil.CodecType.ZSTD; + factory=new CommonsCompressionFactory(); + break; + default: + throw new MissingConfigException("not supported!"); + + } + streamWriter = new ArrowStreamWriter(vectorSchemaRoot, new DictionaryProvider.MapDictionaryProvider(), Channels.newChannel(out), IpcOption.DEFAULT,factory,codecType); vectorSchemaRoot.allocateNew(); streamWriter.start(); } diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/AvroFileWriter.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/AvroFileWriter.java index e6b13ce0..d32a5697 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/AvroFileWriter.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/AvroFileWriter.java @@ -16,6 +16,7 @@ package com.robin.comm.fileaccess.writer; import com.robin.core.base.util.Const; +import com.robin.core.fileaccess.fs.AbstractFileSystemAccessor; import com.robin.core.fileaccess.meta.DataCollectionMeta; import com.robin.core.fileaccess.util.AvroUtils; import com.robin.core.fileaccess.util.ResourceUtil; @@ -49,12 +50,19 @@ public AvroFileWriter(DataCollectionMeta colmeta) { super(colmeta); schema = AvroUtils.getSchemaFromMeta(colmeta); this.identifier= Const.FILEFORMATSTR.AVRO.getValue(); + useRawOutputStream=true; + } + public AvroFileWriter(DataCollectionMeta colmeta, AbstractFileSystemAccessor accessor) { + super(colmeta,accessor); + schema = AvroUtils.getSchemaFromMeta(colmeta); + this.identifier= Const.FILEFORMATSTR.AVRO.getValue(); + useRawOutputStream=true; } @Override public void beginWrite() throws IOException { - out = accessUtil.getRawOutputStream(ResourceUtil.getProcessPath(colmeta.getPath())); + super.beginWrite(); dwriter=new GenericDatumWriter<>(schema); fileWriter=new DataFileWriter<>(dwriter); Const.CompressType type= getCompressType(); diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/OrcFileWriter.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/OrcFileWriter.java index a70715a3..9091e5bb 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/OrcFileWriter.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/OrcFileWriter.java @@ -3,6 +3,7 @@ import com.robin.comm.fileaccess.util.MockFileSystem; import com.robin.comm.fileaccess.util.OrcUtil; import com.robin.core.base.util.Const; +import com.robin.core.fileaccess.fs.AbstractFileSystemAccessor; import com.robin.core.fileaccess.meta.DataCollectionMeta; import com.robin.core.fileaccess.meta.DataSetColumnMeta; import com.robin.core.fileaccess.util.ResourceUtil; @@ -19,6 +20,7 @@ import org.apache.orc.TypeDescription; import org.apache.orc.Writer; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import javax.naming.OperationNotSupportedException; @@ -36,6 +38,8 @@ public class OrcFileWriter extends AbstractFileWriter { private TypeDescription schema; private Writer owriter; private VectorizedRowBatch batch; + private int batchSize=4096; + public static final String BACTH_SIZE="orcWrite.batchSize"; public OrcFileWriter() { this.identifier = Const.FILEFORMATSTR.ORC.getValue(); @@ -44,6 +48,16 @@ public OrcFileWriter() { public OrcFileWriter(DataCollectionMeta colmeta) { super(colmeta); this.identifier = Const.FILEFORMATSTR.ORC.getValue(); + if (!ObjectUtils.isEmpty(colmeta.getResourceCfgMap().get(BACTH_SIZE))) { + batchSize = Integer.parseInt(colmeta.getResourceCfgMap().get(BACTH_SIZE).toString()); + } + } + public OrcFileWriter(DataCollectionMeta colmeta, AbstractFileSystemAccessor accessor){ + super(colmeta,accessor); + this.identifier=Const.FILEFORMATSTR.ORC.getValue(); + if (!ObjectUtils.isEmpty(colmeta.getResourceCfgMap().get(BACTH_SIZE))) { + batchSize = Integer.parseInt(colmeta.getResourceCfgMap().get(BACTH_SIZE).toString()); + } } @Override @@ -92,7 +106,7 @@ public void beginWrite() throws IOException { } schema = OrcUtil.getSchema(colmeta); owriter = OrcFile.createWriter(new Path(colmeta.getPath()), OrcFile.writerOptions(conf).setSchema(schema).compress(compressionKind).fileSystem(fs)); - batch = schema.createRowBatch(); + batch = schema.createRowBatch(batchSize); } @Override diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/ParquetFileWriter.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/ParquetFileWriter.java index 8ecdf3ff..e686705f 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/ParquetFileWriter.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/ParquetFileWriter.java @@ -6,6 +6,7 @@ import com.robin.comm.fileaccess.util.ProtoBufUtil; import com.robin.core.base.util.Const; import com.robin.core.base.util.ResourceConst; +import com.robin.core.fileaccess.fs.AbstractFileSystemAccessor; import com.robin.core.fileaccess.meta.DataCollectionMeta; import com.robin.core.fileaccess.util.AvroUtils; import com.robin.core.fileaccess.util.ResourceUtil; @@ -55,6 +56,16 @@ public ParquetFileWriter(){ } public ParquetFileWriter(DataCollectionMeta colmeta) { super(colmeta); + useRawOutputStream=true; + initWriter(); + + } + public ParquetFileWriter(DataCollectionMeta colmeta, AbstractFileSystemAccessor accessor){ + super(colmeta,accessor); + useRawOutputStream=true; + initWriter(); + } + private void initWriter(){ avroSchema= AvroUtils.getSchemaFromMeta(colmeta); schema=ParquetUtil.genSchema(colmeta); this.identifier= Const.FILEFORMATSTR.PARQUET.getValue(); @@ -70,11 +81,11 @@ public ParquetFileWriter(DataCollectionMeta colmeta) { }catch (Exception ex){ } - } @Override public void beginWrite() throws IOException { + super.beginWrite(); Const.CompressType type= getCompressType(); switch (type){ case COMPRESS_TYPE_GZ: @@ -107,9 +118,7 @@ public void beginWrite() throws IOException { codecName=CompressionCodecName.UNCOMPRESSED; } - if(out==null) { - checkAccessUtil(null); - } + if(colmeta.getResourceCfgMap().containsKey(ResourceConst.PARQUETFILEFORMAT)){ if(ResourceConst.PARQUETSUPPORTFORMAT.AVRO.getValue().equalsIgnoreCase(colmeta.getResourceCfgMap().get(ResourceConst.PARQUETFILEFORMAT).toString())) { useAvroEncode = true; @@ -131,7 +140,6 @@ public void beginWrite() throws IOException { mapWriter =new CustomParquetWriter.Builder(new Path(colmeta.getPath()), schema).withConf(conf).withPageSize(pageSize).withCompressionCodec(codecName).withDictionaryEncoding(false).withWriterVersion(writerVersion).build(); } }else{ - out=accessUtil.getRawOutputStream(ResourceUtil.getProcessPath(colmeta.getPath())); if(useAvroEncode) { avroWriter = AvroParquetWriter.builder(ParquetUtil.makeOutputFile(out, colmeta, ResourceUtil.getProcessPath(colmeta.getPath()))).withCompressionCodec(codecName).withSchema(avroSchema).build(); }else if(useProtobufEncode){ diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/ProtoBufFileWriter.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/ProtoBufFileWriter.java index 6efd7740..a445e18c 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/ProtoBufFileWriter.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/writer/ProtoBufFileWriter.java @@ -6,6 +6,7 @@ import com.robin.comm.fileaccess.util.ProtoBufUtil; import com.robin.core.base.util.Const; import com.robin.core.compress.util.CompressEncoder; +import com.robin.core.fileaccess.fs.AbstractFileSystemAccessor; import com.robin.core.fileaccess.meta.DataCollectionMeta; import com.robin.core.fileaccess.util.ResourceUtil; import com.robin.core.fileaccess.writer.AbstractFileWriter; @@ -28,6 +29,10 @@ public ProtoBufFileWriter(DataCollectionMeta colmeta) { super(colmeta); this.identifier= Const.FILEFORMATSTR.PROTOBUF.getValue(); } + public ProtoBufFileWriter(DataCollectionMeta colmeta, AbstractFileSystemAccessor accessor){ + super(colmeta,accessor); + this.identifier= Const.FILEFORMATSTR.PROTOBUF.getValue(); + } @Override diff --git a/hadooptool/src/main/java/com/robin/dfs/minio/MinioUtils.java b/hadooptool/src/main/java/com/robin/dfs/minio/MinioUtils.java index 1ae83cd8..dfd10c4e 100644 --- a/hadooptool/src/main/java/com/robin/dfs/minio/MinioUtils.java +++ b/hadooptool/src/main/java/com/robin/dfs/minio/MinioUtils.java @@ -5,7 +5,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; -import javax.servlet.http.HttpServletResponse; + import java.io.*; import java.util.ResourceBundle; @@ -71,7 +71,7 @@ public static boolean download(MinioAsyncClient client,String bucketName,String } return executeOk; } - public static void download(MinioAsyncClient client,String bucketName,String objectName,String contentType, HttpServletResponse response) throws Exception{ + /*public static void download(MinioAsyncClient client,String bucketName,String objectName,String contentType, HttpServletResponse response) throws Exception{ GetObjectArgs args= GetObjectArgs.builder().bucket(bucketName).object(objectName).build(); try(GetObjectResponse response1=client.getObject(args).get()){ int pos=objectName.lastIndexOf("/"); @@ -84,7 +84,7 @@ public static void download(MinioAsyncClient client,String bucketName,String obj }catch (Exception ex){ throw ex; } - } + }*/ public static void main(String[] args){ ResourceBundle bundle=ResourceBundle.getBundle("application"); MinioClient.Builder builder= MinioClient.builder().endpoint(bundle.getString("minio.endpoint")).credentials(bundle.getString("minio.accessKey"),bundle.getString("minio.secretKey")); diff --git a/metadata/src/main/java/com/robin/meta/contorller/SchemaController.java b/metadata/src/main/java/com/robin/meta/contorller/SchemaController.java index 939ea5a6..4ab3e403 100644 --- a/metadata/src/main/java/com/robin/meta/contorller/SchemaController.java +++ b/metadata/src/main/java/com/robin/meta/contorller/SchemaController.java @@ -15,6 +15,7 @@ */ package com.robin.meta.contorller; +import com.robin.core.base.util.Const; import com.robin.core.fileaccess.meta.DataCollectionMeta; import com.robin.meta.service.resource.GlobalResourceService; import org.springframework.stereotype.Controller; @@ -32,12 +33,19 @@ public class SchemaController { private GlobalResourceService globalResourceService; @GetMapping("/resource") @ResponseBody - public Map getResourceSchema(@RequestParam String sourceId,@RequestParam String sourceParam){ - DataCollectionMeta collectionMeta=globalResourceService.getResourceMetaDef(sourceId+","+sourceParam); + public Map getResourceSchema(@RequestParam(required = true) Long sourceId,@RequestParam String sourceParam){ + DataCollectionMeta collectionMeta=null; + if(sourceId!=0L) { + collectionMeta=globalResourceService.getResourceMetaDef(sourceId + "," + sourceParam); + }else{ + DataCollectionMeta.Builder builder=new DataCollectionMeta.Builder(); + builder.fsType(Const.FILESYSTEM.LOCAL.getValue()) + .resPath(sourceParam); + collectionMeta=builder.build(); + } //Schema schema=globalResourceService.getDataSourceSchema(collectionMeta,sourceId,sourceParam); Map retMap=new HashMap<>(); - String[] arr=sourceId.split(","); - retMap.put("schema",globalResourceService.getDataSourceSchemaDesc(collectionMeta,Long.parseLong(arr[0]),sourceParam,0)); + retMap.put("schema",globalResourceService.getDataSourceSchemaDesc(collectionMeta,sourceId,sourceParam,0)); return retMap; } diff --git a/metadata/src/main/java/com/robin/meta/mvc/config/DbConfig.java b/metadata/src/main/java/com/robin/meta/mvc/config/DbConfig.java index 512fd183..3a34e3b3 100644 --- a/metadata/src/main/java/com/robin/meta/mvc/config/DbConfig.java +++ b/metadata/src/main/java/com/robin/meta/mvc/config/DbConfig.java @@ -51,7 +51,6 @@ public class DbConfig { @Bean(name = "dataSource") @Qualifier("dataSource") @Primary - @DependsOn("springContextHolder") public DataSource dataSource(){ try { return DataSourceBuilder.create().type((Class) Class.forName(coretype)).url(coreurl).driverClassName(coredriverClassName).username(coreuserName).password(corepassword).build(); @@ -92,7 +91,11 @@ public JdbcDao getJdbcDao(@Qualifier("dataSource") DataSource dataSource, @Quali dao.setSqlGen(sqlGen); return dao; } - + @Bean + @Lazy(value = false) + public SpringContextHolder getHolder(){ + return new SpringContextHolder(); + } diff --git a/metadata/src/main/java/com/robin/meta/service/resource/GlobalResourceService.java b/metadata/src/main/java/com/robin/meta/service/resource/GlobalResourceService.java index 976c9322..445d7441 100644 --- a/metadata/src/main/java/com/robin/meta/service/resource/GlobalResourceService.java +++ b/metadata/src/main/java/com/robin/meta/service/resource/GlobalResourceService.java @@ -30,6 +30,8 @@ import com.robin.core.base.util.ResourceConst; import com.robin.core.fileaccess.fs.AbstractFileSystemAccessor; import com.robin.core.fileaccess.fs.ApacheVfsFileSystemAccessor; +import com.robin.core.fileaccess.fs.LocalFileSystemAccessor; +import com.robin.core.fileaccess.iterator.AbstractFileIterator; import com.robin.core.fileaccess.iterator.IResourceIterator; import com.robin.core.fileaccess.iterator.TextFileIteratorFactory; import com.robin.core.fileaccess.meta.DataCollectionMeta; @@ -160,11 +162,13 @@ public Map getEsSchemaMeta(GlobalResource resource) { public Schema getDataSourceSchema(DataCollectionMeta colmeta, Long sourceId, String sourceParamInput, int maxReadLines) { - GlobalResource resource = getEntity(sourceId); + GlobalResource resource = sourceId!=0L?getEntity(sourceId):null; Schema schema = null; - try { - if (resource.getResType().equals(ResourceConst.ResourceType.TYPE_DB.getValue()) || resource.getResType().equals(ResourceConst.ResourceType.TYPE_ES.getValue())) { + if (sourceId==0L) { + LocalFileSystemAccessor accessor=LocalFileSystemAccessor.getInstance(); + schema=getFileSchema(accessor,colmeta,resource,maxReadLines); + }else if (resource.getResType().equals(ResourceConst.ResourceType.TYPE_DB.getValue()) || resource.getResType().equals(ResourceConst.ResourceType.TYPE_ES.getValue())) { schema = AvroUtils.getSchemaFromMeta(colmeta); } else if (resource.getResType().equals(ResourceConst.ResourceType.TYPE_HDFSFILE.getValue())) { HdfsFileSystemAccessor util = (HdfsFileSystemAccessor) ResourceAccessHolder.getAccessUtilByProtocol(resource.getProtocol(), colmeta);;; @@ -181,11 +185,6 @@ public Schema getDataSourceSchema(DataCollectionMeta colmeta, Long sourceId, Str colmeta.setPath(inputPath + fileList.get(0)); } schema = getFileSchema(util, colmeta, resource, maxReadLines); - } else if (resource.getResType().equals(ResourceConst.ResourceType.TYPE_LOCALFILE.getValue())) { - - - } else if (resource.getResType().equals(ResourceConst.ResourceType.TYPE_REDIS.getValue())) { - } } catch (Exception ex) { ex.printStackTrace(); @@ -202,42 +201,38 @@ public static String getTableClassName(String tableName) { private Schema getFileSchema(AbstractFileSystemAccessor util, DataCollectionMeta meta, GlobalResource resource, int maxReadLines) throws Exception { Schema schema = null; FileUtils.FileContent content=FileUtils.parseFile(meta.getPath()); - String fileFormat =content.getFileFormat(); + String fileFormat =content.getFileFormat().getValue(); int columnPos = 0; //read Header 10000 Line int readLines = maxReadLines > 0 ? maxReadLines : 10000; - Pair pair = util.getInResourceByReader(meta.getPath()); - - if (fileFormat.equalsIgnoreCase(Const.FILESUFFIX_CSV)) { - SourceFileExplorer.exploreCsv(pair.getKey(), meta, resource.getRecordContent() == null ? null : resource.getRecordContent().split(","), readLines); - schema = AvroUtils.getSchemaFromMeta(meta); - } else if (fileFormat.equalsIgnoreCase(Const.FILESUFFIX_JSON)) { - SourceFileExplorer.exploreJson(pair.getKey(), meta, readLines); - schema = AvroUtils.getSchemaFromMeta(meta); - } else if (fileFormat.equalsIgnoreCase(Const.FILESUFFIX_XML)) { - - } else if (fileFormat.equalsIgnoreCase(Const.FILESUFFIX_PARQUET)) { - IResourceIterator iterator = TextFileIteratorFactory.getProcessIteratorByType(meta, pair.getKey()); - if (iterator.hasNext()) { - schema = ((ParquetFileIterator) iterator).getSchema(); - } - } else if (fileFormat.equalsIgnoreCase(Const.FILESUFFIX_AVRO)) { - IResourceIterator iterator = TextFileIteratorFactory.getProcessIteratorByType(meta, pair.getKey()); - if (iterator.hasNext()) { - schema = ((AvroFileIterator) iterator).getSchema(); - } - }else if(fileFormat.equalsIgnoreCase(Const.FILESUFFIX_ORC)){ + Pair pair=null; - } try{ - - }finally { - if(!ObjectUtils.isEmpty(pair.getKey())){ - pair.getKey().close(); + if (fileFormat.equalsIgnoreCase(Const.FILESUFFIX_CSV)) { + pair = util.getInResourceByReader(meta.getPath()); + SourceFileExplorer.exploreCsv(pair.getKey(), meta,resource==null || resource.getRecordContent() == null ? null : resource.getRecordContent().split(","), readLines); + schema = AvroUtils.getSchemaFromMeta(meta); + } else if (fileFormat.equalsIgnoreCase(Const.FILESUFFIX_JSON)) { + pair = util.getInResourceByReader(meta.getPath()); + SourceFileExplorer.exploreJson(pair.getKey(), meta, readLines); + schema = AvroUtils.getSchemaFromMeta(meta); + } else if (fileFormat.equalsIgnoreCase(Const.FILESUFFIX_XML)) { + + } else if (fileFormat.equalsIgnoreCase(Const.FILESUFFIX_PARQUET) || fileFormat.equalsIgnoreCase(Const.FILESUFFIX_AVRO) || fileFormat.equalsIgnoreCase(Const.FILESUFFIX_ORC)) { + IResourceIterator iterator = TextFileIteratorFactory.getProcessIteratorByType(meta, util); + if (iterator.hasNext()) { + schema = ((AbstractFileIterator) iterator).getSchema(); + } } - if(!ObjectUtils.isEmpty(pair.getValue())){ - pair.getValue().close(); + }finally { + if(pair!=null) { + if (!ObjectUtils.isEmpty(pair.getKey())) { + pair.getKey().close(); + } + if (!ObjectUtils.isEmpty(pair.getValue())) { + pair.getValue().close(); + } } } return schema; diff --git a/mybatisproj/src/main/java/com/robin/basis/controller/system/EmployeeController.java b/mybatisproj/src/main/java/com/robin/basis/controller/system/EmployeeController.java index b7c62644..7ab284d1 100644 --- a/mybatisproj/src/main/java/com/robin/basis/controller/system/EmployeeController.java +++ b/mybatisproj/src/main/java/com/robin/basis/controller/system/EmployeeController.java @@ -3,17 +3,39 @@ import com.robin.basis.dto.EmployeeDTO; import com.robin.basis.dto.query.SysEmployeeQueryDTO; import com.robin.basis.mapper.EmployeeMapper; +import com.robin.basis.model.AbstractMybatisModel; import com.robin.basis.model.user.Employee; +import com.robin.basis.service.biz.ISmsService; import com.robin.basis.service.system.IEmployeeService; +import com.robin.core.base.util.Const; +import com.robin.core.template.util.FreeMarkerUtil; import com.robin.core.web.controller.AbstractMyBatisController; +import com.robin.core.web.spring.anotation.RepeatSubmitCheck; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.util.Assert; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; +import java.time.Duration; +import java.util.HashMap; import java.util.Map; +import java.util.Random; @RestController @RequestMapping("/system/employee") public class EmployeeController extends AbstractMyBatisController { + private Random random=new Random(10001011L); + @Resource + private RedisTemplate redisTemplate; + @Resource + private ISmsService smsService; + @GetMapping public Map list(SysEmployeeQueryDTO dto){ return wrapObject(service.list(dto)); @@ -21,7 +43,7 @@ public Map list(SysEmployeeQueryDTO dto){ @PostMapping @PreAuthorize("@checker.isAdmin()") public Map saveEmployee(@RequestBody EmployeeDTO dto){ - if(service.saveEmployee(dto)){ + if(service.saveEmployee(dto,false)){ return wrapSuccess(""); }else{ return wrapFailedMsg(""); @@ -36,4 +58,61 @@ public Map updateEmployee(@RequestBody EmployeeDTO dto){ return wrapFailedMsg(""); } } + @PermitAll + @GetMapping("/checkExists/{phoneNum}") + @RepeatSubmitCheck(banIp = true) + public Map checkExists(@PathVariable String phoneNum){ + long count=service.lambdaQuery().eq(AbstractMybatisModel::getStatus, Const.VALID) + .eq(Employee::getContactPhone,phoneNum).count(); + if(count>0L){ + return wrapFailedMsg("exists"); + }else{ + return wrapSuccess("OK"); + } + } + @PermitAll + @GetMapping("/verifyCode/{phoneNum}") + @RepeatSubmitCheck(banIp = true) + public Map verifyCode(HttpServletRequest request, @PathVariable String phoneNum){ + long count=service.lambdaQuery().eq(AbstractMybatisModel::getStatus, Const.VALID) + .eq(Employee::getContactPhone,phoneNum).count(); + if(count>0L){ + return wrapFailedMsg("该号码已注册"); + }else{ + int randomNum=random.nextInt(9000)+1000; + redisTemplate.opsForValue().set("employeeVerify:"+phoneNum,String.valueOf(randomNum), Duration.ofMinutes(2)); + //send verify sms + if(smsService!=null){ + try(ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); + BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(outputStream))) { + Map map = new HashMap<>(); + FreeMarkerUtil freeutil = new FreeMarkerUtil(request.getSession().getServletContext(), "/template"); + map.put("phoneNum",phoneNum); + map.put("code",String.valueOf(randomNum)); + freeutil.process("sms.ftl",map,writer); + smsService.sendSms(phoneNum,new String(outputStream.toByteArray())); + }catch (Exception ex){ + return wrapError(ex); + } + } + return wrapSuccess("OK"); + } + } + @PermitAll + @PostMapping("/register") + @RepeatSubmitCheck(banIp = true) + public Map register(@RequestBody EmployeeDTO dto){ + Assert.notNull(dto.getVerifyCode(),"验证码为空"); + Assert.notNull(dto.getContactPhone(),"手机号为空"); + if(!dto.getVerifyCode().equals(redisTemplate.opsForValue().get("employeeVerify:"+dto.getContactPhone()))){ + return wrapFailedMsg("验证码不正确"); + } + if(service.saveEmployee(dto,true)){ + return wrapSuccess("注册成功"); + }else{ + return wrapFailedMsg(""); + } + + + } } diff --git a/mybatisproj/src/main/java/com/robin/basis/controller/system/SysUserCrudController.java b/mybatisproj/src/main/java/com/robin/basis/controller/system/SysUserCrudController.java index 05d8e056..5a39cd75 100644 --- a/mybatisproj/src/main/java/com/robin/basis/controller/system/SysUserCrudController.java +++ b/mybatisproj/src/main/java/com/robin/basis/controller/system/SysUserCrudController.java @@ -18,11 +18,9 @@ import com.google.common.collect.Lists; import com.robin.basis.dto.SysResourceDTO; import com.robin.basis.dto.SysUserDTO; -import com.robin.basis.dto.TenantInfoDTO; import com.robin.basis.dto.query.SysUserQueryDTO; import com.robin.basis.mapper.SysUserMapper; import com.robin.basis.model.user.SysUser; -import com.robin.basis.sercurity.SysLoginUser; import com.robin.basis.service.system.ISysOrgService; import com.robin.basis.service.system.ISysResourceService; import com.robin.basis.service.system.ISysUserService; @@ -86,7 +84,7 @@ public Map updateUser(@RequestBody Map map) { //check userAccount unique SysUserDTO dto=new SysUserDTO(); try { - ConvertUtil.mapToObject(dto, map); + ConvertUtil.mapToObject(map, dto); List roleList=(List) map.get("roles"); dto.setRoles(roleList.stream().map(f->{ if(Map.class.isAssignableFrom(f.getClass())){ diff --git a/mybatisproj/src/main/java/com/robin/basis/controller/user/LoginController.java b/mybatisproj/src/main/java/com/robin/basis/controller/user/LoginController.java index f72689b9..50c43189 100644 --- a/mybatisproj/src/main/java/com/robin/basis/controller/user/LoginController.java +++ b/mybatisproj/src/main/java/com/robin/basis/controller/user/LoginController.java @@ -31,7 +31,6 @@ import com.robin.core.base.exception.MissingConfigException; import com.robin.core.base.spring.SpringContextHolder; import com.robin.core.base.util.Const; -import com.robin.core.base.util.ResourceConst; import com.robin.core.convert.util.ConvertUtil; import com.robin.core.web.controller.AbstractController; import com.robin.core.web.util.CookieUtils; @@ -121,7 +120,7 @@ private String getToken(SysLoginUser loginUser,Environment environment,HttpServl headerMap.put("type", "JWT"); headerMap.put("alg", "RS256"); - ConvertUtil.objectToMapObj(sessionMap, loginUser); + ConvertUtil.objectToMapObj(loginUser, sessionMap); Integer expireDays = !environment.containsProperty("session.expireDay") ? 15 : Integer.parseInt(environment.getProperty("session.expireDay")); LocalDateTime dateTime = LocalDateTime.now(); diff --git a/mybatisproj/src/main/java/com/robin/basis/dto/EmployeeDTO.java b/mybatisproj/src/main/java/com/robin/basis/dto/EmployeeDTO.java index 1f691e62..d98bf8cd 100644 --- a/mybatisproj/src/main/java/com/robin/basis/dto/EmployeeDTO.java +++ b/mybatisproj/src/main/java/com/robin/basis/dto/EmployeeDTO.java @@ -21,6 +21,7 @@ public class EmployeeDTO implements Serializable { private String province; private String city; private Long userId; + private String verifyCode; private static final DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyy-MM-dd"); public static EmployeeDTO fromVO(Employee employee){ EmployeeDTO dto=new EmployeeDTO(); diff --git a/mybatisproj/src/main/java/com/robin/basis/dto/RouterDTO.java b/mybatisproj/src/main/java/com/robin/basis/dto/RouterDTO.java index 6d10ff47..545af9d1 100644 --- a/mybatisproj/src/main/java/com/robin/basis/dto/RouterDTO.java +++ b/mybatisproj/src/main/java/com/robin/basis/dto/RouterDTO.java @@ -41,7 +41,7 @@ public static RouterDTO fromVO(SysResource source){ public static RouterDTO fromMap(Map map){ RouterDTO dto=new RouterDTO(); try{ - ConvertUtil.mapToObject(dto,map); + ConvertUtil.mapToObject(map, dto); dto.setAssignType(map.get("assignType").toString()); dto.getMeta().setTitle(map.get("name").toString()); dto.setPath(map.get("routerPath").toString()); diff --git a/mybatisproj/src/main/java/com/robin/basis/mapper/SysResourceMapper.java b/mybatisproj/src/main/java/com/robin/basis/mapper/SysResourceMapper.java index 3f0c7037..37a086e1 100644 --- a/mybatisproj/src/main/java/com/robin/basis/mapper/SysResourceMapper.java +++ b/mybatisproj/src/main/java/com/robin/basis/mapper/SysResourceMapper.java @@ -20,7 +20,7 @@ public interface SysResourceMapper extends BaseMapper { +"" +" and ((a.tenant_id=#{tenantId} and d.tenant_id=#{tenantId}) or(a.tenant_id=0 and b.tenant_id=0 and c.tenant_id=0))" +"" - +" and d.user_id=${userId} " + + +" and d.user_id=#{userId} " + " union select c.*,d.assign_type from t_sys_resource_info c,t_sys_resource_user_r d where c.id=d.res_id and d.USER_ID=#{userId} and c.STATUS='1' and d.status='1' )e order by res_code,seq_no,assign_type desc" +"") List queryUserPermission(@Param(value = "userId") Long userId,@Param(value = "tenantId") Long tenantId); diff --git a/mybatisproj/src/main/java/com/robin/basis/sercurity/LoginDetailsService.java b/mybatisproj/src/main/java/com/robin/basis/sercurity/LoginDetailsService.java index 582d7e15..c8dd1367 100644 --- a/mybatisproj/src/main/java/com/robin/basis/sercurity/LoginDetailsService.java +++ b/mybatisproj/src/main/java/com/robin/basis/sercurity/LoginDetailsService.java @@ -8,7 +8,6 @@ import com.robin.basis.model.user.SysUser; import com.robin.basis.model.user.SysUserRole; import com.robin.basis.service.system.*; -import com.robin.core.base.dao.JdbcDao; import com.robin.core.base.util.Const; import com.robin.core.web.util.WebConstant; import org.springframework.security.core.userdetails.UserDetails; @@ -39,8 +38,6 @@ public class LoginDetailsService implements UserDetailsService { @Resource private ISysResourceService sysResourceService; - @Resource - private JdbcDao jdbcDao; @Override public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException { diff --git a/mybatisproj/src/main/java/com/robin/basis/service/biz/impl/CustomerServiceImpl.java b/mybatisproj/src/main/java/com/robin/basis/service/biz/impl/CustomerServiceImpl.java index fba0524e..ea5d0b6d 100644 --- a/mybatisproj/src/main/java/com/robin/basis/service/biz/impl/CustomerServiceImpl.java +++ b/mybatisproj/src/main/java/com/robin/basis/service/biz/impl/CustomerServiceImpl.java @@ -8,4 +8,5 @@ @Service public class CustomerServiceImpl extends AbstractMybatisService implements ICustomerService { + } diff --git a/mybatisproj/src/main/java/com/robin/basis/service/system/IEmployeeService.java b/mybatisproj/src/main/java/com/robin/basis/service/system/IEmployeeService.java index 323183d3..9fff7a04 100644 --- a/mybatisproj/src/main/java/com/robin/basis/service/system/IEmployeeService.java +++ b/mybatisproj/src/main/java/com/robin/basis/service/system/IEmployeeService.java @@ -10,6 +10,6 @@ public interface IEmployeeService extends IMybatisBaseService { Map list(SysEmployeeQueryDTO queryDTO); - boolean saveEmployee(EmployeeDTO dto) throws ServiceException; + boolean saveEmployee(EmployeeDTO dto,boolean createAccount) throws ServiceException; boolean updateEmployee(EmployeeDTO dto) throws ServiceException; } diff --git a/mybatisproj/src/main/java/com/robin/basis/service/system/impl/EmployeeServiceImpl.java b/mybatisproj/src/main/java/com/robin/basis/service/system/impl/EmployeeServiceImpl.java index 13ad9d64..b6f98162 100644 --- a/mybatisproj/src/main/java/com/robin/basis/service/system/impl/EmployeeServiceImpl.java +++ b/mybatisproj/src/main/java/com/robin/basis/service/system/impl/EmployeeServiceImpl.java @@ -4,18 +4,22 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.robin.basis.dto.EmployeeDTO; +import com.robin.basis.dto.SysUserDTO; import com.robin.basis.dto.query.SysEmployeeQueryDTO; import com.robin.basis.mapper.EmployeeMapper; import com.robin.basis.model.region.Region; import com.robin.basis.model.user.Employee; +import com.robin.basis.model.user.SysUser; import com.robin.basis.service.region.IRegionService; import com.robin.basis.service.system.IEmployeeService; +import com.robin.basis.service.system.ISysUserService; import com.robin.basis.utils.WebUtils; import com.robin.core.base.exception.ServiceException; import com.robin.core.base.service.AbstractMybatisService; import com.robin.core.base.util.Const; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; @@ -28,6 +32,8 @@ public class EmployeeServiceImpl extends AbstractMybatisService implements IEmployeeService { @Resource private IRegionService regionService; + @Resource + private ISysUserService userService; private static final DateTimeFormatter birthDayFormat=DateTimeFormatter.ofPattern("yyyy-MM-dd"); public Map list(SysEmployeeQueryDTO queryDTO){ @@ -52,7 +58,8 @@ public Map list(SysEmployeeQueryDTO queryDTO){ return WebUtils.toEmptyPageVO(); } } - public boolean saveEmployee(EmployeeDTO dto) throws ServiceException{ + @Transactional(rollbackFor = RuntimeException.class) + public boolean saveEmployee(EmployeeDTO dto,boolean createAccount) throws ServiceException{ long count=this.lambdaQuery().eq(StrUtil.isNotBlank(dto.getCreditNo()),Employee::getCreditNo,dto.getCreditNo()) .or(orwrapper->orwrapper.eq(StrUtil.isNotBlank(dto.getName()),Employee::getName,dto.getName())).count(); if(count>0L){ @@ -67,8 +74,21 @@ public boolean saveEmployee(EmployeeDTO dto) throws ServiceException{ if(!ObjectUtil.isEmpty(dto.getBrithDay())){ employee.setBrithDay(LocalDate.parse(dto.getBrithDay(),birthDayFormat)); } - return save(employee); + if(!createAccount) { + return save(employee); + }else{ + if(save(employee)) { + SysUserDTO user = new SysUserDTO(); + user.setUserAccount(dto.getContactPhone()); + user.setUserName(dto.getName()); + user.setPhoneNum(dto.getContactPhone()); + userService.saveUser(user); + return true; + } + return false; + } } + @Transactional(rollbackFor = RuntimeException.class) public boolean updateEmployee(EmployeeDTO dto) throws ServiceException{ Employee employee=getById(dto.getId()); if(!ObjectUtil.isEmpty(employee)) { diff --git a/mybatisproj/src/main/java/com/robin/basis/service/system/impl/SysResourceServiceImpl.java b/mybatisproj/src/main/java/com/robin/basis/service/system/impl/SysResourceServiceImpl.java index 15a42d50..03bd40b8 100644 --- a/mybatisproj/src/main/java/com/robin/basis/service/system/impl/SysResourceServiceImpl.java +++ b/mybatisproj/src/main/java/com/robin/basis/service/system/impl/SysResourceServiceImpl.java @@ -209,15 +209,6 @@ public List queryUserPermission(SysUser user, Long tenantId){ List origins=baseMapper.queryUserPermission(user.getId(), useTenantId); //非系统管理,从系统参数表获取通用菜单(根据企业对应租户的级别来,避免重复的角色菜单赋权,只保留差异) - /*if(WebConstant.ACCOUNT_TYPE.SYSADMIN.toString().equals(SecurityUtils.getLoginUser().getAccountType())){ - if(!WebConstant.ACCOUNT_TYPE.SYSADMIN.toString().equals(user.getAccountType())) { - List defaults = getSuperAdminConfigUserPermissions(user); - List resources = this.lambdaQuery().in(SysResource::getId, defaults).eq(AbstractMybatisModel::getStatus, Const.VALID).list(); - if (!CollectionUtils.isEmpty(resources)) { - origins.addAll(resources.stream().map(SysResourceDTO::fromVO).collect(Collectors.toList())); - } - } - }else */ if(!WebConstant.ACCOUNT_TYPE.SYSADMIN.toString().equals(user.getAccountType())){ //获取用户租户对应关系 Short tenantType=getUserTenantType(user,tenantId,tenants); @@ -242,14 +233,7 @@ public List queryUserPermission(SysUser user, Long tenantId){ List dtos= origins.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()->new TreeSet<>(Comparator.comparing(f->f.getId()+"|"+f.getAssignType()))),ArrayList::new)); return dtos.stream().sorted(Comparator.comparing(SysResourceDTO::getId).thenComparing(SysResourceDTO::getAssignType).reversed()).collect(Collectors.toList()); } - /*public List getSuperAdminConfigUserPermissions(SysUser user){ - if(WebConstant.ACCOUNT_TYPE.ORGADMIN.toString().equals(user.getAccountType())){ - TenantInfo info=tenantInfoService.getManagedTenant(user.getId()); - return sysParamsService.getOrgAdminDefaultPermission(info.getId()); - }else{ - return sysParamsService.getDefaultPermission(); - } - }*/ + private boolean isUserHasTenantRight(SysUser user,Long tenantId,List tenantUsers){ if(WebConstant.ACCOUNT_TYPE.SYSADMIN.toString().equals(user.getAccountType())){ return true; diff --git a/mybatisproj/src/main/java/com/robin/basis/utils/WebUtils.java b/mybatisproj/src/main/java/com/robin/basis/utils/WebUtils.java index 0facb273..f3e43110 100644 --- a/mybatisproj/src/main/java/com/robin/basis/utils/WebUtils.java +++ b/mybatisproj/src/main/java/com/robin/basis/utils/WebUtils.java @@ -98,10 +98,10 @@ public static String uploadToOss(MultipartFile file,@NonNull AbstractFileSystemA } }else{ if(SecurityUtils.isLoginUserSystemAdmin()){ - ossPath="/"+formatter.format(LocalDateTime.now())+"/"+ System.currentTimeMillis() + "." + content.getFileFormat(); + ossPath="/"+formatter.format(LocalDateTime.now())+"/"+ System.currentTimeMillis() + "." + content.getFileFormat().getValue(); fileName=ossPath; }else{ - ossPath="/"+formatter.format(LocalDateTime.now())+"/"+ System.currentTimeMillis() + "." + content.getFileFormat(); + ossPath="/"+formatter.format(LocalDateTime.now())+"/"+ System.currentTimeMillis() + "." + content.getFileFormat().getValue(); fileName=ossPath; } diff --git a/mybatisproj/src/main/java/com/robin/config/TransactionConfig.java b/mybatisproj/src/main/java/com/robin/config/TransactionConfig.java index c5606d00..faf5b720 100644 --- a/mybatisproj/src/main/java/com/robin/config/TransactionConfig.java +++ b/mybatisproj/src/main/java/com/robin/config/TransactionConfig.java @@ -27,11 +27,12 @@ @Configuration public class TransactionConfig implements TransactionManagementConfigurer { - @Resource(name = "txManager") + private PlatformTransactionManager txManager; @Bean public PlatformTransactionManager txManager(@Qualifier("dataSource") DataSource dataSource){ - return new DataSourceTransactionManager(dataSource); + txManager=new DataSourceTransactionManager(dataSource); + return txManager; } @Override diff --git a/mybatisproj/src/main/resources/logback.xml b/mybatisproj/src/main/resources/logback-spring.xml similarity index 97% rename from mybatisproj/src/main/resources/logback.xml rename to mybatisproj/src/main/resources/logback-spring.xml index d598d899..855be303 100644 --- a/mybatisproj/src/main/resources/logback.xml +++ b/mybatisproj/src/main/resources/logback-spring.xml @@ -4,7 +4,7 @@ - + From 07d53a7bd85d4d805f9af9462aa65da714854924 Mon Sep 17 00:00:00 2001 From: robinhoodjim Date: Tue, 16 Sep 2025 10:58:18 +0800 Subject: [PATCH 3/7] fix test problem --- hadooptool/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hadooptool/pom.xml b/hadooptool/pom.xml index 44957c1c..e09fd389 100644 --- a/hadooptool/pom.xml +++ b/hadooptool/pom.xml @@ -468,6 +468,11 @@ ${arrow.version} true + + org.apache.arrow + arrow-compression + ${arrow.version} + io.netty netty-handler From 9028e5d48642aadc6b9c2ef2cde39a7ddd97fc37 Mon Sep 17 00:00:00 2001 From: robinhoodjim Date: Tue, 23 Sep 2025 11:00:59 +0800 Subject: [PATCH 4/7] mybatisproj background related vite ui --- viteui/.env.demo | 2 + viteui/.env.development | 4 + viteui/.env.production | 2 + viteui/.gitignore | 25 + viteui/index.html | 16 + viteui/jsconfig.json | 14 + viteui/package-lock.json | 10044 ++++++++++++++++ viteui/package.json | 41 + viteui/postcss.config.js | 6 + viteui/public/tauri.svg | 6 + viteui/public/vite.svg | 1 + viteui/src/App.vue | 10 + viteui/src/api/axios.js | 66 + viteui/src/api/dashboard/home.js | 8 + viteui/src/api/gms/brand.js | 36 + viteui/src/api/gms/goods.js | 32 + viteui/src/api/gms/goodsCategory.js | 35 + viteui/src/api/index.js | 44 + viteui/src/api/mock.js | 90 + viteui/src/api/oms/order.js | 28 + viteui/src/api/pos/pos.js | 23 + viteui/src/api/system/auth.js | 29 + viteui/src/api/system/dict.js | 73 + viteui/src/api/system/employee.js | 24 + viteui/src/api/system/org.js | 34 + viteui/src/api/system/orgUser.js | 29 + viteui/src/api/system/permission.js | 27 + viteui/src/api/system/role.js | 33 + viteui/src/api/system/tenant.js | 32 + viteui/src/api/system/user.js | 47 + viteui/src/api/template.js | 24 + viteui/src/api/ums/member.js | 25 + viteui/src/api/ums/provinces.js | 17 + .../src/assets/icons/arrow-collapse-all.svg | 6 + viteui/src/assets/icons/arrow-expand-all.svg | 5 + viteui/src/assets/icons/calculator.svg | 10 + viteui/src/assets/icons/down.svg | 12 + viteui/src/assets/icons/error-404.svg | 30 + .../src/assets/icons/home-inventoryValue.svg | 16 + viteui/src/assets/icons/home-order.svg | 1 + viteui/src/assets/icons/home-profit.svg | 13 + viteui/src/assets/icons/home-sale.svg | 1 + viteui/src/assets/icons/menu-close.svg | 5 + viteui/src/assets/icons/menu-open.svg | 5 + viteui/src/assets/icons/menu.svg | 4 + viteui/src/assets/icons/moon.svg | 5 + viteui/src/assets/icons/open/app.svg | 7 + viteui/src/assets/icons/open/dashboard.svg | 17 + viteui/src/assets/icons/open/gms-brand.svg | 9 + viteui/src/assets/icons/open/gms-goods.svg | 9 + viteui/src/assets/icons/open/gms.svg | 12 + viteui/src/assets/icons/open/oms-order.svg | 27 + viteui/src/assets/icons/open/oms.svg | 27 + viteui/src/assets/icons/open/pos.svg | 15 + viteui/src/assets/icons/open/sys-dict.svg | 7 + viteui/src/assets/icons/open/sys-manage.svg | 5 + .../src/assets/icons/open/sys-permission.svg | 7 + viteui/src/assets/icons/open/sys-role.svg | 13 + viteui/src/assets/icons/open/sys-tenant.svg | 11 + viteui/src/assets/icons/open/sys-user.svg | 9 + viteui/src/assets/icons/open/ums-member.svg | 6 + viteui/src/assets/icons/open/ums.svg | 6 + viteui/src/assets/icons/search.svg | 5 + viteui/src/assets/icons/sun.svg | 5 + viteui/src/assets/icons/vue.svg | 1 + viteui/src/assets/icons/window-close.svg | 4 + viteui/src/components/ComputeInput.vue | 41 + viteui/src/components/Crud/MoneyCUD.vue | 107 + viteui/src/components/Crud/MoneyCrud.js | 257 + viteui/src/components/Crud/MoneyCrudTable.vue | 51 + viteui/src/components/Crud/MoneyForm.vue | 62 + viteui/src/components/Crud/MoneyRR.vue | 24 + viteui/src/components/Crud/MoneyUD.vue | 37 + viteui/src/components/IconSelect.vue | 41 + viteui/src/components/PageWrapper.vue | 9 + viteui/src/components/PcdLinkage.vue | 36 + viteui/src/components/SvgIcon.vue | 36 + viteui/src/components/TenantCard.vue | 70 + viteui/src/composables/globalProp.js | 11 + viteui/src/composables/index.js | 41 + viteui/src/composables/token.js | 6 + viteui/src/layouts/DashboardLayout.vue | 26 + viteui/src/layouts/Logo.vue | 103 + viteui/src/layouts/footer/Footer.vue | 19 + viteui/src/layouts/navbar/Navbar.vue | 138 + viteui/src/layouts/sidebar/Sidebar.vue | 47 + viteui/src/layouts/sidebar/SidebarContent.vue | 34 + viteui/src/layouts/sidebar/SidebarHeader.vue | 26 + viteui/src/layouts/sidebar/SidebarLink.vue | 39 + viteui/src/layouts/sidebar/SidebarMenu.vue | 29 + viteui/src/main.js | 17 + viteui/src/money.config.js | 41 + viteui/src/plugins/index.js | 33 + viteui/src/router/index.js | 53 + viteui/src/router/interceptor.js | 46 + viteui/src/store/index.js | 12 + viteui/src/store/modules/app.js | 39 + viteui/src/store/modules/user.js | 133 + viteui/src/style/main.css | 27 + viteui/src/style/reset-element.css | 18 + viteui/src/style/tailwind.css | 3 + viteui/src/utils/index.js | 7 + viteui/src/views/Login.vue | 155 + viteui/src/views/dashboard/index.vue | 63 + viteui/src/views/error/NotFound.vue | 17 + viteui/src/views/gms/brand/index.vue | 96 + viteui/src/views/gms/goods/GoodsCategory.vue | 86 + viteui/src/views/gms/goods/index.vue | 288 + viteui/src/views/oms/order/detail.vue | 241 + viteui/src/views/oms/order/index.vue | 175 + viteui/src/views/personal/index.vue | 135 + viteui/src/views/pos/index.vue | 394 + viteui/src/views/pos/printOrder.vue | 63 + viteui/src/views/system/dict/index.vue | 185 + viteui/src/views/system/employee/index.vue | 183 + viteui/src/views/system/menu/index.vue | 225 + viteui/src/views/system/org/index.vue | 306 + viteui/src/views/system/role/index.vue | 190 + viteui/src/views/system/tenant/index.vue | 113 + viteui/src/views/system/user/index.vue | 232 + viteui/src/views/template/index.vue | 67 + viteui/src/views/ums/member/index.vue | 147 + viteui/tailwind.config.js | 10 + viteui/vite.config.js | 43 + 124 files changed, 16375 insertions(+) create mode 100644 viteui/.env.demo create mode 100644 viteui/.env.development create mode 100644 viteui/.env.production create mode 100644 viteui/.gitignore create mode 100644 viteui/index.html create mode 100644 viteui/jsconfig.json create mode 100644 viteui/package-lock.json create mode 100644 viteui/package.json create mode 100644 viteui/postcss.config.js create mode 100644 viteui/public/tauri.svg create mode 100644 viteui/public/vite.svg create mode 100644 viteui/src/App.vue create mode 100644 viteui/src/api/axios.js create mode 100644 viteui/src/api/dashboard/home.js create mode 100644 viteui/src/api/gms/brand.js create mode 100644 viteui/src/api/gms/goods.js create mode 100644 viteui/src/api/gms/goodsCategory.js create mode 100644 viteui/src/api/index.js create mode 100644 viteui/src/api/mock.js create mode 100644 viteui/src/api/oms/order.js create mode 100644 viteui/src/api/pos/pos.js create mode 100644 viteui/src/api/system/auth.js create mode 100644 viteui/src/api/system/dict.js create mode 100644 viteui/src/api/system/employee.js create mode 100644 viteui/src/api/system/org.js create mode 100644 viteui/src/api/system/orgUser.js create mode 100644 viteui/src/api/system/permission.js create mode 100644 viteui/src/api/system/role.js create mode 100644 viteui/src/api/system/tenant.js create mode 100644 viteui/src/api/system/user.js create mode 100644 viteui/src/api/template.js create mode 100644 viteui/src/api/ums/member.js create mode 100644 viteui/src/api/ums/provinces.js create mode 100644 viteui/src/assets/icons/arrow-collapse-all.svg create mode 100644 viteui/src/assets/icons/arrow-expand-all.svg create mode 100644 viteui/src/assets/icons/calculator.svg create mode 100644 viteui/src/assets/icons/down.svg create mode 100644 viteui/src/assets/icons/error-404.svg create mode 100644 viteui/src/assets/icons/home-inventoryValue.svg create mode 100644 viteui/src/assets/icons/home-order.svg create mode 100644 viteui/src/assets/icons/home-profit.svg create mode 100644 viteui/src/assets/icons/home-sale.svg create mode 100644 viteui/src/assets/icons/menu-close.svg create mode 100644 viteui/src/assets/icons/menu-open.svg create mode 100644 viteui/src/assets/icons/menu.svg create mode 100644 viteui/src/assets/icons/moon.svg create mode 100644 viteui/src/assets/icons/open/app.svg create mode 100644 viteui/src/assets/icons/open/dashboard.svg create mode 100644 viteui/src/assets/icons/open/gms-brand.svg create mode 100644 viteui/src/assets/icons/open/gms-goods.svg create mode 100644 viteui/src/assets/icons/open/gms.svg create mode 100644 viteui/src/assets/icons/open/oms-order.svg create mode 100644 viteui/src/assets/icons/open/oms.svg create mode 100644 viteui/src/assets/icons/open/pos.svg create mode 100644 viteui/src/assets/icons/open/sys-dict.svg create mode 100644 viteui/src/assets/icons/open/sys-manage.svg create mode 100644 viteui/src/assets/icons/open/sys-permission.svg create mode 100644 viteui/src/assets/icons/open/sys-role.svg create mode 100644 viteui/src/assets/icons/open/sys-tenant.svg create mode 100644 viteui/src/assets/icons/open/sys-user.svg create mode 100644 viteui/src/assets/icons/open/ums-member.svg create mode 100644 viteui/src/assets/icons/open/ums.svg create mode 100644 viteui/src/assets/icons/search.svg create mode 100644 viteui/src/assets/icons/sun.svg create mode 100644 viteui/src/assets/icons/vue.svg create mode 100644 viteui/src/assets/icons/window-close.svg create mode 100644 viteui/src/components/ComputeInput.vue create mode 100644 viteui/src/components/Crud/MoneyCUD.vue create mode 100644 viteui/src/components/Crud/MoneyCrud.js create mode 100644 viteui/src/components/Crud/MoneyCrudTable.vue create mode 100644 viteui/src/components/Crud/MoneyForm.vue create mode 100644 viteui/src/components/Crud/MoneyRR.vue create mode 100644 viteui/src/components/Crud/MoneyUD.vue create mode 100644 viteui/src/components/IconSelect.vue create mode 100644 viteui/src/components/PageWrapper.vue create mode 100644 viteui/src/components/PcdLinkage.vue create mode 100644 viteui/src/components/SvgIcon.vue create mode 100644 viteui/src/components/TenantCard.vue create mode 100644 viteui/src/composables/globalProp.js create mode 100644 viteui/src/composables/index.js create mode 100644 viteui/src/composables/token.js create mode 100644 viteui/src/layouts/DashboardLayout.vue create mode 100644 viteui/src/layouts/Logo.vue create mode 100644 viteui/src/layouts/footer/Footer.vue create mode 100644 viteui/src/layouts/navbar/Navbar.vue create mode 100644 viteui/src/layouts/sidebar/Sidebar.vue create mode 100644 viteui/src/layouts/sidebar/SidebarContent.vue create mode 100644 viteui/src/layouts/sidebar/SidebarHeader.vue create mode 100644 viteui/src/layouts/sidebar/SidebarLink.vue create mode 100644 viteui/src/layouts/sidebar/SidebarMenu.vue create mode 100644 viteui/src/main.js create mode 100644 viteui/src/money.config.js create mode 100644 viteui/src/plugins/index.js create mode 100644 viteui/src/router/index.js create mode 100644 viteui/src/router/interceptor.js create mode 100644 viteui/src/store/index.js create mode 100644 viteui/src/store/modules/app.js create mode 100644 viteui/src/store/modules/user.js create mode 100644 viteui/src/style/main.css create mode 100644 viteui/src/style/reset-element.css create mode 100644 viteui/src/style/tailwind.css create mode 100644 viteui/src/utils/index.js create mode 100644 viteui/src/views/Login.vue create mode 100644 viteui/src/views/dashboard/index.vue create mode 100644 viteui/src/views/error/NotFound.vue create mode 100644 viteui/src/views/gms/brand/index.vue create mode 100644 viteui/src/views/gms/goods/GoodsCategory.vue create mode 100644 viteui/src/views/gms/goods/index.vue create mode 100644 viteui/src/views/oms/order/detail.vue create mode 100644 viteui/src/views/oms/order/index.vue create mode 100644 viteui/src/views/personal/index.vue create mode 100644 viteui/src/views/pos/index.vue create mode 100644 viteui/src/views/pos/printOrder.vue create mode 100644 viteui/src/views/system/dict/index.vue create mode 100644 viteui/src/views/system/employee/index.vue create mode 100644 viteui/src/views/system/menu/index.vue create mode 100644 viteui/src/views/system/org/index.vue create mode 100644 viteui/src/views/system/role/index.vue create mode 100644 viteui/src/views/system/tenant/index.vue create mode 100644 viteui/src/views/system/user/index.vue create mode 100644 viteui/src/views/template/index.vue create mode 100644 viteui/src/views/ums/member/index.vue create mode 100644 viteui/tailwind.config.js create mode 100644 viteui/vite.config.js diff --git a/viteui/.env.demo b/viteui/.env.demo new file mode 100644 index 00000000..151105eb --- /dev/null +++ b/viteui/.env.demo @@ -0,0 +1,2 @@ +VITE_TITLE=管理系统 +VITE_BASE_URL=/backserver/api diff --git a/viteui/.env.development b/viteui/.env.development new file mode 100644 index 00000000..c31b64e9 --- /dev/null +++ b/viteui/.env.development @@ -0,0 +1,4 @@ +# 填写该值开启纯前端模式,所有请求不会真实触发,使用 mock.js 里的数据。可选值:alert/log +VITE_ONLY_UI= +VITE_TITLE=管理系统 +VITE_BASE_URL=http://localhost:8099/ diff --git a/viteui/.env.production b/viteui/.env.production new file mode 100644 index 00000000..23942b1d --- /dev/null +++ b/viteui/.env.production @@ -0,0 +1,2 @@ +VITE_TITLE=管理系统 +VITE_BASE_URL=/webuiapi diff --git a/viteui/.gitignore b/viteui/.gitignore new file mode 100644 index 00000000..109423fa --- /dev/null +++ b/viteui/.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-ssr +dist.zip +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/viteui/index.html b/viteui/index.html new file mode 100644 index 00000000..f892a570 --- /dev/null +++ b/viteui/index.html @@ -0,0 +1,16 @@ + + + + + + + + + QK-Money UI + + + +
+ + + diff --git a/viteui/jsconfig.json b/viteui/jsconfig.json new file mode 100644 index 00000000..2692d165 --- /dev/null +++ b/viteui/jsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": [ + "./src/*" + ] + } + }, + "include": [ + "./src/**/*" + ] + } + \ No newline at end of file diff --git a/viteui/package-lock.json b/viteui/package-lock.json new file mode 100644 index 00000000..315baab9 --- /dev/null +++ b/viteui/package-lock.json @@ -0,0 +1,10044 @@ +{ + "name": "webui", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "webui", + "version": "0.1.0", + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "@vueuse/core": "^10.4.1", + "@vueuse/integrations": "^10.4.1", + "axios": "^1.6.8", + "dayjs": "^1.11.10", + "echarts": "^5.4.3", + "element-plus": "^2.6.2", + "nprogress": "^0.2.0", + "number-precision": "^1.6.0", + "pinia": "^2.1.4", + "print-js": "^1.6.0", + "vue": "^3.3.4", + "vue-echarts": "^6.6.1", + "vue-router": "^4.2.4", + "vue3-perfect-scrollbar": "^1.6.1" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.0.0", + "autoprefixer": "^10.4.15", + "less": "^4.1.3", + "postcss": "^8.4.29", + "tailwindcss": "^3.3.3", + "unplugin-auto-import": "^0.16.6", + "unplugin-vue-components": "^0.25.1", + "vite": "^4.2.1", + "vite-plugin-svg-icons": "^2.0.1" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz", + "integrity": "sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.4.tgz", + "integrity": "sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.2.tgz", + "integrity": "sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==", + "optional": true, + "peer": true + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "20.6.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.1.tgz", + "integrity": "sha512-4LcJvuXQlv4lTHnxwyHQZ3uR9Zw2j7m1C9DfuwoTFQQP4Pmu04O6IfLYgMmHoOCt0nosItLLZAH+sOrRE0Bo8g==", + "dev": true + }, + "node_modules/@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.4.tgz", + "integrity": "sha512-ciXNIHKPriERBisHFBvnTbfKa6r9SAesOYXeGDzgegcvy9Q4xdScSHAmKbNT0M3O0S9LKhIf5/G+UYG4NnnzYw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "dependencies": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "dependencies": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "dependencies": { + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "dependencies": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "dependencies": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + }, + "peerDependencies": { + "vue": "3.3.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "node_modules/@vueuse/core": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.4.1.tgz", + "integrity": "sha512-DkHIfMIoSIBjMgRRvdIvxsyboRZQmImofLyOHADqiVbQVilP8VVHDhBX2ZqoItOgu7dWa8oXiNnScOdPLhdEXg==", + "dependencies": { + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.4.1", + "@vueuse/shared": "10.4.1", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.4.1.tgz", + "integrity": "sha512-uRBPyG5Lxoh1A/J+boiioPT3ELEAPEo4t8W6Mr4yTKIQBeW/FcbsotZNPr4k9uz+3QEksMmflWloS9wCnypM7g==", + "dependencies": { + "@vueuse/core": "10.4.1", + "@vueuse/shared": "10.4.1", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "*", + "axios": "*", + "change-case": "*", + "drauu": "*", + "focus-trap": "*", + "fuse.js": "*", + "idb-keyval": "*", + "jwt-decode": "*", + "nprogress": "*", + "qrcode": "*", + "sortablejs": "*", + "universal-cookie": "*" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.4.1.tgz", + "integrity": "sha512-2Sc8X+iVzeuMGHr6O2j4gv/zxvQGGOYETYXEc41h0iZXIRnRbJZGmY/QP8dvzqUelf8vg0p/yEA5VpCEu+WpZg==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.4.1.tgz", + "integrity": "sha512-vz5hbAM4qA0lDKmcr2y3pPdU+2EVw/yzfRsBdu+6+USGa4PxqSQRYIUC9/NcT06y+ZgaTsyURw2I9qOFaaXHAg==", + "dependencies": { + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "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": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "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": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "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": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "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": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "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/autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.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/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "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": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "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/chalk/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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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/chokidar/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "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": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/echarts": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz", + "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.4.4" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.522", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.522.tgz", + "integrity": "sha512-KGKjcafTpOxda0kqwQ72M0tDmX6RsGhUJTy0Hr7slt0+CgHh9Oex8JdjY9Og68dUkTLUlBOJC0A5W5Mw3QSGCg==" + }, + "node_modules/element-plus": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.6.2.tgz", + "integrity": "sha512-WFMv1v83l437Xu+GeeM+ytxd9VUQpR4418BowvTVIPYItsoj6yK0ITIuSv19iCesF405FbAOaCIHXhJch0ilFA==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.3", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/element-plus/node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + }, + "node_modules/element-plus/node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/element-plus/node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/element-plus/node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/element-plus/node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/element-plus/node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "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" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "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/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "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": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "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/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "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-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "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": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "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-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "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": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "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": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "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-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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/less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/magic-string": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "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": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "node_modules/merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/mlly": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.3.0" + } + }, + "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, + "optional": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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/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/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "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/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "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/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "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/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/number-precision": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/number-precision/-/number-precision-1.6.0.tgz", + "integrity": "sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "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": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "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": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "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": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "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-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "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": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/perfect-scrollbar": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", + "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinia": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.6.tgz", + "integrity": "sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "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": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "dev": true, + "peerDependencies": { + "postcss": ">4 <9" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "dev": true, + "dependencies": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "dev": true, + "dependencies": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + } + }, + "node_modules/posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "1.0.5" + } + }, + "node_modules/posthtml-rename-id/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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "dependencies": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "node_modules/print-js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/print-js/-/print-js-1.6.0.tgz", + "integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "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/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "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": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "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/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": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/resize-detector": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/resize-detector/-/resize-detector-0.3.0.tgz", + "integrity": "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==" + }, + "node_modules/resolve": { + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.5.tgz", + "integrity": "sha512-qWhv7PF1V95QPvRoUGHxOtnAlEvlXBylMZcjUR9pAumMmveFtcHJRXGIr+TkjfNJVQypqv2qcDiiars2y1PsSg==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "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/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.1.tgz", + "integrity": "sha512-c+ebvQz0VIH4KhhCpDsI+Bik0eT8ZFEVZEYw0cGMVqIP8zc+gnwl7iXCamTw7vzv2MeuZFZfdx5JJIq+ehzDlg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "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==", + "dev": true, + "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-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "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==", + "dev": true, + "optional": true + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "node_modules/scule": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz", + "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==", + "dev": true + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "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/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/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "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-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "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": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "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": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.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==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "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==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "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": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "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/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "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": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + } + }, + "node_modules/svg-baker/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/svg-baker/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "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/svg-baker/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "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/svg-baker/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/svg-baker/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/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": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "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": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "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": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/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/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "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/to-regex/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/ufo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz", + "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==", + "dev": true + }, + "node_modules/unimport": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.3.0.tgz", + "integrity": "sha512-3jhq3ZG5hFZzrWGDCpx83kjPzefP/EeuKkIO1T0MA4Zwj+dO/Og1mFvZ4aZ5WSDm0FVbbdVIRH1zKBG7c4wOpg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.4", + "escape-string-regexp": "^5.0.0", + "fast-glob": "^3.3.1", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.3", + "mlly": "^1.4.1", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "scule": "^1.0.0", + "strip-literal": "^1.3.0", + "unplugin": "^1.4.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/universal-cookie": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-6.1.1.tgz", + "integrity": "sha512-33S9x3CpdUnnjwTNs2Fgc41WGve2tdLtvaK2kPSbZRc5pGpz2vQFbRWMxlATsxNNe/Cy8SzmnmbuBM85jpZPtA==", + "optional": true, + "peer": true, + "dependencies": { + "@types/cookie": "^0.5.1", + "cookie": "^0.5.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.4.0.tgz", + "integrity": "sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "node_modules/unplugin-auto-import": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.16.6.tgz", + "integrity": "sha512-M+YIITkx3C/Hg38hp8HmswP5mShUUyJOzpifv7RTlAbeFlO2Tyw0pwrogSSxnipHDPTtI8VHFBpkYkNKzYSuyA==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.5", + "@rollup/pluginutils": "^5.0.2", + "fast-glob": "^3.3.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "minimatch": "^9.0.2", + "unimport": "^3.0.14", + "unplugin": "^1.3.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-auto-import/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/unplugin-auto-import/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.25.2.tgz", + "integrity": "sha512-OVmLFqILH6w+eM8fyt/d/eoJT9A6WO51NZLf1vC5c1FZ4rmq2bbGxTy8WP2Jm7xwFdukaIdv819+UI7RClPyCA==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.5", + "@rollup/pluginutils": "^5.0.2", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.3.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "minimatch": "^9.0.3", + "resolve": "^1.22.2", + "unplugin": "^1.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/unplugin-vue-components/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/unplugin-vue-components/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==", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "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": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "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": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "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": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "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": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "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 + } + } + }, + "node_modules/vite-plugin-svg-icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz", + "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==", + "dev": true, + "dependencies": { + "@types/svgo": "^2.6.1", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "pathe": "^0.2.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite-plugin-svg-icons/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/vite-plugin-svg-icons/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==", + "dev": true + }, + "node_modules/vite-plugin-svg-icons/node_modules/pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + }, + "node_modules/vue": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/vue-echarts": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/vue-echarts/-/vue-echarts-6.6.1.tgz", + "integrity": "sha512-EpreTzlNeJ+eaUn0AhXEmKJk98xJGecgTqAdyZovoXWnhTxnlW2HuBM0ei3y8rLw1JCUabf8/sYvxjlr8SzBKQ==", + "hasInstallScript": true, + "dependencies": { + "resize-detector": "^0.3.0", + "vue-demi": "^0.13.11" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.5", + "echarts": "^5.4.1", + "vue": "^2.6.12 || ^3.1.1" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-echarts/node_modules/vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz", + "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue3-perfect-scrollbar": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vue3-perfect-scrollbar/-/vue3-perfect-scrollbar-1.6.1.tgz", + "integrity": "sha512-r9wfxlFwVyHXMPKG0PnR7fDfJPQ20KEVzKQfSU5by2WKYz2PwV0bTfyfejmEyZXsXL0O8VtSWtgxfPuFR2AGOg==", + "dependencies": { + "cssnano": "^5.1.14", + "perfect-scrollbar": "^1.5.5", + "postcss-import": "^12.0.0" + } + }, + "node_modules/vue3-perfect-scrollbar/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/vue3-perfect-scrollbar/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/vue3-perfect-scrollbar/node_modules/postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dependencies": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/vue3-perfect-scrollbar/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zrender": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz", + "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + }, + "dependencies": { + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true + }, + "@antfu/utils": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz", + "integrity": "sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==", + "dev": true + }, + "@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==" + }, + "@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==" + }, + "@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "requires": {} + }, + "@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "dev": true, + "optional": true + }, + "@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "requires": { + "@floating-ui/utils": "^0.2.1" + } + }, + "@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "requires": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@popperjs/core": { + "version": "npm:@sxzz/popperjs-es@2.11.7", + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" + }, + "@rollup/pluginutils": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.4.tgz", + "integrity": "sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" + }, + "@types/cookie": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.2.tgz", + "integrity": "sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==", + "optional": true, + "peer": true + }, + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "@types/lodash": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==" + }, + "@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "requires": { + "@types/lodash": "*" + } + }, + "@types/node": { + "version": "20.6.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.1.tgz", + "integrity": "sha512-4LcJvuXQlv4lTHnxwyHQZ3uR9Zw2j7m1C9DfuwoTFQQP4Pmu04O6IfLYgMmHoOCt0nosItLLZAH+sOrRE0Bo8g==", + "dev": true + }, + "@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/web-bluetooth": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==" + }, + "@vitejs/plugin-vue": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.4.tgz", + "integrity": "sha512-ciXNIHKPriERBisHFBvnTbfKa6r9SAesOYXeGDzgegcvy9Q4xdScSHAmKbNT0M3O0S9LKhIf5/G+UYG4NnnzYw==", + "dev": true, + "requires": {} + }, + "@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "requires": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "requires": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "requires": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "requires": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "requires": { + "@vue/shared": "3.3.4" + } + }, + "@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "requires": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "requires": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "requires": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "requires": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "@vueuse/core": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.4.1.tgz", + "integrity": "sha512-DkHIfMIoSIBjMgRRvdIvxsyboRZQmImofLyOHADqiVbQVilP8VVHDhBX2ZqoItOgu7dWa8oXiNnScOdPLhdEXg==", + "requires": { + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.4.1", + "@vueuse/shared": "10.4.1", + "vue-demi": ">=0.14.5" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "requires": {} + } + } + }, + "@vueuse/integrations": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.4.1.tgz", + "integrity": "sha512-uRBPyG5Lxoh1A/J+boiioPT3ELEAPEo4t8W6Mr4yTKIQBeW/FcbsotZNPr4k9uz+3QEksMmflWloS9wCnypM7g==", + "requires": { + "@vueuse/core": "10.4.1", + "@vueuse/shared": "10.4.1", + "vue-demi": ">=0.14.5" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "requires": {} + } + } + }, + "@vueuse/metadata": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.4.1.tgz", + "integrity": "sha512-2Sc8X+iVzeuMGHr6O2j4gv/zxvQGGOYETYXEc41h0iZXIRnRbJZGmY/QP8dvzqUelf8vg0p/yEA5VpCEu+WpZg==" + }, + "@vueuse/shared": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.4.1.tgz", + "integrity": "sha512-vz5hbAM4qA0lDKmcr2y3pPdU+2EVw/yzfRsBdu+6+USGa4PxqSQRYIUC9/NcT06y+ZgaTsyURw2I9qOFaaXHAg==", + "requires": { + "vue-demi": ">=0.14.5" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "requires": {} + } + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "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": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, + "async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "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 + }, + "autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "requires": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "requires": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "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": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "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": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "requires": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + } + }, + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "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" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "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" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "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": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "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 + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "optional": true, + "peer": true + }, + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "requires": { + "is-what": "^3.14.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "requires": {} + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + } + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "requires": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "dependencies": { + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + } + } + }, + "cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "requires": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + } + }, + "cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "requires": {} + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + } + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "echarts": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz", + "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==", + "requires": { + "tslib": "2.3.0", + "zrender": "5.4.4" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "electron-to-chromium": { + "version": "1.4.522", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.522.tgz", + "integrity": "sha512-KGKjcafTpOxda0kqwQ72M0tDmX6RsGhUJTy0Hr7slt0+CgHh9Oex8JdjY9Og68dUkTLUlBOJC0A5W5Mw3QSGCg==" + }, + "element-plus": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.6.2.tgz", + "integrity": "sha512-WFMv1v83l437Xu+GeeM+ytxd9VUQpR4418BowvTVIPYItsoj6yK0ITIuSv19iCesF405FbAOaCIHXhJch0ilFA==", + "requires": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.3", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "dependencies": { + "@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + }, + "@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "requires": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "requires": {} + } + } + }, + "@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" + }, + "@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "requires": { + "vue-demi": "*" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "requires": {} + } + } + } + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "requires": { + "@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": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "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": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "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" + } + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "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==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "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-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "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": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.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==", + "dev": true + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "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": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "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 + }, + "less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^2.3.0" + } + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "requires": {} + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "magic-string": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.1" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "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" + } + } + } + }, + "mlly": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "dev": true, + "requires": { + "acorn": "^8.10.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.3.0" + } + }, + "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, + "optional": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + }, + "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": { + "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" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "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 + } + } + }, + "needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + } + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "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 + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "number-precision": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/number-precision/-/number-precision-1.6.0.tgz", + "integrity": "sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "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": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "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": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "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 + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "perfect-scrollbar": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", + "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, + "pinia": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.6.tgz", + "integrity": "sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==", + "requires": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "requires": {} + } + } + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true + }, + "pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "requires": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "requires": {} + }, + "postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "requires": {} + }, + "postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "requires": {} + }, + "postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "requires": {} + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + } + }, + "postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + } + }, + "postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "requires": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, + "postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "requires": {} + }, + "postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "requires": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "dev": true, + "requires": {} + }, + "postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + } + }, + "postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "dev": true, + "requires": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + } + }, + "posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "dev": true, + "requires": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + } + }, + "posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } + } + }, + "posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true + }, + "posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "requires": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "print-js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/print-js/-/print-js-1.6.0.tgz", + "integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==" + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + } + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "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": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "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" + } + } + } + }, + "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": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "resize-detector": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/resize-detector/-/resize-detector-0.3.0.tgz", + "integrity": "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==" + }, + "resolve": { + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.5.tgz", + "integrity": "sha512-qWhv7PF1V95QPvRoUGHxOtnAlEvlXBylMZcjUR9pAumMmveFtcHJRXGIr+TkjfNJVQypqv2qcDiiars2y1PsSg==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "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 + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rollup": { + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.1.tgz", + "integrity": "sha512-c+ebvQz0VIH4KhhCpDsI+Bik0eT8ZFEVZEYw0cGMVqIP8zc+gnwl7iXCamTw7vzv2MeuZFZfdx5JJIq+ehzDlg==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "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==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "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==", + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "scule": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz", + "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==", + "dev": true + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true + }, + "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" + } + }, + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "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": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "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": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "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": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "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" + } + } + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "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": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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" + } + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "requires": { + "acorn": "^8.10.0" + } + }, + "stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "requires": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + } + }, + "sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + }, + "dependencies": { + "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" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + } + } + }, + "tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + } + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "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": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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": { + "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" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "dev": true + }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "ufo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz", + "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==", + "dev": true + }, + "unimport": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.3.0.tgz", + "integrity": "sha512-3jhq3ZG5hFZzrWGDCpx83kjPzefP/EeuKkIO1T0MA4Zwj+dO/Og1mFvZ4aZ5WSDm0FVbbdVIRH1zKBG7c4wOpg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.4", + "escape-string-regexp": "^5.0.0", + "fast-glob": "^3.3.1", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.3", + "mlly": "^1.4.1", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "scule": "^1.0.0", + "strip-literal": "^1.3.0", + "unplugin": "^1.4.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" + } + }, + "universal-cookie": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-6.1.1.tgz", + "integrity": "sha512-33S9x3CpdUnnjwTNs2Fgc41WGve2tdLtvaK2kPSbZRc5pGpz2vQFbRWMxlATsxNNe/Cy8SzmnmbuBM85jpZPtA==", + "optional": true, + "peer": true, + "requires": { + "@types/cookie": "^0.5.1", + "cookie": "^0.5.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unplugin": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.4.0.tgz", + "integrity": "sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "unplugin-auto-import": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.16.6.tgz", + "integrity": "sha512-M+YIITkx3C/Hg38hp8HmswP5mShUUyJOzpifv7RTlAbeFlO2Tyw0pwrogSSxnipHDPTtI8VHFBpkYkNKzYSuyA==", + "dev": true, + "requires": { + "@antfu/utils": "^0.7.5", + "@rollup/pluginutils": "^5.0.2", + "fast-glob": "^3.3.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "minimatch": "^9.0.2", + "unimport": "^3.0.14", + "unplugin": "^1.3.2" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "unplugin-vue-components": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.25.2.tgz", + "integrity": "sha512-OVmLFqILH6w+eM8fyt/d/eoJT9A6WO51NZLf1vC5c1FZ4rmq2bbGxTy8WP2Jm7xwFdukaIdv819+UI7RClPyCA==", + "dev": true, + "requires": { + "@antfu/utils": "^0.7.5", + "@rollup/pluginutils": "^5.0.2", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.3.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "minimatch": "^9.0.3", + "resolve": "^1.22.2", + "unplugin": "^1.4.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "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": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "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": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "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": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "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": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + } + }, + "vite-plugin-svg-icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz", + "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==", + "dev": true, + "requires": { + "@types/svgo": "^2.6.1", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "pathe": "^0.2.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "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==", + "dev": true + }, + "pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + } + } + }, + "vue": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "requires": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "vue-echarts": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/vue-echarts/-/vue-echarts-6.6.1.tgz", + "integrity": "sha512-EpreTzlNeJ+eaUn0AhXEmKJk98xJGecgTqAdyZovoXWnhTxnlW2HuBM0ei3y8rLw1JCUabf8/sYvxjlr8SzBKQ==", + "requires": { + "resize-detector": "^0.3.0", + "vue-demi": "^0.13.11" + }, + "dependencies": { + "vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "requires": {} + } + } + }, + "vue-router": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz", + "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", + "requires": { + "@vue/devtools-api": "^6.5.0" + } + }, + "vue3-perfect-scrollbar": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vue3-perfect-scrollbar/-/vue3-perfect-scrollbar-1.6.1.tgz", + "integrity": "sha512-r9wfxlFwVyHXMPKG0PnR7fDfJPQ20KEVzKQfSU5by2WKYz2PwV0bTfyfejmEyZXsXL0O8VtSWtgxfPuFR2AGOg==", + "requires": { + "cssnano": "^5.1.14", + "perfect-scrollbar": "^1.5.5", + "postcss-import": "^12.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true + }, + "zrender": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz", + "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==", + "requires": { + "tslib": "2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + } + } +} diff --git a/viteui/package.json b/viteui/package.json new file mode 100644 index 00000000..7c782073 --- /dev/null +++ b/viteui/package.json @@ -0,0 +1,41 @@ +{ + "name": "webui", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "build:demo": "vite build --mode demo", + "preview": "vite preview", + "tailwind": "npx tailwindcss -i ./src/style/tailwind.css --watch" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "@vueuse/core": "^10.4.1", + "@vueuse/integrations": "^10.4.1", + "axios": "^1.6.8", + "dayjs": "^1.11.10", + "echarts": "^5.4.3", + "element-plus": "^2.6.2", + "nprogress": "^0.2.0", + "number-precision": "^1.6.0", + "pinia": "^2.1.4", + "print-js": "^1.6.0", + "vue": "^3.3.4", + "vue-echarts": "^6.6.1", + "vue-router": "^4.2.4", + "vue3-perfect-scrollbar": "^1.6.1" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.0.0", + "autoprefixer": "^10.4.15", + "less": "^4.1.3", + "postcss": "^8.4.29", + "tailwindcss": "^3.3.3", + "unplugin-auto-import": "^0.16.6", + "unplugin-vue-components": "^0.25.1", + "vite": "^4.2.1", + "vite-plugin-svg-icons": "^2.0.1" + } +} diff --git a/viteui/postcss.config.js b/viteui/postcss.config.js new file mode 100644 index 00000000..2e7af2b7 --- /dev/null +++ b/viteui/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/viteui/public/tauri.svg b/viteui/public/tauri.svg new file mode 100644 index 00000000..31b62c92 --- /dev/null +++ b/viteui/public/tauri.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/viteui/public/vite.svg b/viteui/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/viteui/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/viteui/src/App.vue b/viteui/src/App.vue new file mode 100644 index 00000000..bc44a1f2 --- /dev/null +++ b/viteui/src/App.vue @@ -0,0 +1,10 @@ + + diff --git a/viteui/src/api/axios.js b/viteui/src/api/axios.js new file mode 100644 index 00000000..d62ed20b --- /dev/null +++ b/viteui/src/api/axios.js @@ -0,0 +1,66 @@ +import axios from 'axios' +import {useUserStore} from "@/store"; +import {ElMessage} from "element-plus"; +import {getToken} from "@/composables/token.js"; +import MoneyConfig from "@/money.config.js"; + +const instance = axios.create({ + baseURL: import.meta.env.VITE_BASE_URL, + timeout: 30000, +}) + +instance.interceptors.request.use(async function (config) { + // 鉴权头 + const token = getToken() + if (token) config.headers[MoneyConfig.tokenHeader] = `${MoneyConfig.tokenType} ${getToken()}` + // 租户 + const tenantCode = window.location.search.match(/(^|&|\?)tenant=([^&]*)(&|$)/i)?.[2] + if (tenantCode && (window.tenant == null || window.tenant.tenantCode !== tenantCode)) { + const body = await axios + .get(`${config.baseURL}/tenants/byCode?code=${tenantCode}`) + .then(res => res.data) + if (body.data) { + window.tenant = body.data + } else { + //throw new Error('租户不存在') + } + } + if (window.tenant) config.headers[MoneyConfig.tenantHeader] = window.tenant.id + // requestId + config.headers[MoneyConfig.requestIdHeader] = new Date().getTime() + // 国际化 + config.headers[MoneyConfig.i18nHeader] = MoneyConfig.lang + // 时区 + config.headers[MoneyConfig.timezoneHeader] = MoneyConfig.timezone + return config; +}, function (error) { + // 对请求错误做些什么 + return Promise.reject(error); +}) + +instance.interceptors.response.use(function (response) { + // 2xx 范围内的状态码都会触发该函数。 + const body = response.data + if (!body.code) return body + + if (body.code !== 200) { + const errorMsg = body.message || 'Server Error' + ElMessage.error(errorMsg) + return Promise.reject(new Error(errorMsg)) + } + return body; +}, function (error) { + // 超出 2xx 范围的状态码都会触发该函数。 + const status = parseInt(error.response && error.response.status) + if (status === 401) { + ElMessage.error('登录状态已过期') + useUserStore().logout() + } else if (status === 403) { + ElMessage.error('您没有权限哦') + } else { + ElMessage.error(error.message) + } + return Promise.reject(error); +}) + +export default instance \ No newline at end of file diff --git a/viteui/src/api/dashboard/home.js b/viteui/src/api/dashboard/home.js new file mode 100644 index 00000000..1d86f107 --- /dev/null +++ b/viteui/src/api/dashboard/home.js @@ -0,0 +1,8 @@ +import req from '../index.js' + +export default { + getHomeCount: () => req({ + url: '/home/count', + method: 'GET', + }), +} \ No newline at end of file diff --git a/viteui/src/api/gms/brand.js b/viteui/src/api/gms/brand.js new file mode 100644 index 00000000..a070738f --- /dev/null +++ b/viteui/src/api/gms/brand.js @@ -0,0 +1,36 @@ +import {req, reqMixed} from '../index.js' + +export default { + getSelect: () => req({ + url: '/gms/brand/select', + method: 'GET' + }), + list: (query) => req({ + url: '/gms/brand', + method: 'GET', + params: query + }), + add: (data) => reqMixed({ + url: '/gms/brand', + method: 'POST', + }, { + key: 'brand', + jsonData: data + }, { + logo: data.logoFile + }), + edit: (data) => reqMixed({ + url: '/gms/brand', + method: 'PUT', + }, { + key: 'brand', + jsonData: data + }, { + logo: data.logoFile + }), + del: (ids) => req({ + url: '/gms/brand', + method: 'DELETE', + data: ids, + }) +} \ No newline at end of file diff --git a/viteui/src/api/gms/goods.js b/viteui/src/api/gms/goods.js new file mode 100644 index 00000000..da4fec69 --- /dev/null +++ b/viteui/src/api/gms/goods.js @@ -0,0 +1,32 @@ +import {req, reqMixed} from '../index.js' + +export default { + list: (query) => req({ + url: '/gms/goods', + method: 'GET', + params: query + }), + add: (data) => reqMixed({ + url: '/gms/goods', + method: 'POST', + }, { + key: 'goods', + jsonData: data + }, { + pic: data.picFile + }), + edit: (data) => reqMixed({ + url: '/gms/goods', + method: 'PUT', + }, { + key: 'goods', + jsonData: data + }, { + pic: data.picFile + }), + del: (ids) => req({ + url: '/gms/goods', + method: 'DELETE', + data: ids, + }) +} \ No newline at end of file diff --git a/viteui/src/api/gms/goodsCategory.js b/viteui/src/api/gms/goodsCategory.js new file mode 100644 index 00000000..83dbf591 --- /dev/null +++ b/viteui/src/api/gms/goodsCategory.js @@ -0,0 +1,35 @@ +import {req, reqMixed} from '../index.js' + +export default { + getSelect: () => req({ + url: '/gms/goodsCategory/select', + method: 'GET', + }), + getTree: () => req({ + url: '/gms/goodsCategory/tree', + method: 'GET', + }), + add: (data) => reqMixed({ + url: '/gms/goodsCategory', + method: 'POST', + }, { + key: 'goodsCategory', + jsonData: data + }, { + icon: data.logoFile + }), + edit: (data) => reqMixed({ + url: '/gms/goodsCategory', + method: 'PUT', + }, { + key: 'goodsCategory', + jsonData: data + }, { + icon: data.logoFile + }), + del: (ids) => req({ + url: '/gms/goodsCategory', + method: 'DELETE', + data: ids, + }) +} \ No newline at end of file diff --git a/viteui/src/api/index.js b/viteui/src/api/index.js new file mode 100644 index 00000000..794351ac --- /dev/null +++ b/viteui/src/api/index.js @@ -0,0 +1,44 @@ +import instance from '@/api/axios.js' +import mock from './mock.js' + +export function req(options) { + const onlyUI = import.meta.env.VITE_ONLY_UI + if (onlyUI) { + onlyUI === 'log' ? console.log(JSON.stringify(options)) :alert(JSON.stringify(options)) + const defaultKey = `${options['method']}_default` + const key = `${options['method']}_${options['url']}` + return new Promise((resolve) => resolve(mock[key] || mock[defaultKey])) + } else { + return instance.request(options) + } +} + +export function reqForm(options) { + options.headers = {} + options.headers['Content-Type'] = 'application/x-www-form-urlencoded' + return req(options) +} + +export function reqFormData(options) { + options.headers = {} + options.headers['Content-Type'] = 'multipart/form-data' + return req(options) +} + +export function reqMixed(options, {key, jsonData}, formData) { + const data = new FormData() + if (key && jsonData) { + data.append(key, new Blob([JSON.stringify(jsonData)], { + type: 'application/json' + })) + } + if (formData) { + Object.entries(formData).forEach(kv => data.append(kv[0], kv[1])) + } + options.data = data + options.headers = {} + options.headers['Content-Type'] = 'multipart/mixed' + return req(options) +} + +export default req \ No newline at end of file diff --git a/viteui/src/api/mock.js b/viteui/src/api/mock.js new file mode 100644 index 00000000..dbbac516 --- /dev/null +++ b/viteui/src/api/mock.js @@ -0,0 +1,90 @@ +export default { + "GET_default": { + code: 200, + data: { + current: 1, + size: 10, + pages: 1, + total: 3, + records: [] + }, + }, + "GET_/auth/router": { + code: 200, + data: [{ + "path": "system", + "meta": { + "title": "系统管理", + "icon": "sys-manage" + }, + "hidden": false, + "iframe": false, + "component": "Layout", + "children": [ + { + "path": "user", + "name": "User", + "meta": { + "title": "用户管理", + "icon": "sys-user" + }, + "hidden": false, + "iframe": false, + "component": "system/user/index" + }, + { + "path": "role", + "name": "Role", + "meta": { + "title": "角色管理", + "icon": "sys-role" + }, + "hidden": false, + "iframe": false, + "component": "system/role/index" + }, + { + "path": "permission", + "name": "Permission", + "meta": { + "title": "权限管理", + "icon": "sys-permission" + }, + "hidden": false, + "iframe": false, + "component": "system/permission/index" + }, + { + "path": "dict", + "name": "Dict", + "meta": { + "title": "字典管理", + "icon": "sys-dict" + }, + "hidden": false, + "iframe": false, + "component": "system/dict/index" + }, + { + "path": "tenant", + "name": "Tenant", + "meta": { + "title": "租户管理", + "icon": "sys-tenant" + }, + "hidden": false, + "iframe": false, + "component": "system/tenant/index" + } + ] + }] + }, + "GET_/auth/own": { + code: 200, + data: { + info: {avatar: 'https://7up.pics/images/2023/10/21/batman.png'}, + roles: [{level: 0}], + permissions: [] + } + } +} \ No newline at end of file diff --git a/viteui/src/api/oms/order.js b/viteui/src/api/oms/order.js new file mode 100644 index 00000000..f44eb15a --- /dev/null +++ b/viteui/src/api/oms/order.js @@ -0,0 +1,28 @@ +import req from '../index.js' + +export default { + list: (query) => req({ + url: `/oms/order`, + method: 'GET', + params: query + }), + getCount: (query) => req({ + url: `/oms/order/count`, + method: 'GET', + params: query + }), + getDetail: (id) => req({ + url: `/oms/order/detail?id=${id}`, + method: 'GET' + }), + returnOrder: (data) => req({ + url: `/oms/order/returnOrder`, + method: 'DELETE', + data + }), + returnGoods: (data) => req({ + url: `/oms/order/returnGoods`, + method: 'DELETE', + data + }) +} \ No newline at end of file diff --git a/viteui/src/api/pos/pos.js b/viteui/src/api/pos/pos.js new file mode 100644 index 00000000..8add9ea1 --- /dev/null +++ b/viteui/src/api/pos/pos.js @@ -0,0 +1,23 @@ +import req from '../index.js' + +export default { + listGoods: (barcode) => req({ + url: '/pos/goods', + method: 'GET', + params: { + barcode + } + }), + listMember: (member) => req({ + url: '/pos/members', + method: 'GET', + params: { + member + } + }), + settleAccounts: (data) => req({ + url: '/pos/settleAccounts', + method: 'POST', + data + }) +} \ No newline at end of file diff --git a/viteui/src/api/system/auth.js b/viteui/src/api/system/auth.js new file mode 100644 index 00000000..0e14ce15 --- /dev/null +++ b/viteui/src/api/system/auth.js @@ -0,0 +1,29 @@ +import req from '../index.js' + +export default { + getDyRoutes: () => req({ + url: '/getRouters', + method: 'GET' + }), + login: (data) => req({ + url: '/login', + method: 'POST', + data + }), + getInfo: () => req({ + url: '/getInfo', + method: 'GET' + }), + logout: () => req({ + url: '/logout', + method: 'GET', + }), + getCodeImg: () =>req({ + url: '/captchaImage', + headers: { + isToken: false + }, + method: 'get', + timeout: 20000 + }) +} \ No newline at end of file diff --git a/viteui/src/api/system/dict.js b/viteui/src/api/system/dict.js new file mode 100644 index 00000000..b7a0995d --- /dev/null +++ b/viteui/src/api/system/dict.js @@ -0,0 +1,73 @@ +import req from '../index.js' + +export default { + list: (query) => req({ + url: '/system/dict', + method: 'GET', + params: query, + }), + add: (data) => req({ + url: '/system/dict', + method: 'POST', + data, + }), + edit: (data) => req({ + url: '/system/dict', + method: 'PUT', + data, + }), + del: (ids) => req({ + url: '/system/dict', + method: 'DELETE', + data: ids, + }), + getDetail: (dict) => req({ + url: `/system/dict/code/${dict}`, + method: 'GET' + }), + addDetail: (data) => req({ + url: '/system/dict/detail', + method: 'POST', + data, + }), + editDetail: (data) => req({ + url: '/system/dict/detail', + method: 'PUT', + data, + }), + delDetail: (ids) => req({ + url: '/system/dict/detail', + method: 'DELETE', + data: ids, + }), + loadDictList :async (dictCode)=>{ + const {data} = await req({ + url: `/system/code/${dictCode}`, + method: 'GET' + }) + return data; + }, + + loadDict: async (dictList = []) => { + const dictMap = {} + for (const dict of dictList) { + const {data} = await req({ + url: `/system/code/${dict}`, + method: 'GET' + }) + if (data && data.length > 0) { + dictMap[dict] = data.map(dd => { + // TODO 多语言 先默认中文 + dd.desc = dd.label + return { + desc: dd.desc, + value: dd.value, + } + }) + dictMap[dict + 'Kv'] = {} + data.map(dd => dictMap[dict + 'Kv'][dd.value] = dd.desc) + } + } + return dictMap + } +} \ No newline at end of file diff --git a/viteui/src/api/system/employee.js b/viteui/src/api/system/employee.js new file mode 100644 index 00000000..53d4d309 --- /dev/null +++ b/viteui/src/api/system/employee.js @@ -0,0 +1,24 @@ +import req from '../index.js' + +export default { + list: (query) => req({ + url: '/system/employee', + method: 'GET', + params: query, + }), + add: (data) => req({ + url: '/system/employee', + method: 'POST', + data, + }), + edit: (data) => req({ + url: '/system/employee', + method: 'PUT', + data, + }), + del: (ids) => req({ + url: '/system/employee', + method: 'DELETE', + data: ids, + }) +} \ No newline at end of file diff --git a/viteui/src/api/system/org.js b/viteui/src/api/system/org.js new file mode 100644 index 00000000..03e6636b --- /dev/null +++ b/viteui/src/api/system/org.js @@ -0,0 +1,34 @@ +import req from '../index.js' + +export default { + list: (query) => req({ + url: '/system/org', + method: 'GET', + params: query, + }), + add: (data) => req({ + url: '/system/org', + method: 'POST', + data, + }), + edit: (data) => req({ + url: '/system/org', + method: 'PUT', + data, + }), + del: (ids) => req({ + url: '/system/org', + method: 'DELETE', + data: ids, + }), + listUser: (data) =>req({ + url:"/system/org/listUser", + method: 'POST', + data + }), + changeUser: (data) =>req({ + url:"/system/org/changeUser", + method: 'POST', + data + }) +} \ No newline at end of file diff --git a/viteui/src/api/system/orgUser.js b/viteui/src/api/system/orgUser.js new file mode 100644 index 00000000..91215146 --- /dev/null +++ b/viteui/src/api/system/orgUser.js @@ -0,0 +1,29 @@ +import req from '../index.js' + +export default { + list: (query) => req({ + url: '/system/org/listUser', + method: 'GET', + params: query, + }), + add: (data) => req({ + url: '/system/org', + method: 'POST', + data, + }), + edit: (data) => req({ + url: '/system/org', + method: 'PUT', + data, + }), + del: (ids) => req({ + url: '/system/org', + method: 'DELETE', + data: ids, + }), + changeUser: (data) =>req({ + url:"/system/org/changeUser", + method: 'POST', + data + }) +} \ No newline at end of file diff --git a/viteui/src/api/system/permission.js b/viteui/src/api/system/permission.js new file mode 100644 index 00000000..78c269a6 --- /dev/null +++ b/viteui/src/api/system/permission.js @@ -0,0 +1,27 @@ +import req from '../index.js' + +export default { + list: (query) => req({ + url: '/system/menu', + method: 'GET', + params: query, + }), + add: (data) => req({ + url: '/system/menu', + method: 'POST', + data, + }), + edit: (data) => req({ + url: '/system/menu', + method: 'PUT', + data, + }), + del: (ids) => req({ + url: '/system/menu', + method: 'DELETE', + data: ids, + }),userPermission: (userId)=> req({ + url: 'system/menu/getByUser/'+userId, + method: 'GET' + }) +} \ No newline at end of file diff --git a/viteui/src/api/system/role.js b/viteui/src/api/system/role.js new file mode 100644 index 00000000..c91153e4 --- /dev/null +++ b/viteui/src/api/system/role.js @@ -0,0 +1,33 @@ +import req from '../index.js' + +export default { + list: (query) => req({ + url: '/system/role', + method: 'GET', + params: query, + }), + add: (data) => req({ + url: '/system/role', + method: 'POST', + data, + }), + edit: (data) => req({ + url: '/roles', + method: 'PUT', + data, + }), + del: (ids) => req({ + url: '/system/role', + method: 'DELETE', + data: ids, + }), + getAll: () => req({ + url: '/system/role/all', + method: 'GET' + }), + configurePermissions: (id, permissionIds) => req({ + url: `/system/role/${id}/permission`, + method: 'POST', + data: permissionIds + }) +} \ No newline at end of file diff --git a/viteui/src/api/system/tenant.js b/viteui/src/api/system/tenant.js new file mode 100644 index 00000000..befc84a9 --- /dev/null +++ b/viteui/src/api/system/tenant.js @@ -0,0 +1,32 @@ +import {req, reqMixed} from '../index.js' + +export default { + list: (query) => req({ + url: '/tenants', + method: 'GET', + params: query, + }), + add: (data) => reqMixed({ + url: '/tenants', + method: 'POST', + }, { + key: 'tenant', + jsonData: data + }, { + logo: data.logoFile + }), + edit: (data) => reqMixed({ + url: '/tenants', + method: 'PUT', + }, { + key: 'tenant', + jsonData: data + }, { + logo: data.logoFile + }), + del: (ids) => req({ + url: '/tenants', + method: 'DELETE', + data: ids, + }) +} \ No newline at end of file diff --git a/viteui/src/api/system/user.js b/viteui/src/api/system/user.js new file mode 100644 index 00000000..76fb7890 --- /dev/null +++ b/viteui/src/api/system/user.js @@ -0,0 +1,47 @@ +import req from '../index.js' + +export default { + list: (query) => req({ + url: '/system/user', + method: 'GET', + params: query, + }), + add: (data) => req({ + url: '/system/user', + method: 'POST', + data, + }), + edit: (data) => req({ + url: '/system/user', + method: 'PUT', + data, + }), + del: (ids) => req({ + url: '/system/user', + method: 'DELETE', + data: ids, + }), + updateInfo: (data) => req({ + url: '/sytem/user/updateProfile', + method: 'POST', + data, + }), + changePassword: (data) => req({ + url: '/system/user/changePassword', + method: 'POST', + data, + }), + getUserType: (data) =>req({ + url: '/system/code/'+data, + method: 'GET' + }), + configurePermissions: (id, permissionIds) => req({ + url: `/system/user/${id}/permission/`, + method: 'POST', + data: permissionIds + }), + selectTenant: (tenantId) => req({ + url: `/selectTenant/`+tenantId, + method: 'GET', + }) +} \ No newline at end of file diff --git a/viteui/src/api/template.js b/viteui/src/api/template.js new file mode 100644 index 00000000..8257054d --- /dev/null +++ b/viteui/src/api/template.js @@ -0,0 +1,24 @@ +import req from './index.js' + +export default { + list: (query) => req({ + url: '/template', + method: 'GET', + params: query, + }), + add: (data) => req({ + url: '/template', + method: 'POST', + data, + }), + edit: (data) => req({ + url: '/template', + method: 'PUT', + data, + }), + del: (ids) => req({ + url: '/template', + method: 'DELETE', + data: ids, + }) +} \ No newline at end of file diff --git a/viteui/src/api/ums/member.js b/viteui/src/api/ums/member.js new file mode 100644 index 00000000..9fff4967 --- /dev/null +++ b/viteui/src/api/ums/member.js @@ -0,0 +1,25 @@ +import req from '../index.js' + +export default { + list: (query) => req({ + url: '/ums/member', + method: 'GET', + params: query, + }), + add: (data) => req({ + url: '/ums/member', + method: 'POST', + data, + }), + edit: (data) => req({ + url: '/ums/member', + method: 'PUT', + data, + }), + del: (ids) => req({ + url: '/ums/member', + method: 'DELETE', + data: ids, + }) +} + diff --git a/viteui/src/api/ums/provinces.js b/viteui/src/api/ums/provinces.js new file mode 100644 index 00000000..d96b4e28 --- /dev/null +++ b/viteui/src/api/ums/provinces.js @@ -0,0 +1,17 @@ +import req from '../index.js' + +export default { + loadProvinces: () => req({ + url: '/region/provinces', + method: 'GET' + }), + loadCities: (province) => req({ + url: `/region/cities?province=${province}`, + method: 'GET' + }), + loadDistricts: (city) => req({ + url: `/region/districts?city=${city}`, + method: 'GET' + }), +} + diff --git a/viteui/src/assets/icons/arrow-collapse-all.svg b/viteui/src/assets/icons/arrow-collapse-all.svg new file mode 100644 index 00000000..5ba06905 --- /dev/null +++ b/viteui/src/assets/icons/arrow-collapse-all.svg @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/viteui/src/assets/icons/arrow-expand-all.svg b/viteui/src/assets/icons/arrow-expand-all.svg new file mode 100644 index 00000000..be6cf3b3 --- /dev/null +++ b/viteui/src/assets/icons/arrow-expand-all.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/viteui/src/assets/icons/calculator.svg b/viteui/src/assets/icons/calculator.svg new file mode 100644 index 00000000..0730c6fa --- /dev/null +++ b/viteui/src/assets/icons/calculator.svg @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/down.svg b/viteui/src/assets/icons/down.svg new file mode 100644 index 00000000..c2153b07 --- /dev/null +++ b/viteui/src/assets/icons/down.svg @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/error-404.svg b/viteui/src/assets/icons/error-404.svg new file mode 100644 index 00000000..119ca64d --- /dev/null +++ b/viteui/src/assets/icons/error-404.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/home-inventoryValue.svg b/viteui/src/assets/icons/home-inventoryValue.svg new file mode 100644 index 00000000..cec2c0e0 --- /dev/null +++ b/viteui/src/assets/icons/home-inventoryValue.svg @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/home-order.svg b/viteui/src/assets/icons/home-order.svg new file mode 100644 index 00000000..acf95777 --- /dev/null +++ b/viteui/src/assets/icons/home-order.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/viteui/src/assets/icons/home-profit.svg b/viteui/src/assets/icons/home-profit.svg new file mode 100644 index 00000000..1b0f6af5 --- /dev/null +++ b/viteui/src/assets/icons/home-profit.svg @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/home-sale.svg b/viteui/src/assets/icons/home-sale.svg new file mode 100644 index 00000000..63287601 --- /dev/null +++ b/viteui/src/assets/icons/home-sale.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/viteui/src/assets/icons/menu-close.svg b/viteui/src/assets/icons/menu-close.svg new file mode 100644 index 00000000..8279cf41 --- /dev/null +++ b/viteui/src/assets/icons/menu-close.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/viteui/src/assets/icons/menu-open.svg b/viteui/src/assets/icons/menu-open.svg new file mode 100644 index 00000000..2dba5e1f --- /dev/null +++ b/viteui/src/assets/icons/menu-open.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/viteui/src/assets/icons/menu.svg b/viteui/src/assets/icons/menu.svg new file mode 100644 index 00000000..463b76e4 --- /dev/null +++ b/viteui/src/assets/icons/menu.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/viteui/src/assets/icons/moon.svg b/viteui/src/assets/icons/moon.svg new file mode 100644 index 00000000..515caeb1 --- /dev/null +++ b/viteui/src/assets/icons/moon.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/app.svg b/viteui/src/assets/icons/open/app.svg new file mode 100644 index 00000000..36df70fe --- /dev/null +++ b/viteui/src/assets/icons/open/app.svg @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/dashboard.svg b/viteui/src/assets/icons/open/dashboard.svg new file mode 100644 index 00000000..9555d75a --- /dev/null +++ b/viteui/src/assets/icons/open/dashboard.svg @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/gms-brand.svg b/viteui/src/assets/icons/open/gms-brand.svg new file mode 100644 index 00000000..f6652402 --- /dev/null +++ b/viteui/src/assets/icons/open/gms-brand.svg @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/gms-goods.svg b/viteui/src/assets/icons/open/gms-goods.svg new file mode 100644 index 00000000..3c560e74 --- /dev/null +++ b/viteui/src/assets/icons/open/gms-goods.svg @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/gms.svg b/viteui/src/assets/icons/open/gms.svg new file mode 100644 index 00000000..4061ae2b --- /dev/null +++ b/viteui/src/assets/icons/open/gms.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/oms-order.svg b/viteui/src/assets/icons/open/oms-order.svg new file mode 100644 index 00000000..7d4e9219 --- /dev/null +++ b/viteui/src/assets/icons/open/oms-order.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/oms.svg b/viteui/src/assets/icons/open/oms.svg new file mode 100644 index 00000000..f0f257db --- /dev/null +++ b/viteui/src/assets/icons/open/oms.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/pos.svg b/viteui/src/assets/icons/open/pos.svg new file mode 100644 index 00000000..e36f79e0 --- /dev/null +++ b/viteui/src/assets/icons/open/pos.svg @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/sys-dict.svg b/viteui/src/assets/icons/open/sys-dict.svg new file mode 100644 index 00000000..4e4bba7c --- /dev/null +++ b/viteui/src/assets/icons/open/sys-dict.svg @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/sys-manage.svg b/viteui/src/assets/icons/open/sys-manage.svg new file mode 100644 index 00000000..676ec4d9 --- /dev/null +++ b/viteui/src/assets/icons/open/sys-manage.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/sys-permission.svg b/viteui/src/assets/icons/open/sys-permission.svg new file mode 100644 index 00000000..1cf224a9 --- /dev/null +++ b/viteui/src/assets/icons/open/sys-permission.svg @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/sys-role.svg b/viteui/src/assets/icons/open/sys-role.svg new file mode 100644 index 00000000..e38411a2 --- /dev/null +++ b/viteui/src/assets/icons/open/sys-role.svg @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/sys-tenant.svg b/viteui/src/assets/icons/open/sys-tenant.svg new file mode 100644 index 00000000..0a1048d0 --- /dev/null +++ b/viteui/src/assets/icons/open/sys-tenant.svg @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/sys-user.svg b/viteui/src/assets/icons/open/sys-user.svg new file mode 100644 index 00000000..51f4469b --- /dev/null +++ b/viteui/src/assets/icons/open/sys-user.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/ums-member.svg b/viteui/src/assets/icons/open/ums-member.svg new file mode 100644 index 00000000..ada50ab0 --- /dev/null +++ b/viteui/src/assets/icons/open/ums-member.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/open/ums.svg b/viteui/src/assets/icons/open/ums.svg new file mode 100644 index 00000000..6298ee1d --- /dev/null +++ b/viteui/src/assets/icons/open/ums.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/viteui/src/assets/icons/search.svg b/viteui/src/assets/icons/search.svg new file mode 100644 index 00000000..19f8dcbc --- /dev/null +++ b/viteui/src/assets/icons/search.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/viteui/src/assets/icons/sun.svg b/viteui/src/assets/icons/sun.svg new file mode 100644 index 00000000..edfd3b05 --- /dev/null +++ b/viteui/src/assets/icons/sun.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/viteui/src/assets/icons/vue.svg b/viteui/src/assets/icons/vue.svg new file mode 100644 index 00000000..770e9d33 --- /dev/null +++ b/viteui/src/assets/icons/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/viteui/src/assets/icons/window-close.svg b/viteui/src/assets/icons/window-close.svg new file mode 100644 index 00000000..3e591a4f --- /dev/null +++ b/viteui/src/assets/icons/window-close.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/viteui/src/components/ComputeInput.vue b/viteui/src/components/ComputeInput.vue new file mode 100644 index 00000000..b3e6e148 --- /dev/null +++ b/viteui/src/components/ComputeInput.vue @@ -0,0 +1,41 @@ + + + \ No newline at end of file diff --git a/viteui/src/components/Crud/MoneyCUD.vue b/viteui/src/components/Crud/MoneyCUD.vue new file mode 100644 index 00000000..dc55e006 --- /dev/null +++ b/viteui/src/components/Crud/MoneyCUD.vue @@ -0,0 +1,107 @@ + + + \ No newline at end of file diff --git a/viteui/src/components/Crud/MoneyCrud.js b/viteui/src/components/Crud/MoneyCrud.js new file mode 100644 index 00000000..bbb18244 --- /dev/null +++ b/viteui/src/components/Crud/MoneyCrud.js @@ -0,0 +1,257 @@ +import {useGlobalProp} from "@/composables/globalProp.js"; + +class MoneyCrud { + _ref = null + isInit = false + // 列 + columns = [{ + prop: 'demo', + label: 'Demo', + width: '', + minWidth: '', + align: '', + fixed: '', + showOverflowTooltip: true, + sortable: 'custom', + show: true, + isMoneyUD: false + }] + // 数据 + data = [] + // 分页 + isPage = true + page = {currentPage: 1, pageSize: 10, total: 100} + + // 查询对象 + query = {} + // 默认表单对象(用于重置表单) + defaultForm = {} + // 表单对象 + form = {} + // 选中项 + selections = [] + // 默认排序 { prop: 'date', order: 'descending' } + defaultSort = {} + // 排序 + sort = {} + + // 加载后里面查询 + queryOnCreated = true + // curd 方法 + crudMethod = { + list: query => { + return new Promise((resolve, reject) => reject('未初始化该方法')) + }, + add: form => { + return new Promise((resolve, reject) => reject('未初始化该方法')) + }, + edit: form => { + return new Promise((resolve, reject) => reject('未初始化该方法')) + }, + del: ids => { + return new Promise((resolve, reject) => reject('未初始化该方法')) + }, + } + // 操作显示 + optShow = { + moneyRR: true, + checkbox: true, + add: true, + edit: true, + del: true + } + // 行操作可用 + rowOptDisabled = { + checkbox: (row) => false, + edit: (row) => false, + del: (row) => false + } + // 消息提示 + msg = { + ok: '操作成功', + add: '新增成功', + edit: '修改成功', + del: '删除成功' + } + + // 状态 + state = 'none' + STATE = { + NONE: 'none', + ADD: 'add', + EDIT: 'edit' + } + + // Hook 钩子 + Hook = { + /** 执行查询后 **/ + afterDoQuery: (data) => null, + /** 打开新增弹窗前 **/ + beforeToAdd: (form) => null, + /** 打开修改弹窗前 **/ + beforeToEdit: (form) => null, + } + + $message = useGlobalProp().$message + $confirm = useGlobalProp().$confirm + + + constructor(option) { + Object.entries(option).forEach(kv => { + if (typeof this[kv[0]] === 'object') { + Object.assign(this[kv[0]], kv[1]) + } else { + this[kv[0]] = kv[1] + } + }) + + const opt = this.columns.find(e => e.isMoneyUD) + if (opt && !this.optShow.edit && !this.optShow.del) opt.show = false + } + + async init(ref, doSomething) { + this._ref = ref + if (doSomething) await doSomething() + if (this.queryOnCreated) await this.doQuery(null, true) + this.ref().isInit = true + } + + + ref = () => this._ref.value + + /** + * 查询 + * @param notResetPage + */ + doQuery = (notResetPage) => { + if (this.crudMethod.list || this.listMethod.list) { + if (this.page.currentPage !== 1 && !notResetPage) this.ref().page.currentPage = 1 + // TODO Money 根据后端调整分页、排序或返回值的字段 + const pageQuery = { + currentPage: this.page.currentPage, + pageSize: this.page.pageSize, + } + const sortQuery = this.sort.prop ? {orderBy: `${this.sort.prop},${this.sort.order}`} : {} + const query = this.isPage ? Object.assign({}, pageQuery, this.query, sortQuery) : Object.assign({}, this.query, sortQuery) + return this.crudMethod.list(query).then(res => { + if (this.isPage) { + this.ref().data = res.data.records + this.ref().page = { + currentPage: res.data.currentPage, + pageSize: res.data.pageSize, + total: res.data.total + } + } else { + this.ref().data = res.data + } + this.Hook.afterDoQuery(res.data) + }) + } + this.Hook.afterDoQuery() + } + /** + * 重置 + */ + reset = () => { + Object.keys(this.ref().query).forEach(k => delete this.ref().query[k]) + this.doQuery() + } + toAdd = () => { + this.ref().form = {} + Object.assign(this.ref().form, this.defaultForm) + this.ref().state = this.STATE.ADD + this.Hook.beforeToAdd(this.ref().form) + } + doAdd = async () => { + return this.crudMethod.add(this.form) + .then(() => { + this.$message.success(this.msg.add) + this.doQuery() + }) + } + toEdit = (row) => { + this.ref().form = {} + Object.assign(this.ref().form, row) + this.ref().state = this.STATE.EDIT + this.Hook.beforeToEdit(this.ref().form) + } + doEdit = async () => { + return this.crudMethod.edit(this.form) + .then(() => { + this.$message.success(this.msg.edit) + this.doQuery() + }) + } + doDel = (rows) => { + return this.crudMethod.del(rows.map(e => e.id)) + .then(() => { + this.$message.success(this.msg.del) + this.doQuery() + return true + }) + } + getQueryParam=()=>{ + return this.query; + } + + /** + * 单选 + * @param currentRow 当前选中行 + * @param oldCurrentRow 上一次选中行 + */ + currentChange = (currentRow, oldCurrentRow) => { + if (this.optShow.checkbox) return + this.ref().selections = [currentRow] + } + /** + * 多选 + * @param rows 选中行 + */ + selectionChange = (rows) => { + if (!this.optShow.checkbox) return + this.ref().selections = rows + } + /** + * 排序 + * @param column 排序列 + * @param prop 排序参数 + * @param order 排序方式 + */ + doSort = ({column, prop, order}) => { + if (column.sortable !== 'custom') { + // 前端排序 + return + } + if (order) { + order = (order === 'descending' ? 'desc' : 'asc') + this.sort = {prop, order} + } else { + this.sort = {} + } + this.doQuery() + } + /** + * current-page 改变时触发 + * @param currentPage 当前页 + */ + currentPageChange = (currentPage) => { + this.ref().page.currentPage = currentPage + this.doQuery(true) + } + /** + * page-size 改变时触发 + * @param pageSize 页大小 + */ + pageSizeChange = (pageSize) => { + this.ref().page.pageSize = pageSize + this.doQuery() + } + + /** + * 操作成功提示 + */ + messageOk = () => this.$message.success(this.msg.ok) + +} + +export default MoneyCrud \ No newline at end of file diff --git a/viteui/src/components/Crud/MoneyCrudTable.vue b/viteui/src/components/Crud/MoneyCrudTable.vue new file mode 100644 index 00000000..46fe13b3 --- /dev/null +++ b/viteui/src/components/Crud/MoneyCrudTable.vue @@ -0,0 +1,51 @@ + + + diff --git a/viteui/src/components/Crud/MoneyForm.vue b/viteui/src/components/Crud/MoneyForm.vue new file mode 100644 index 00000000..de1a4b45 --- /dev/null +++ b/viteui/src/components/Crud/MoneyForm.vue @@ -0,0 +1,62 @@ + + \ No newline at end of file diff --git a/viteui/src/components/Crud/MoneyRR.vue b/viteui/src/components/Crud/MoneyRR.vue new file mode 100644 index 00000000..c1b52aa9 --- /dev/null +++ b/viteui/src/components/Crud/MoneyRR.vue @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/viteui/src/components/Crud/MoneyUD.vue b/viteui/src/components/Crud/MoneyUD.vue new file mode 100644 index 00000000..49bfcad8 --- /dev/null +++ b/viteui/src/components/Crud/MoneyUD.vue @@ -0,0 +1,37 @@ + + + \ No newline at end of file diff --git a/viteui/src/components/IconSelect.vue b/viteui/src/components/IconSelect.vue new file mode 100644 index 00000000..789a9503 --- /dev/null +++ b/viteui/src/components/IconSelect.vue @@ -0,0 +1,41 @@ + + + \ No newline at end of file diff --git a/viteui/src/components/PageWrapper.vue b/viteui/src/components/PageWrapper.vue new file mode 100644 index 00000000..181b88f6 --- /dev/null +++ b/viteui/src/components/PageWrapper.vue @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/viteui/src/components/PcdLinkage.vue b/viteui/src/components/PcdLinkage.vue new file mode 100644 index 00000000..df72673b --- /dev/null +++ b/viteui/src/components/PcdLinkage.vue @@ -0,0 +1,36 @@ + + + \ No newline at end of file diff --git a/viteui/src/components/SvgIcon.vue b/viteui/src/components/SvgIcon.vue new file mode 100644 index 00000000..bc603ab1 --- /dev/null +++ b/viteui/src/components/SvgIcon.vue @@ -0,0 +1,36 @@ + + + + \ No newline at end of file diff --git a/viteui/src/components/TenantCard.vue b/viteui/src/components/TenantCard.vue new file mode 100644 index 00000000..48bce27c --- /dev/null +++ b/viteui/src/components/TenantCard.vue @@ -0,0 +1,70 @@ + + + + + \ No newline at end of file diff --git a/viteui/src/composables/globalProp.js b/viteui/src/composables/globalProp.js new file mode 100644 index 00000000..aca4fe14 --- /dev/null +++ b/viteui/src/composables/globalProp.js @@ -0,0 +1,11 @@ +/** + * 全局参数 + * 在 plugins/index.js 配置 app.config.globalProperties + */ +import {getCurrentInstance} from 'vue'; + +export function useGlobalProp() { + const {appContext: {config: {globalProperties}}} = getCurrentInstance() + return globalProperties +} + diff --git a/viteui/src/composables/index.js b/viteui/src/composables/index.js new file mode 100644 index 00000000..0f4c502c --- /dev/null +++ b/viteui/src/composables/index.js @@ -0,0 +1,41 @@ +import {useDark, useToggle} from '@vueuse/core' +import {reactive} from 'vue' + +export const isDark = useDark() +export const toggleDarkMode = useToggle(isDark) + +export const sidebarState = reactive({ + isOpen: window.innerWidth > 1024, + isHovered: false, + handleHover(value) { + if (window.innerWidth < 1024) { + return + } + sidebarState.isHovered = value + }, + handleWindowResize() { + sidebarState.isOpen = window.innerWidth > 1024; + }, +}) + +let lastScrollTop = 0 +export const scrolling = reactive({ + down: false, + up: false, +}) +export const handleScroll = () => { + let st = window.scrollY || document.documentElement.scrollTop + if (st > lastScrollTop) { + scrolling.down = true + scrolling.up = false + } else { + scrolling.down = false + scrolling.up = true + if (st === 0) { + // reset + scrolling.down = false + scrolling.up = false + } + } + lastScrollTop = st <= 0 ? 0 : st +} \ No newline at end of file diff --git a/viteui/src/composables/token.js b/viteui/src/composables/token.js new file mode 100644 index 00000000..95fdd99d --- /dev/null +++ b/viteui/src/composables/token.js @@ -0,0 +1,6 @@ +import {useCookies} from '@vueuse/integrations/useCookies' + +const tokenKey = 'accessToken' +export const setToken = (token) => useCookies().set(tokenKey, token) +export const getToken = () => useCookies().get(tokenKey) +export const removeToken = () => useCookies().remove(tokenKey) diff --git a/viteui/src/layouts/DashboardLayout.vue b/viteui/src/layouts/DashboardLayout.vue new file mode 100644 index 00000000..07fbc9b1 --- /dev/null +++ b/viteui/src/layouts/DashboardLayout.vue @@ -0,0 +1,26 @@ + + + diff --git a/viteui/src/layouts/Logo.vue b/viteui/src/layouts/Logo.vue new file mode 100644 index 00000000..febfac99 --- /dev/null +++ b/viteui/src/layouts/Logo.vue @@ -0,0 +1,103 @@ + + diff --git a/viteui/src/layouts/footer/Footer.vue b/viteui/src/layouts/footer/Footer.vue new file mode 100644 index 00000000..45d7f38d --- /dev/null +++ b/viteui/src/layouts/footer/Footer.vue @@ -0,0 +1,19 @@ + diff --git a/viteui/src/layouts/navbar/Navbar.vue b/viteui/src/layouts/navbar/Navbar.vue new file mode 100644 index 00000000..87f601e1 --- /dev/null +++ b/viteui/src/layouts/navbar/Navbar.vue @@ -0,0 +1,138 @@ + + + + \ No newline at end of file diff --git a/viteui/src/layouts/sidebar/Sidebar.vue b/viteui/src/layouts/sidebar/Sidebar.vue new file mode 100644 index 00000000..f34756e8 --- /dev/null +++ b/viteui/src/layouts/sidebar/Sidebar.vue @@ -0,0 +1,47 @@ + + + \ No newline at end of file diff --git a/viteui/src/layouts/sidebar/SidebarContent.vue b/viteui/src/layouts/sidebar/SidebarContent.vue new file mode 100644 index 00000000..899c6a93 --- /dev/null +++ b/viteui/src/layouts/sidebar/SidebarContent.vue @@ -0,0 +1,34 @@ + + + \ No newline at end of file diff --git a/viteui/src/layouts/sidebar/SidebarHeader.vue b/viteui/src/layouts/sidebar/SidebarHeader.vue new file mode 100644 index 00000000..b022006c --- /dev/null +++ b/viteui/src/layouts/sidebar/SidebarHeader.vue @@ -0,0 +1,26 @@ + + + \ No newline at end of file diff --git a/viteui/src/layouts/sidebar/SidebarLink.vue b/viteui/src/layouts/sidebar/SidebarLink.vue new file mode 100644 index 00000000..5483d88f --- /dev/null +++ b/viteui/src/layouts/sidebar/SidebarLink.vue @@ -0,0 +1,39 @@ + + + \ No newline at end of file diff --git a/viteui/src/layouts/sidebar/SidebarMenu.vue b/viteui/src/layouts/sidebar/SidebarMenu.vue new file mode 100644 index 00000000..7af0929a --- /dev/null +++ b/viteui/src/layouts/sidebar/SidebarMenu.vue @@ -0,0 +1,29 @@ + + + \ No newline at end of file diff --git a/viteui/src/main.js b/viteui/src/main.js new file mode 100644 index 00000000..21d1b2a2 --- /dev/null +++ b/viteui/src/main.js @@ -0,0 +1,17 @@ +import {createApp} from "vue"; +import App from './App.vue'; +import router from './router'; +import store from './store'; + +import './style/main.css'; +import './style/tailwind.css'; + +import plugins from './plugins' + +createApp(App) + .use(router) + .use(store) + .use(plugins) + .mount("#app") + +document.title = import.meta.env.VITE_TITLE \ No newline at end of file diff --git a/viteui/src/money.config.js b/viteui/src/money.config.js new file mode 100644 index 00000000..d817fdec --- /dev/null +++ b/viteui/src/money.config.js @@ -0,0 +1,41 @@ +export default { + // 语言 + lang: 'zh-cn', + // 时区 + timezone: 'GMT+08:00', + + // 租户请求头 + tenantHeader: 'Y-tenant', + // token类型 + tokenType: 'Bearer', + // token请求头 + tokenHeader: 'Authorization', + // requestId请求头 + requestIdHeader: 'X-qk-request', + // 多语言请求头 + i18nHeader: 'X-qk-lang', + // 时区请求头 + timezoneHeader: 'X-qk-timezone', + // 静态OSS路径 + localOSSPath: '/assets/', + // 云OSS路径 + cloudOSSPath: '', + + /** + * 获取完整路径 + * @param path + * @param cloud + * @returns {string} + */ + getOssUrl(path, cloud = false) { + if (path && !path.includes('http')) { + if (cloud) { + path = import.meta.env.VITE_BASE_URL + "ossres?path=" + encodeURI(path) + } else { + path = import.meta.env.VITE_BASE_URL + "ossres?path=" + encodeURI(path) + //path = import.meta.env.VITE_BASE_URL + this.localOSSPath + path + } + } + return path + } +} \ No newline at end of file diff --git a/viteui/src/plugins/index.js b/viteui/src/plugins/index.js new file mode 100644 index 00000000..a536b610 --- /dev/null +++ b/viteui/src/plugins/index.js @@ -0,0 +1,33 @@ +import MoneyConfig from "@/money.config.js"; + +import 'virtual:svg-icons-register' +import SvgIcon from '@/components/SvgIcon.vue' + +import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.css' +import PerfectScrollbar from 'vue3-perfect-scrollbar' + +import 'element-plus/dist/index.css' +import 'element-plus/theme-chalk/dark/css-vars.css' +import '@/style/reset-element.css' +import * as ElementPlusIconsVue from '@element-plus/icons-vue' +import {ElMessage, ElMessageBox, ElNotification, ElLoadingService} from "element-plus"; + +export default { + install: (app, options) => { + app.config.globalProperties.$money = MoneyConfig + app.config.globalProperties.$message = ElMessage + app.config.globalProperties.$notify = ElNotification + app.config.globalProperties.$msgbox = ElMessageBox + app.config.globalProperties.$alert = ElMessageBox.alert + app.config.globalProperties.$confirm = ElMessageBox.confirm + app.config.globalProperties.$prompt = ElMessageBox.prompt + app.config.globalProperties.$loading = ElLoadingService + + for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component) + } + app.component('svg-icon', SvgIcon) + + app.use(PerfectScrollbar) + } +} \ No newline at end of file diff --git a/viteui/src/router/index.js b/viteui/src/router/index.js new file mode 100644 index 00000000..821d2e00 --- /dev/null +++ b/viteui/src/router/index.js @@ -0,0 +1,53 @@ +import {createRouter, createWebHashHistory} from 'vue-router' +import intercept from "./interceptor.js" + +import Layout from "@/layouts/DashboardLayout.vue" +import NotFound from "@/views/error/NotFound.vue"; + +// 存放固定的路由 +const defaultRouterList = [ + { + path: '/', + redirect: () => "/dashboard" + }, + { + path: '/dashboard', + component: Layout, + children: [ + { + path: '', + name: 'Dashboard', + component: () => import('@/views/dashboard/index.vue'), + } + ] + }, + // 登录页 + { + path: '/login', + name: 'Login', + component: () => import('@/views/Login.vue'), + }, + // 个人中心 + { + path: '/personal', + component: Layout, + children: [ + { + path: '', + name: 'Personal', + component: () => import('@/views/personal/index.vue'), + } + ] + }, + // 404 + {path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFound} +] + +export const routes = [...defaultRouterList] + +const router = createRouter({ + history: createWebHashHistory(import.meta.env.BASE_URL), + routes, +}) + +export default intercept(router) \ No newline at end of file diff --git a/viteui/src/router/interceptor.js b/viteui/src/router/interceptor.js new file mode 100644 index 00000000..10ac6151 --- /dev/null +++ b/viteui/src/router/interceptor.js @@ -0,0 +1,46 @@ +import NProgress from "nprogress"; +import 'nprogress/nprogress.css' +import {getToken, removeToken, setToken} from "@/composables/token.js"; +import {useAppStore, useUserStore} from "@/store/index.js"; + +// 白名单 +const whitelist = ['/login'] + +export default function (router) { + router.beforeEach(async (to) => { + if (import.meta.env.VITE_ONLY_UI) { + setToken('only_ui') + } + const hasToken = getToken() + if (hasToken && !useAppStore().menus) { + await useAppStore().loadRoutes() + return to.fullPath + } + }) + + router.beforeEach(async (to, from, next) => { + NProgress.start() + const hasToken = getToken() + if (hasToken && to.path === '/login') { + next({path: '/'}) + } else if (hasToken) { + try { + await useUserStore().loadInfo() + next() + } catch (e) { + removeToken() + next(`/login?redirect=${to.path}`) + } + } else if (whitelist.indexOf(to.path) !== -1) { + next() + } else { + next(`/login?redirect=${to.path}`) + } + }) + + router.afterEach(() => { + NProgress.done() + }) + + return router +} diff --git a/viteui/src/store/index.js b/viteui/src/store/index.js new file mode 100644 index 00000000..0d4a8e7f --- /dev/null +++ b/viteui/src/store/index.js @@ -0,0 +1,12 @@ +import { createPinia } from 'pinia'; +import { markRaw } from 'vue' +import router from '../router'; + +const store = createPinia(); +store.use(({ store }) => { + store.$router = markRaw(router) +}); +export default store; + +export * from './modules/app.js' +export * from './modules/user.js' \ No newline at end of file diff --git a/viteui/src/store/modules/app.js b/viteui/src/store/modules/app.js new file mode 100644 index 00000000..1be2174f --- /dev/null +++ b/viteui/src/store/modules/app.js @@ -0,0 +1,39 @@ +import {defineStore} from 'pinia' +import authApi from '@/api/system/auth.js' +import Layout from "@/layouts/DashboardLayout.vue"; + +const views = import.meta.glob('@/views/**') + +export const useAppStore = defineStore('app', { + state: () => ({ + menus: null, + }), + actions: { + async loadRoutes() { + const {data} = await authApi.getDyRoutes() + this.menus = this._loadMenus(data, true) + }, + _loadMenus(menus, first) { + if (!menus) return [] + return menus.map(e => { + const menu = { + name: e.name, + path: (first ? '/' : '') + e.path, + component: first ? Layout : views[`/src/views/${e.component}.vue`], + meta: e.meta, + iframe: e.iframe, + hidden: e.hidden, + } + Object.entries(menu).forEach(kv => {if (!kv[1]) delete menu[kv[0]]}) + if (e.children) { + menu.children = this._loadMenus(e.children, false) + menu.redirect = {name: e.children[0].name} + } + if (first) { + this.$router.addRoute(menu) + } + return menu + }) + } + } +}) \ No newline at end of file diff --git a/viteui/src/store/modules/user.js b/viteui/src/store/modules/user.js new file mode 100644 index 00000000..d57baed6 --- /dev/null +++ b/viteui/src/store/modules/user.js @@ -0,0 +1,133 @@ +import {defineStore} from 'pinia' +import authApi from '@/api/system/auth.js' +import userApi from '@/api/system/user.js' +import {getToken, removeToken, setToken} from "@/composables/token.js" + +export const useUserStore = defineStore('user', { + state: () => ({ + info: null, + roles: null, + permissions: null, + tenants: null + }), + getters: { + level: (state) => state.roles[0].level, + getTenantId: (state) => state.info.tenantId, + hasMoreTenants: (state) => state.tenants!=null && state.tenants!= undefined && state.tenants.length>0, + permissionCode: (state) => + [...state.roles.map(e => e.roleCode), ...state.permissions.map(e => e.permission)].filter(e => e.length > 0) + }, + actions: { + /** + * 是否有权限 + * @param codes + * @returns {*|boolean} + */ + hasPermission(codes) { + if (this.level === 1) return true + if (!codes) return false + if (Array.isArray(codes)) { + return this.permissionCode.some(e => codes.includes(e)) + } + return this.permissionCode.includes(codes) + }, + isAdmin(){ + if (this.level === 1 || this.level === 2) return true + }, + isPlatformAdmin(){ + return this.level === 1 + }, + /** + * 登录 + * @param data + * @returns {Promise} + */ + login(data) { + return new Promise((resolve, reject) => { + authApi.login(data) + .then(res => { + //const {data} = res + setToken(res.token) + resolve(res) + }) + .catch(err => reject(err)) + }) + }, + getTenants(){ + return this.tenants; + }, + /** + * 加载用户信息 + * @returns {Promise} + */ + loadInfo() { + return new Promise((resolve, reject) => { + authApi.getInfo() + .then(res => { + const {data} = res + console.log(data.tenants) + this.info = data.info + this.roles = data.roles + this.permissions = data.permissions + this.tenants = data.tenants + resolve(data) + }) + .catch(err => reject(err)) + }) + }, + /** + * 登出 + * @returns {Promise} + */ + async logout() { + if (getToken()) await authApi.logout().then(() => removeToken()) + this.info = null + this.roles = null + this.permissions = null + removeToken() + window.location.reload() + }, + /** + * 更新信息 + * @param data + * @returns {Promise} + */ + updateInfo(data) { + return new Promise((resolve, reject) => { + userApi.updateInfo(data) + .then(() => resolve()) + .catch(err => reject(err)) + }) + }, + /** + * 修改密码 + * @param data + * @returns {Promise} + */ + changePassword(data) { + return new Promise((resolve, reject) => { + userApi.changePassword(data) + .then(() => this.logout()) + .catch(err => reject(err)) + }) + }, + getCode(){ + return new Promise((resolve,reject)=>{ + authApi.getCodeImg().then(res => { + resolve(res) + }).catch(err => reject(err)) + }) + },selectTenant(tenantId){ + return new Promise((resolve,reject)=>{ + userApi.selectTenant(tenantId).then(res=>{ + if(res.success) { + setToken(res.token) + resolve(res) + }else{ + reject() + } + }).catch(err => reject(err)) + }) + } + } +}) \ No newline at end of file diff --git a/viteui/src/style/main.css b/viteui/src/style/main.css new file mode 100644 index 00000000..e6ded9ca --- /dev/null +++ b/viteui/src/style/main.css @@ -0,0 +1,27 @@ +.bg-base-100 { + background-color: var(--el-bg-color); +} + +.bg-base-200 { + background-color: var(--el-bg-color-page); +} + +/*全局滚动条*/ +::-webkit-scrollbar{ + height: 10px; + width: 10px; +} + +::-webkit-scrollbar-thumb { + border-radius: 10px; + border-style: dashed; + border-color: transparent; + border-width: 2px; + background-color: rgba(157, 165, 183, 0.4); + background-clip: padding-box; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(157, 165, 183, 0.7); + cursor: pointer !important; +} \ No newline at end of file diff --git a/viteui/src/style/reset-element.css b/viteui/src/style/reset-element.css new file mode 100644 index 00000000..e829fe0b --- /dev/null +++ b/viteui/src/style/reset-element.css @@ -0,0 +1,18 @@ +.avatar-uploader .el-upload { + border: 1px dashed var(--el-border-color); + border-radius: 6px; + cursor: pointer; + position: relative; + overflow: hidden; + transition: var(--el-transition-duration-fast); +} + +.avatar-uploader .el-upload:hover { + border-color: var(--el-color-primary); +} + +.el-icon.avatar-uploader-icon { + font-size: 28px; + color: #8c939d; + text-align: center; +} \ No newline at end of file diff --git a/viteui/src/style/tailwind.css b/viteui/src/style/tailwind.css new file mode 100644 index 00000000..b5c61c95 --- /dev/null +++ b/viteui/src/style/tailwind.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/viteui/src/utils/index.js b/viteui/src/utils/index.js new file mode 100644 index 00000000..6376fb32 --- /dev/null +++ b/viteui/src/utils/index.js @@ -0,0 +1,7 @@ +/** + * 是否手机访问 + * @returns {boolean} + */ +export function isMobile () { + return navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)?.length > 0 +} \ No newline at end of file diff --git a/viteui/src/views/Login.vue b/viteui/src/views/Login.vue new file mode 100644 index 00000000..9a3dc291 --- /dev/null +++ b/viteui/src/views/Login.vue @@ -0,0 +1,155 @@ + + + \ No newline at end of file diff --git a/viteui/src/views/dashboard/index.vue b/viteui/src/views/dashboard/index.vue new file mode 100644 index 00000000..0a862a28 --- /dev/null +++ b/viteui/src/views/dashboard/index.vue @@ -0,0 +1,63 @@ + + \ No newline at end of file diff --git a/viteui/src/views/error/NotFound.vue b/viteui/src/views/error/NotFound.vue new file mode 100644 index 00000000..5c5950bd --- /dev/null +++ b/viteui/src/views/error/NotFound.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/viteui/src/views/gms/brand/index.vue b/viteui/src/views/gms/brand/index.vue new file mode 100644 index 00000000..5e7b1749 --- /dev/null +++ b/viteui/src/views/gms/brand/index.vue @@ -0,0 +1,96 @@ + + + \ No newline at end of file diff --git a/viteui/src/views/gms/goods/GoodsCategory.vue b/viteui/src/views/gms/goods/GoodsCategory.vue new file mode 100644 index 00000000..3598dbb3 --- /dev/null +++ b/viteui/src/views/gms/goods/GoodsCategory.vue @@ -0,0 +1,86 @@ + + + \ No newline at end of file diff --git a/viteui/src/views/gms/goods/index.vue b/viteui/src/views/gms/goods/index.vue new file mode 100644 index 00000000..eff62f91 --- /dev/null +++ b/viteui/src/views/gms/goods/index.vue @@ -0,0 +1,288 @@ + + + \ No newline at end of file diff --git a/viteui/src/views/oms/order/detail.vue b/viteui/src/views/oms/order/detail.vue new file mode 100644 index 00000000..ca1ac4ab --- /dev/null +++ b/viteui/src/views/oms/order/detail.vue @@ -0,0 +1,241 @@ + + \ No newline at end of file diff --git a/viteui/src/views/oms/order/index.vue b/viteui/src/views/oms/order/index.vue new file mode 100644 index 00000000..11527a38 --- /dev/null +++ b/viteui/src/views/oms/order/index.vue @@ -0,0 +1,175 @@ + + + diff --git a/viteui/src/views/personal/index.vue b/viteui/src/views/personal/index.vue new file mode 100644 index 00000000..8ecb9c38 --- /dev/null +++ b/viteui/src/views/personal/index.vue @@ -0,0 +1,135 @@ + + + \ No newline at end of file diff --git a/viteui/src/views/pos/index.vue b/viteui/src/views/pos/index.vue new file mode 100644 index 00000000..b64bc495 --- /dev/null +++ b/viteui/src/views/pos/index.vue @@ -0,0 +1,394 @@ + + + \ No newline at end of file diff --git a/viteui/src/views/pos/printOrder.vue b/viteui/src/views/pos/printOrder.vue new file mode 100644 index 00000000..4d81fb3b --- /dev/null +++ b/viteui/src/views/pos/printOrder.vue @@ -0,0 +1,63 @@ + + \ No newline at end of file diff --git a/viteui/src/views/system/dict/index.vue b/viteui/src/views/system/dict/index.vue new file mode 100644 index 00000000..2dfe3fcb --- /dev/null +++ b/viteui/src/views/system/dict/index.vue @@ -0,0 +1,185 @@ + + + \ No newline at end of file diff --git a/viteui/src/views/system/employee/index.vue b/viteui/src/views/system/employee/index.vue new file mode 100644 index 00000000..444fdf96 --- /dev/null +++ b/viteui/src/views/system/employee/index.vue @@ -0,0 +1,183 @@ + + + diff --git a/viteui/src/views/system/menu/index.vue b/viteui/src/views/system/menu/index.vue new file mode 100644 index 00000000..711ffa91 --- /dev/null +++ b/viteui/src/views/system/menu/index.vue @@ -0,0 +1,225 @@ + + + \ No newline at end of file diff --git a/viteui/src/views/system/org/index.vue b/viteui/src/views/system/org/index.vue new file mode 100644 index 00000000..d6367bdf --- /dev/null +++ b/viteui/src/views/system/org/index.vue @@ -0,0 +1,306 @@ + + + \ No newline at end of file diff --git a/viteui/src/views/system/role/index.vue b/viteui/src/views/system/role/index.vue new file mode 100644 index 00000000..6a3b0324 --- /dev/null +++ b/viteui/src/views/system/role/index.vue @@ -0,0 +1,190 @@ + + + diff --git a/viteui/src/views/system/tenant/index.vue b/viteui/src/views/system/tenant/index.vue new file mode 100644 index 00000000..d6818938 --- /dev/null +++ b/viteui/src/views/system/tenant/index.vue @@ -0,0 +1,113 @@ + + + diff --git a/viteui/src/views/system/user/index.vue b/viteui/src/views/system/user/index.vue new file mode 100644 index 00000000..88468732 --- /dev/null +++ b/viteui/src/views/system/user/index.vue @@ -0,0 +1,232 @@ + + + diff --git a/viteui/src/views/template/index.vue b/viteui/src/views/template/index.vue new file mode 100644 index 00000000..f1d941b0 --- /dev/null +++ b/viteui/src/views/template/index.vue @@ -0,0 +1,67 @@ + + + diff --git a/viteui/src/views/ums/member/index.vue b/viteui/src/views/ums/member/index.vue new file mode 100644 index 00000000..b60c32c0 --- /dev/null +++ b/viteui/src/views/ums/member/index.vue @@ -0,0 +1,147 @@ + + + diff --git a/viteui/tailwind.config.js b/viteui/tailwind.config.js new file mode 100644 index 00000000..24485a6b --- /dev/null +++ b/viteui/tailwind.config.js @@ -0,0 +1,10 @@ +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: 'class', + content: ["./src/**/*.{html,vue,js}"], + theme: { + extend: {} + }, + plugins: [], +} + diff --git a/viteui/vite.config.js b/viteui/vite.config.js new file mode 100644 index 00000000..6114474e --- /dev/null +++ b/viteui/vite.config.js @@ -0,0 +1,43 @@ +import { defineConfig } from "vite"; +import { resolve } from 'path'; +import vue from "@vitejs/plugin-vue"; +import AutoImport from 'unplugin-auto-import/vite' +import Components from 'unplugin-vue-components/vite' +import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' + +export default defineConfig(async ({mode}) => ({ + base: mode === 'demo' ? '/webui' : '/webui', + envPrefix: ["VITE_", "TAURI_"], + server: { + port: 1520, + strictPort: true, + }, + + plugins: [ + vue(), + createSvgIconsPlugin({ + iconDirs: [resolve(__dirname, 'src/assets/icons')], + symbolId: 'icon-[dir]-[name]' + }), + AutoImport({ + resolvers: [ElementPlusResolver()], + }), + Components({ + resolvers: [ElementPlusResolver()], + }), + ], + + resolve: { + alias: { + '@': resolve(__dirname, 'src'), + }, + }, + + build: { + target: process.env.TAURI_PLATFORM === "windows" ? "chrome105" : "safari13", + minify: !process.env.TAURI_DEBUG ? "esbuild" : false, + sourcemap: !!process.env.TAURI_DEBUG, + }, + +})) From f1856c2b0f6c52b2828da80fc52bd1a94cbadaea Mon Sep 17 00:00:00 2001 From: robinhoodjim Date: Fri, 24 Oct 2025 22:05:55 +0800 Subject: [PATCH 5/7] Add Serverless Annotation support --- .../base/annotation/ServerlessFunction.java | 14 + .../robin/core/convert/util/ConvertUtil.java | 128 ++++---- web/pom.xml | 46 +++ .../core/web/filter/ServerlessFilter.java | 47 +++ .../IUserDefineServerlessFunction.java | 7 + .../web/serverless/ServerlessFactoryBean.java | 278 ++++++++++++++++++ .../web/serverless/ServerlessParameter.java | 15 + 7 files changed, 472 insertions(+), 63 deletions(-) create mode 100644 core/src/main/java/com/robin/core/base/annotation/ServerlessFunction.java create mode 100644 web/src/main/java/com/robin/core/web/filter/ServerlessFilter.java create mode 100644 web/src/main/java/com/robin/core/web/serverless/IUserDefineServerlessFunction.java create mode 100644 web/src/main/java/com/robin/core/web/serverless/ServerlessFactoryBean.java create mode 100644 web/src/main/java/com/robin/core/web/serverless/ServerlessParameter.java diff --git a/core/src/main/java/com/robin/core/base/annotation/ServerlessFunction.java b/core/src/main/java/com/robin/core/base/annotation/ServerlessFunction.java new file mode 100644 index 00000000..c88e60f5 --- /dev/null +++ b/core/src/main/java/com/robin/core/base/annotation/ServerlessFunction.java @@ -0,0 +1,14 @@ +package com.robin.core.base.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ServerlessFunction { + String value() default ""; + String initFunc() default ""; + String initParam() default ""; +} diff --git a/core/src/main/java/com/robin/core/convert/util/ConvertUtil.java b/core/src/main/java/com/robin/core/convert/util/ConvertUtil.java index 20b51062..6e158d86 100644 --- a/core/src/main/java/com/robin/core/convert/util/ConvertUtil.java +++ b/core/src/main/java/com/robin/core/convert/util/ConvertUtil.java @@ -27,6 +27,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.math.NumberUtils; import org.springframework.beans.BeanUtils; +import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -154,7 +155,7 @@ public static void objectToMapObj(Object source, Map target, Str } } - public static void mapToBaseObject(Map source, BaseObject target, String... ignoreColumns) throws Exception { + public static void mapToBaseObject(Map source, BaseObject target, String... ignoreColumns) throws IllegalAccessException { if (source == null || target == null) { return; } @@ -184,7 +185,7 @@ public static void mapToBaseObject(Map source, BaseObject target } - public static void mapToObject(Map source, Object target, String... ignoreColumns) throws Exception { + public static void mapToObject(Map source, Object target, String... ignoreColumns) throws IllegalAccessException { if (source == null || target == null) { return; } @@ -213,11 +214,11 @@ public static void mapToObject(Map source, Object target, String } - private static String camelCase(String value) { + private static String toUpper(String value) { return value.substring(0, 1).toUpperCase() + value.substring(1); } - public static void convertSerializableForUpdate(Serializable source, Serializable target, String... ignoreColumns) throws Exception { + public static void convertSerializableForUpdate(Serializable source, Serializable target, String... ignoreColumns) throws IllegalAccessException { if (target == null || source == null) { return; } @@ -244,7 +245,7 @@ public static void convertSerializableForUpdate(Serializable source, Serializabl } - public static void convertToModelForUpdate(BaseObject source, BaseObject target) throws Exception { + public static void convertToModelForUpdate(BaseObject source, BaseObject target) throws IllegalAccessException { if (target == null || source == null) { return; } @@ -272,14 +273,14 @@ public static void convertToModelForUpdate(BaseObject source, BaseObject target) } } - public static void convertToModel(BaseObject target, Map src, String... ignoreColumns) throws Exception { - if (target == null || src == null) { + public static void convertToModel(Map source, BaseObject target, String... ignoreColumns) throws IllegalAccessException { + if (target == null || source == null) { return; } Map map = ReflectUtils.returnSetMethodHandle(target.getClass()); List ignoreColumnList = getIgnoreColumns(ignoreColumns); try { - for (Map.Entry entry : src.entrySet()) { + for (Map.Entry entry : source.entrySet()) { String field = entry.getKey(); if (ObjectUtils.isEmpty(ignoreColumnList) || !ignoreColumnList.contains(field)) { MethodHandle setMethod = map.get(field); @@ -317,7 +318,7 @@ private static void setObjectValue(Serializable target, Object value, MethodHand } @SuppressWarnings("unchecked") - public static void convertToTarget(Object source, Object target, String... ignoreColumns) throws Exception { + public static void convertToTarget(Object source, Object target, String... ignoreColumns) throws IllegalAccessException { if (target == null || source == null) { return; } @@ -332,7 +333,7 @@ public static void convertToTarget(Object source, Object target, String... ignor String field = entry.getKey(); MethodHandle setMethod = targetMethodMap.get(field); if (setMethod != null) { - if (target instanceof BaseObject) { + if (target.getClass().isAssignableFrom(BaseObject.class)) { setBaseObjectValue((BaseObject) target, entry.getValue(), field, setMethod,ignoreColumnList); } else if (targetMethodMap.containsKey(field) && canFill(ignoreColumnList,field)) { Object retValue = parseParameter(targetMethodMap.get(field).type().parameterType(1), entry.getValue()); @@ -389,7 +390,6 @@ public static Object parseParameter(DataBaseColumnMeta meta, Object strValue) { if (strValue == null) { return null; } - DateTimeFormatter formatter = null; Object ret = null; if (!StringUtils.isEmpty(strValue)) { if (Types.INTEGER == meta.getDataType()) { @@ -403,17 +403,12 @@ public static Object parseParameter(DataBaseColumnMeta meta, Object strValue) { } else if (Types.SMALLINT == meta.getDataType()) { ret = Short.valueOf(strValue.toString()); } else if (Types.TIME == meta.getDataType() || Types.DATE == meta.getDataType() || Types.TIMESTAMP == meta.getDataType()) { - String value = strValue.toString().trim(); - formatter = getFormatter(value); - if (null != formatter) { - LocalDateTime localDateTime = LocalDateTime.parse(value, formatter); - if (Types.DATE == meta.getDataType()) { - ret = new java.util.Date(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); - } else if (Types.TIMESTAMP == meta.getDataType()) { - ret = new Timestamp(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); - } + LocalDateTime localDateTime = getLocalDateTimeFrom(strValue); + if (Types.DATE == meta.getDataType()) { + ret = new java.util.Date(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); + } else if (Types.TIMESTAMP == meta.getDataType()) { + ret = new Timestamp(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); } - } else if (Types.VARCHAR == meta.getDataType() || Types.CHAR == meta.getDataType()) { ret = strValue.toString(); } else { @@ -427,7 +422,6 @@ public static Object parseParameter(DataSetColumnMeta meta, Object strValue) { if (strValue == null) { return null; } - DateTimeFormatter formatter = null; Object ret = null; if (!StringUtils.isEmpty(strValue)) { if (Const.META_TYPE_INTEGER.equals(meta.getColumnType())) { @@ -441,17 +435,12 @@ public static Object parseParameter(DataSetColumnMeta meta, Object strValue) { } else if (Const.META_TYPE_SHORT.equals(meta.getColumnType())) { ret = Short.valueOf(strValue.toString()); } else if (Const.META_TYPE_DATE.equals(meta.getColumnType()) || Const.META_TYPE_TIMESTAMP.equals(meta.getColumnType())) { - String value = strValue.toString().trim(); - formatter = getFormatter(value); - if (null != formatter) { - LocalDateTime localDateTime = LocalDateTime.parse(value, formatter); - if (Const.META_TYPE_DATE.equals(meta.getColumnType())) { - ret = new java.util.Date(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); - } else if (Const.META_TYPE_TIMESTAMP.equals(meta.getColumnType())) { - ret = new Timestamp(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); - } + LocalDateTime localDateTime = getLocalDateTimeFrom(strValue); + if (Const.META_TYPE_DATE.equals(meta.getColumnType())) { + ret = new java.util.Date(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); + } else if (Const.META_TYPE_TIMESTAMP.equals(meta.getColumnType())) { + ret = new Timestamp(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); } - } else if (Const.META_TYPE_STRING.equals(meta.getColumnType())) { ret = strValue.toString(); } else { @@ -466,20 +455,27 @@ public static Object parseParameter(Class type, Object strValue) throws Excep if (Objects.isNull(strValue)) { return null; } - DateTimeFormatter formatter = null; Object ret = null; if (!ObjectUtils.isEmpty(strValue)) { - if (Integer.class.isAssignableFrom(type)) { + if(type.isAssignableFrom(strValue.getClass())){ + ret= strValue; + }else if (Integer.class.isAssignableFrom(type)) { + Assert.isTrue(NumberUtils.isDigits(strValue.toString())); ret = Integer.parseInt(strValue.toString()); } else if (Long.class.isAssignableFrom(type)) { + Assert.isTrue(NumberUtils.isDigits(strValue.toString())); ret = Long.parseLong(strValue.toString()); } else if (Float.class.isAssignableFrom(type)) { + Assert.isTrue(NumberUtils.isNumber(strValue.toString())); ret = Float.parseFloat(strValue.toString()); } else if (Double.class.isAssignableFrom(type)) { + Assert.isTrue(NumberUtils.isNumber(strValue.toString())); ret = Double.parseDouble(strValue.toString()); } else if (Short.class.isAssignableFrom(type)) { + Assert.isTrue(NumberUtils.isDigits(strValue.toString())); ret = Short.valueOf(strValue.toString()); } else if (BigDecimal.class.isAssignableFrom(type)) { + Assert.isTrue(NumberUtils.isNumber(strValue.toString())); ret = BigDecimal.valueOf(Double.parseDouble(strValue.toString())); } else if (Boolean.class.isAssignableFrom(type)) { if (NumberUtils.isNumber(strValue.toString())) { @@ -487,33 +483,23 @@ public static Object parseParameter(Class type, Object strValue) throws Excep } else { ret = Boolean.valueOf(strValue.toString()); } - } else if (type.isAssignableFrom(java.util.Date.class) || type.isAssignableFrom(LocalDateTime.class) || type.isAssignableFrom(Timestamp.class)) { - + } else if (type.isAssignableFrom(java.util.Date.class) || type.isAssignableFrom(LocalDateTime.class) || type.isAssignableFrom(Timestamp.class) + || type.isAssignableFrom(java.sql.Date.class) || type.isAssignableFrom(LocalDate.class)) { + LocalDateTime localDateTime = getLocalDateTimeFrom(strValue); if (type.isAssignableFrom(java.util.Date.class)) { - if (java.util.Date.class.isAssignableFrom(strValue.getClass())) { - ret = strValue; - } else { - LocalDateTime localDateTime = getLocalDateTimeFrom(strValue.toString()); - ret = new java.util.Date(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); - } + ret = new java.util.Date(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); } else if (type.isAssignableFrom(Timestamp.class)) { - if (Timestamp.class.isAssignableFrom(strValue.getClass())) { - ret = strValue; - } else { - LocalDateTime localDateTime = getLocalDateTimeFrom(strValue.toString()); - ret = new Timestamp(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); - } + ret = new Timestamp(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); } else if (type.isAssignableFrom(LocalDateTime.class)) { - if (LocalDateTime.class.isAssignableFrom(strValue.getClass())) { - ret = strValue; - } else { - ret = getLocalDateTimeFrom(strValue); - } + ret = localDateTime; + }else if(type.isAssignableFrom(LocalDate.class)){ + ret =localDateTime.toLocalDate(); + }else if(type.isAssignableFrom(java.sql.Date.class)){ + ret = new java.sql.Date(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli()); } } else if (type.isAssignableFrom(String.class)) { ret = strValue.toString(); } else { - if (type.isAssignableFrom(byte.class)) { if (!ObjectUtils.isEmpty(strValue)) { Method method = type.getMethod("valueOf", String.class); @@ -533,20 +519,36 @@ public static Object parseParameter(Class type, Object strValue) throws Excep private static LocalDateTime getLocalDateTimeFrom(Object strValue) { LocalDateTime ret=null; - DateTimeFormatter formatter; - formatter = !ObjectUtils.isEmpty(currentFormatter.get()) ? currentFormatter.get() : getFormatter(strValue.toString()); - if(formatter!=null) { - if (ymdformatter.equals(formatter) || ymdEupformatter.equals(formatter) || ymdSepformatter.equals(formatter)) { - ret = LocalDate.parse(strValue.toString(), formatter).atStartOfDay(); - } else { - ret = LocalDateTime.parse(strValue.toString(), formatter); + if(ObjectUtils.isEmpty(strValue)){ + return null; + } + if(java.sql.Date.class.isAssignableFrom(strValue.getClass())){ + ret=LocalDateTime.ofInstant(Instant.ofEpochMilli(((java.sql.Date)strValue).getTime()),ZoneId.systemDefault()); + } else if (java.util.Date.class.isAssignableFrom(strValue.getClass())) { + ret=LocalDateTime.ofInstant(Instant.ofEpochMilli(((java.util.Date)strValue).getTime()),ZoneId.systemDefault()); + }else if(Timestamp.class.isAssignableFrom(strValue.getClass())){ + ret=LocalDateTime.ofInstant(Instant.ofEpochMilli(((Timestamp)strValue).getTime()),ZoneId.systemDefault()); + }else if(LocalDate.class.isAssignableFrom(strValue.getClass())){ + ret=((LocalDate)strValue).atStartOfDay(); + }else if(LocalDateTime.class.isAssignableFrom(strValue.getClass())){ + ret=(LocalDateTime) strValue; + }else { + DateTimeFormatter formatter; + formatter = !ObjectUtils.isEmpty(currentFormatter.get()) ? currentFormatter.get() : getFormatter(strValue.toString()); + if (formatter != null) { + if (ymdformatter.equals(formatter) || ymdEupformatter.equals(formatter) || ymdSepformatter.equals(formatter)) { + ret = LocalDate.parse(strValue.toString(), formatter).atStartOfDay(); + } else { + ret = LocalDateTime.parse(strValue.toString(), formatter); + } + } else if (NumberUtils.isNumber(strValue.toString())) { + ret = LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.valueOf(strValue.toString())), ZoneId.systemDefault()); } - }else if(NumberUtils.isNumber(strValue.toString())){ - ret=LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.valueOf(strValue.toString())),ZoneId.systemDefault()); } return ret; } + public static DateTimeFormatter getFormatter(String value) { DateTimeFormatter retFormatter = currentFormatter.get(); if (ObjectUtils.isEmpty(retFormatter)) { diff --git a/web/pom.xml b/web/pom.xml index b50dab5c..5fe4b9de 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -149,6 +149,11 @@ javax.annotation-api 1.3.2
+ + io.github.classgraph + classgraph + true + @@ -188,6 +193,47 @@ UTF-8
+ + maven-deploy-plugin + 2.8.2 + + + internal.repo::default::file://${project.build.directory}/mvn-repo + + + + + + + com.github.github + site-maven-plugin + 0.12 + + Maven artifacts for ${project.version} + true + + ${project.build.directory}/mvn-repo + + refs/heads/main + true + + **/* + + + mvn-repo + + robinhood-jim + github + + + + + site + + deploy + + + diff --git a/web/src/main/java/com/robin/core/web/filter/ServerlessFilter.java b/web/src/main/java/com/robin/core/web/filter/ServerlessFilter.java new file mode 100644 index 00000000..dd1df1d0 --- /dev/null +++ b/web/src/main/java/com/robin/core/web/filter/ServerlessFilter.java @@ -0,0 +1,47 @@ +package com.robin.core.web.filter; + +import com.google.gson.Gson; +import com.robin.core.base.spring.SpringContextHolder; +import com.robin.core.web.controller.AbstractController; +import com.robin.core.web.serverless.ServerlessFactoryBean; +import com.robin.core.web.util.URIUtils; +import org.springframework.core.env.Environment; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class ServerlessFilter extends OncePerRequestFilter { + private Gson gson=new Gson(); + String functionPath="/serverless/"; + public ServerlessFilter(){ + Environment environment= SpringContextHolder.getBean(Environment.class); + if(environment!=null && environment.containsProperty("project.serverless.basePath")){ + functionPath=environment.getProperty("project.serverless.basePath"); + } + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + String reqPath= URIUtils.getRequestPath(request); + if(reqPath.startsWith(functionPath)){ + String callFunc=reqPath.substring(functionPath.length()); + ServerlessFactoryBean bean=SpringContextHolder.getBean(ServerlessFactoryBean.class); + if(bean==null){ + response.getWriter().write(gson.toJson(AbstractController.wrapFailedMsg("ServerlessFactoryBean not registered!"))); + return; + }else if(!bean.hasFunction(callFunc)){ + response.getWriter().write(gson.toJson(AbstractController.wrapFailedMsg("serverless function not registered!"))); + return; + }else{ + Object retObj=bean.invokeFunc(request,response,callFunc); + response.getWriter().write(gson.toJson(AbstractController.wrapSuccess(retObj))); + return; + } + } + filterChain.doFilter(request,response); + } +} diff --git a/web/src/main/java/com/robin/core/web/serverless/IUserDefineServerlessFunction.java b/web/src/main/java/com/robin/core/web/serverless/IUserDefineServerlessFunction.java new file mode 100644 index 00000000..612f6a1b --- /dev/null +++ b/web/src/main/java/com/robin/core/web/serverless/IUserDefineServerlessFunction.java @@ -0,0 +1,7 @@ +package com.robin.core.web.serverless; + +import java.util.Map; + +public interface IUserDefineServerlessFunction { + Object doFunction(Map map); +} diff --git a/web/src/main/java/com/robin/core/web/serverless/ServerlessFactoryBean.java b/web/src/main/java/com/robin/core/web/serverless/ServerlessFactoryBean.java new file mode 100644 index 00000000..422d2b13 --- /dev/null +++ b/web/src/main/java/com/robin/core/web/serverless/ServerlessFactoryBean.java @@ -0,0 +1,278 @@ +package com.robin.core.web.serverless; + +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import com.robin.core.base.annotation.ServerlessFunction; +import com.robin.core.base.annotation.ServerlessMethodParam; +import com.robin.core.base.exception.MissingConfigException; +import com.robin.core.base.spring.SpringContextHolder; +import com.robin.core.web.controller.AbstractController; +import io.github.classgraph.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang3.tuple.Triple; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.env.Environment; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +public class ServerlessFactoryBean implements InitializingBean { + String defaultScanPackage="com.robin"; + private ScanResult scanResult; + private Map,Boolean>> serverlessFunMap=new HashMap<>(); + private Map prototypeHandlerMap=new HashMap<>(); + private Map> functionOriginClassMap=new HashMap<>(); + private Map userDefinedObjectMap=new HashMap<>(); + private Map> initFuncMap=new HashMap<>(); + private Gson gson=new Gson(); + + @Override + public void afterPropertiesSet() throws Exception { + doInit(); + } + public void doInit(){ + Environment environment= SpringContextHolder.getBean(Environment.class); + String scanPackage=environment!=null && environment.containsProperty("project.serverless.basePackage")? + environment.getProperty("project.serverless.basePackage"):defaultScanPackage; + ClassGraph graph= new ClassGraph().enableAllInfo(); + if(!ObjectUtils.isEmpty(scanPackage)){ + graph.whitelistPackages(scanPackage); + } + scanResult=graph.scan(); + Runtime.getRuntime().addShutdownHook(new Thread(() -> scanResult.close())); + ClassInfoList list= scanResult.getClassesWithMethodAnnotation(ServerlessFunction.class.getName()); + for(ClassInfo info:list){ + MethodInfoList methodInfos = info.getMethodInfo(); + for(MethodInfo methodInfo:methodInfos){ + boolean isStatic=methodInfo.isStatic(); + if(methodInfo.hasAnnotation(ServerlessFunction.class.getName())){ + AnnotationInfo methodAnnoInfo= methodInfo.getAnnotationInfo(ServerlessFunction.class.getName()); + String funName= methodInfo.getName(); + String initFunc=null; + String initParam=null; + AnnotationParameterValueList parameterValues= methodAnnoInfo.getParameterValues(); + if(!parameterValues.isEmpty()){ + for(AnnotationParameterValue parameterValue:parameterValues){ + if(parameterValue.getName().equals("value") && !ObjectUtils.isEmpty(parameterValue.getValue())){ + funName=parameterValue.getValue().toString(); + }else if(parameterValue.getName().equalsIgnoreCase("initFunc") && !ObjectUtils.isEmpty(parameterValue.getValue())){ + initFunc=parameterValue.getValue().toString(); + }else if(parameterValue.getName().equalsIgnoreCase("initParam") && !ObjectUtils.isEmpty(parameterValue.getValue())){ + initParam=parameterValue.getValue().toString(); + } + } + } + MethodParameterInfo[] parameterInfos= methodInfo.getParameterInfo(); + if(parameterInfos!=null && parameterInfos.length>0){ + List methodParameterInfoList=new ArrayList<>(); + for(MethodParameterInfo parameterInfo:parameterInfos) { + AnnotationInfo paramAnnoInfo= parameterInfo.getAnnotationInfo(ServerlessMethodParam.class.getName()); + ServerlessParameter parameter = new ServerlessParameter(); + parameter.setParamName(parameterInfo.getName()); + parameter.setSignature(parameterInfo.getTypeSignatureOrTypeDescriptor()); + if(paramAnnoInfo!=null){ + parameter.setParamName(paramAnnoInfo.getParameterValues().get(0).getValue().toString()); + } + methodParameterInfoList.add(parameter); + } + serverlessFunMap.put(funName, Triple.of(getMethodHandle(methodInfo),methodParameterInfoList,isStatic)); + }else{ + serverlessFunMap.put(funName,Triple.of(getMethodHandle(methodInfo),null,isStatic)); + } + if(!ObjectUtils.isEmpty(initFunc) && !methodInfo.isStatic()){ + Object obj=loadBeanOrUserDefined(funName); + try { + if (obj != null) { + Method method = null; + if (!ObjectUtils.isEmpty(initParam)) { + method = obj.getClass().getMethod(initFunc, Map.class); + if (method != null) { + initFuncMap.put(funName,Pair.of(initParam,getMethodHandle(method))); + } + } + } + }catch (Exception ex){ + throw new MissingConfigException(ex); + } + } + functionOriginClassMap.put(funName,info.loadClass()); + } + } + + } + } + private MethodHandle getMethodHandle(MethodInfo method){ + try{ + return MethodHandles.publicLookup().unreflect(method.loadClassAndGetMethod()); + }catch (IllegalAccessException ex) { + log.error("{}", ex.getMessage()); + throw new MissingConfigException(ex.getMessage()); + } + } + private MethodHandle getMethodHandle(Method method){ + try{ + return MethodHandles.publicLookup().unreflect(method); + }catch (IllegalAccessException ex) { + log.error("{}", ex.getMessage()); + throw new MissingConfigException(ex.getMessage()); + } + } + public void registerServerlessFunction(String functionName, IUserDefineServerlessFunction serverlessFunction) throws NoSuchMethodException,IllegalAccessException{ + if(serverlessFunMap.containsKey(functionName)){ + throw new MissingConfigException("function "+functionName+" already defined!"); + }else{ + IUserDefineServerlessFunction userFuncObj= (IUserDefineServerlessFunction) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{IUserDefineServerlessFunction.class}, + (proxy, method, args) -> serverlessFunction.doFunction((Map)args[0])); + userDefinedObjectMap.put(functionName,userFuncObj); + MethodHandle handler=MethodHandles.publicLookup().unreflect(userFuncObj.getClass().getMethod("doFunction", Map.class)); + if(handler!=null){ + ServerlessParameter parameter=new ServerlessParameter(); + parameter.setParamName("map"); + parameter.setSignature(new TypeSignature() { + @Override + public boolean equalsIgnoringTypeParams(TypeSignature typeSignature) { + return false; + } + + @Override + protected String toStringInternal(boolean b) { + return "java.util.Map"; + } + + @Override + protected String getClassName() { + return "java.util.Map"; + } + }); + List parameters=new ArrayList<>(); + parameters.add(parameter); + serverlessFunMap.put(functionName,Triple.of(handler,parameters,false)); + } + } + } + public boolean hasFunction(String functionName){ + return serverlessFunMap.containsKey(functionName); + } + public Object invokeFunc(HttpServletRequest request, HttpServletResponse response,String funcName){ + Object retObj=null; + if(serverlessFunMap.containsKey(funcName)){ + Triple,Boolean> function=serverlessFunMap.get(funcName); + Map paramMap=new HashMap<>(); + wrapRequestParameter(request,paramMap); + try { + if (!CollectionUtils.isEmpty(function.getMiddle())) { + List objects = new ArrayList<>(); + String content = null; + if (request.getMethod().equalsIgnoreCase("post") || request.getMethod().equalsIgnoreCase("put")) { + StringBuilder builder = new StringBuilder(); + try (BufferedReader reader = request.getReader()) { + String lineStr = null; + while ((lineStr = reader.readLine()) != null) { + builder.append(lineStr); + } + } catch (IOException ex1) { + + } + content = builder.toString(); + Assert.isTrue(content.startsWith("{") && content.endsWith("}"), "content not a validate json"); + } + + for (ServerlessParameter parameter : function.getMiddle()) { + if (parameter.getSignature().toString().contains("HttpServletRequest")) { + objects.add(request); + } else if (parameter.getSignature().toString().contains("HttpServletResponse")) { + objects.add(response); + } + if (parameter.getSignature().toString().startsWith("java.util.Map")) { + if (!ObjectUtils.isEmpty(content)) { + Map reqMap = gson.fromJson(content, new TypeToken>() { + }.getType()); + objects.add(reqMap); + } else { + throw new MissingConfigException("content is null,please use post or put to access HashMap"); + } + } else if (paramMap.containsKey(parameter.getParamName())) { + objects.add(getValue(parameter.getSignature(), paramMap.get(parameter.getParamName()))); + } + + } + if(function.getRight()) { + retObj = function.getLeft().invokeWithArguments(objects); + }else{ + Object obj = loadBeanOrUserDefined(funcName); + retObj=function.getLeft().bindTo(obj).invokeWithArguments(objects); + } + } else { + if(function.getRight()) { + retObj = function.getLeft().invoke(null); + }else{ + Object obj = loadBeanOrUserDefined(funcName); + retObj=function.getLeft().bindTo(obj).invokeExact(null); + } + } + return retObj; + }catch (Throwable ex){ + return AbstractController.wrapFailedMsg(ex.getMessage()); + } + }else{ + return AbstractController.wrapFailedMsg("function name "+funcName+" does not register!"); + } + } + + private Object loadBeanOrUserDefined(String funcName) { + Object obj = SpringContextHolder.getBean(functionOriginClassMap.get(funcName)); + if(obj==null){ + if(userDefinedObjectMap.containsKey(funcName)){ + obj=userDefinedObjectMap.get(funcName); + }else { + throw new MissingConfigException("with exception of static function and user defined,object must be managed bean"); + } + } return obj; + } + + public void wrapRequestParameter(HttpServletRequest request,Map paramMap){ + Map reqMap= request.getParameterMap(); + if(!CollectionUtils.isEmpty(reqMap)){ + reqMap.entrySet().forEach(entry->{ + paramMap.put(entry.getKey(),entry.getValue()[0]); + }); + } + } + public Object getValue(TypeSignature signature,String value) throws Throwable{ + prototypeHandlerMap.computeIfAbsent(signature.toString(),k->getHandler(k)); + if(prototypeHandlerMap.get(signature.toString())!=null){ + return prototypeHandlerMap.get(signature.toString()).invoke(value); + }else{ + throw new MissingConfigException("valueOf method not found in paramter "+signature); + } + + } + private MethodHandle getHandler(String clazzName){ + try { + Class clazz = Class.forName(clazzName); + Method method = clazz.getMethod("valueOf",String.class); + if(method!=null){ + return MethodHandles.publicLookup().unreflect(method); + }else{ + throw new MissingConfigException("valueOf method not found in paramter "+clazzName); + } + }catch (Exception ex){ + throw new RuntimeException(ex); + } + } +} diff --git a/web/src/main/java/com/robin/core/web/serverless/ServerlessParameter.java b/web/src/main/java/com/robin/core/web/serverless/ServerlessParameter.java new file mode 100644 index 00000000..b1a02aa0 --- /dev/null +++ b/web/src/main/java/com/robin/core/web/serverless/ServerlessParameter.java @@ -0,0 +1,15 @@ +package com.robin.core.web.serverless; + +import io.github.classgraph.MethodInfo; +import io.github.classgraph.TypeSignature; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class ServerlessParameter { + private String paramName; + private TypeSignature signature; + +} From c0eb2e6c332d353f5b2f99678e2c28231b940a08 Mon Sep 17 00:00:00 2001 From: robinhoodjim Date: Fri, 31 Oct 2025 13:44:17 +0800 Subject: [PATCH 6/7] serverless function --- .../fs/FileSystemAccessorFactory.java | 43 ++- ...bin.core.fileaccess.fs.IFileSystemAccessor | 3 +- .../base/annotation/ServerlessFunction.java | 1 + .../annotation/ServerlessMethodParam.java | 12 + .../base/service/AbstractMybatisService.java | 15 + .../base/service/IMybatisBaseService.java | 1 + .../java/com/robin/core/base/util/Const.java | 1 + .../etl/step/inbound/FsInboundComponent.java | 2 +- .../fileaccess/fs/BOSFileSystemAccessor.java | 2 +- .../fileaccess/fs/COSFileSystemAccessor.java | 2 +- ...CloudStorageFileSystemAccessorFactory.java | 4 +- .../fileaccess/fs/GCSFileSystemAccessor.java | 4 + .../fs/MinioFileSystemAccessor.java | 2 +- .../fileaccess/fs/OBSFileSystemAccessor.java | 2 +- .../fileaccess/fs/OSSFileSystemAccessor.java | 2 +- .../fs/QiniuFileSystemAccessor.java | 2 +- .../fileaccess/fs/S3FileSystemAccessor.java | 2 +- .../java/com/robin/test/TestCloudStorage.java | 94 +++++- .../web/controller/AbstractController.java | 8 + .../controller/AbstractCrudController.java | 4 +- .../controller/AbstractMyBatisController.java | 4 +- .../core/web/filter/ServerlessFilter.java | 33 +- .../core/web/serverless/DynamicFunction.java | 37 +++ .../web/serverless/DynamicJarClassLoader.java | 211 +++++++++++++ .../core/web/serverless/FunctionScanner.java | 290 ++++++++++++++++++ .../web/serverless/ServerlessFactoryBean.java | 242 ++++++++------- .../ServerlessJarLoaderFactoryBean.java | 227 ++++++++++++++ .../web/serverless/ServerlessParameter.java | 3 + 28 files changed, 1091 insertions(+), 162 deletions(-) create mode 100644 core/src/main/java/com/robin/core/base/annotation/ServerlessMethodParam.java create mode 100644 web/src/main/java/com/robin/core/web/serverless/DynamicFunction.java create mode 100644 web/src/main/java/com/robin/core/web/serverless/DynamicJarClassLoader.java create mode 100644 web/src/main/java/com/robin/core/web/serverless/FunctionScanner.java create mode 100644 web/src/main/java/com/robin/core/web/serverless/ServerlessJarLoaderFactoryBean.java diff --git a/common/src/main/java/com/robin/core/fileaccess/fs/FileSystemAccessorFactory.java b/common/src/main/java/com/robin/core/fileaccess/fs/FileSystemAccessorFactory.java index c383fa2d..70198fc1 100644 --- a/common/src/main/java/com/robin/core/fileaccess/fs/FileSystemAccessorFactory.java +++ b/common/src/main/java/com/robin/core/fileaccess/fs/FileSystemAccessorFactory.java @@ -1,6 +1,7 @@ package com.robin.core.fileaccess.fs; import com.robin.core.base.exception.MissingConfigException; +import com.robin.core.base.util.Const; import com.robin.core.fileaccess.meta.DataCollectionMeta; import lombok.NonNull; import org.springframework.util.ObjectUtils; @@ -21,7 +22,27 @@ public static AbstractFileSystemAccessor getResourceAccessorByType(@NonNull Stri try { Class clazz = accessorMap.get(resType); if (!ObjectUtils.isEmpty(clazz)) { - accessor = (AbstractFileSystemAccessor) clazz.getConstructor().newInstance(); + if(LocalFileSystemAccessor.class.isAssignableFrom(clazz)){ + accessor=LocalFileSystemAccessor.getInstance(); + }else { + accessor = (AbstractFileSystemAccessor) clazz.getConstructor().newInstance(); + } + } + } catch (Exception ex) { + throw new MissingConfigException(ex); + } + return accessor; + } + public static AbstractFileSystemAccessor getResourceAccessorByType(@NonNull Const.FILESYSTEM fsType) throws MissingConfigException { + AbstractFileSystemAccessor accessor = null; + try { + Class clazz = accessorMap.get(fsType.getValue()); + if (!ObjectUtils.isEmpty(clazz)) { + if(LocalFileSystemAccessor.class.isAssignableFrom(clazz)){ + accessor=LocalFileSystemAccessor.getInstance(); + }else { + accessor = (AbstractFileSystemAccessor) clazz.getConstructor().newInstance(); + } } } catch (Exception ex) { throw new MissingConfigException(ex); @@ -47,10 +68,30 @@ public static AbstractFileSystemAccessor getResourceAccessorByType(@NonNull Stri } return accessor; } + public static AbstractFileSystemAccessor getResourceAccessorByType(@NonNull Const.FILESYSTEM resType, @NonNull DataCollectionMeta colmeta) throws MissingConfigException { + AbstractFileSystemAccessor accessor = null; + try { + Class clazz = accessorMap.get(resType.getValue()); + if (!ObjectUtils.isEmpty(clazz)) { + if(LocalFileSystemAccessor.class.isAssignableFrom(clazz)){ + return LocalFileSystemAccessor.getInstance(); + }else { + accessor = (AbstractFileSystemAccessor) clazz.getConstructor().newInstance(); + if (!ObjectUtils.isEmpty(colmeta)) { + accessor.init(colmeta); + } + } + } + } catch (Exception ex) { + throw new MissingConfigException(ex); + } + return accessor; + } private static void discoverAccessor(Map> accessorMap) { ServiceLoader.load(IFileSystemAccessor.class).iterator().forEachRemaining(i -> { accessorMap.put(i.getIdentifier(), i.getClass()); }); + accessorMap.put(Const.FILESYSTEM.LOCAL.getValue(), LocalFileSystemAccessor.class); } } diff --git a/common/src/main/resources/META-INF/services/com.robin.core.fileaccess.fs.IFileSystemAccessor b/common/src/main/resources/META-INF/services/com.robin.core.fileaccess.fs.IFileSystemAccessor index 8e9a5339..190a5685 100644 --- a/common/src/main/resources/META-INF/services/com.robin.core.fileaccess.fs.IFileSystemAccessor +++ b/common/src/main/resources/META-INF/services/com.robin.core.fileaccess.fs.IFileSystemAccessor @@ -1,2 +1 @@ -com.robin.core.fileaccess.fs.ApacheVfsFileSystemAccessor -com.robin.core.fileaccess.fs.LocalFileSystemAccessor \ No newline at end of file +com.robin.core.fileaccess.fs.ApacheVfsFileSystemAccessor \ No newline at end of file diff --git a/core/src/main/java/com/robin/core/base/annotation/ServerlessFunction.java b/core/src/main/java/com/robin/core/base/annotation/ServerlessFunction.java index c88e60f5..908f7f4e 100644 --- a/core/src/main/java/com/robin/core/base/annotation/ServerlessFunction.java +++ b/core/src/main/java/com/robin/core/base/annotation/ServerlessFunction.java @@ -11,4 +11,5 @@ String value() default ""; String initFunc() default ""; String initParam() default ""; + String method() default ""; } diff --git a/core/src/main/java/com/robin/core/base/annotation/ServerlessMethodParam.java b/core/src/main/java/com/robin/core/base/annotation/ServerlessMethodParam.java new file mode 100644 index 00000000..a331293b --- /dev/null +++ b/core/src/main/java/com/robin/core/base/annotation/ServerlessMethodParam.java @@ -0,0 +1,12 @@ +package com.robin.core.base.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface ServerlessMethodParam { + String value() default ""; +} diff --git a/core/src/main/java/com/robin/core/base/service/AbstractMybatisService.java b/core/src/main/java/com/robin/core/base/service/AbstractMybatisService.java index 0dd9c69a..90d0b9d4 100644 --- a/core/src/main/java/com/robin/core/base/service/AbstractMybatisService.java +++ b/core/src/main/java/com/robin/core/base/service/AbstractMybatisService.java @@ -149,6 +149,20 @@ public boolean deleteByIds(List

ids) { @Override @Transactional(rollbackFor = RuntimeException.class) public boolean deleteByField(SFunction queryField,Const.OPERATOR operator,Object... value) { + QueryWrapper queryWrapper = QueryWrapperUtils.getWrapper(queryField, operator, value); + try{ + /*queryWrapper.eq(statusColumn,Const.VALID); + T vo=voType.getDeclaredConstructor().newInstance(); + getStatusMethod.bindTo(vo).invoke(Const.INVALID);*/ + + return this.remove(queryWrapper); + }catch (Throwable ex){ + throw new ServiceException(ex.getMessage()); + } + } + @Override + @Transactional(rollbackFor = RuntimeException.class) + public boolean deleteLogicByField(SFunction queryField,Const.OPERATOR operator,Object... value) { QueryWrapper queryWrapper = QueryWrapperUtils.getWrapper(queryField, operator, value); try{ queryWrapper.eq(statusColumn,Const.VALID); @@ -172,6 +186,7 @@ public boolean deleteByLogic(List

ids, SFunction logicField){ + @Override public List selectByField(String columName, Object value) { QueryWrapper queryWrapper = new QueryWrapper<>(); diff --git a/core/src/main/java/com/robin/core/base/service/IMybatisBaseService.java b/core/src/main/java/com/robin/core/base/service/IMybatisBaseService.java index cdd360ab..1a6aa9ee 100644 --- a/core/src/main/java/com/robin/core/base/service/IMybatisBaseService.java +++ b/core/src/main/java/com/robin/core/base/service/IMybatisBaseService.java @@ -53,6 +53,7 @@ public interface IMybatisBaseService parseId(String ids) throws ServiceException; boolean deleteByIds(List

ids); boolean deleteByField(SFunction queryField,Const.OPERATOR oper,Object... value); + boolean deleteLogicByField(SFunction queryField,Const.OPERATOR oper,Object... value); boolean updateModelById(T entity); void queryBySelectId(PageQuery> query) throws ServiceException; List> queryBySql(String sqlstr, Object... objects) throws ServiceException; diff --git a/core/src/main/java/com/robin/core/base/util/Const.java b/core/src/main/java/com/robin/core/base/util/Const.java index de421324..603664f8 100644 --- a/core/src/main/java/com/robin/core/base/util/Const.java +++ b/core/src/main/java/com/robin/core/base/util/Const.java @@ -401,6 +401,7 @@ public enum FILESYSTEM{ QINIU("qiniu"), BAIDU_BOS("bos"), HUAWEI_OBS("obs"), + GOOGLECLOUD("gcs"), MINIO("minio"); private String value; FILESYSTEM(String value){ diff --git a/etl/src/main/java/com/robin/etl/step/inbound/FsInboundComponent.java b/etl/src/main/java/com/robin/etl/step/inbound/FsInboundComponent.java index 847500ad..ce6c2267 100644 --- a/etl/src/main/java/com/robin/etl/step/inbound/FsInboundComponent.java +++ b/etl/src/main/java/com/robin/etl/step/inbound/FsInboundComponent.java @@ -28,7 +28,7 @@ protected void init(StatefulJobContext context, StepContext stepContext) { fileStorageType=context.getJobParam().get(EtlConstant.FILESTORAGETYPE).toString(); accessor= FileSystemAccessorFactory.getResourceAccessorByType(fileStorageType); if (accessor == null) { - accessor= CloudStorageFileSystemAccessorFactory.getAccessorByIdentifier(context.getInputMeta(),fileStorageType); + accessor= CloudStorageFileSystemAccessorFactory.getAccessorByIdentifier(fileStorageType, context.getInputMeta()); } } diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/BOSFileSystemAccessor.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/BOSFileSystemAccessor.java index f462d828..97c7be02 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/BOSFileSystemAccessor.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/BOSFileSystemAccessor.java @@ -27,7 +27,7 @@ public class BOSFileSystemAccessor extends AbstractCloudStorageFileSystemAccesso private String securityAccessKey; private BosClient client; - private BOSFileSystemAccessor(){ + public BOSFileSystemAccessor(){ this.identifier= Const.FILESYSTEM.BAIDU_BOS.getValue(); } diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/COSFileSystemAccessor.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/COSFileSystemAccessor.java index 8221c0aa..b5640138 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/COSFileSystemAccessor.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/COSFileSystemAccessor.java @@ -40,7 +40,7 @@ public class COSFileSystemAccessor extends AbstractCloudStorageFileSystemAccesso private HttpProtocol protocol=HttpProtocol.http; private String securityKey; private String accessKey; - private COSFileSystemAccessor(){ + public COSFileSystemAccessor(){ this.identifier= Const.FILESYSTEM.TENCENT.getValue(); } diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/CloudStorageFileSystemAccessorFactory.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/CloudStorageFileSystemAccessorFactory.java index 4c7513c7..b50eec8b 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/CloudStorageFileSystemAccessorFactory.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/CloudStorageFileSystemAccessorFactory.java @@ -6,8 +6,8 @@ import com.robin.core.fileaccess.meta.DataCollectionMeta; public class CloudStorageFileSystemAccessorFactory { - public static AbstractFileSystemAccessor getAccessorByIdentifier(DataCollectionMeta colmeta,String identifier){ - Const.FILESYSTEM filesystem= Const.FILESYSTEM.valueOf(identifier); + public static AbstractFileSystemAccessor getAccessorByIdentifier(String identifier, DataCollectionMeta colmeta){ + Const.FILESYSTEM filesystem= Const.FILESYSTEM.forName(identifier); AbstractFileSystemAccessor accessor=null; switch (filesystem){ case BAIDU_BOS: diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/GCSFileSystemAccessor.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/GCSFileSystemAccessor.java index ff080cd3..60f4bb3d 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/GCSFileSystemAccessor.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/GCSFileSystemAccessor.java @@ -5,6 +5,7 @@ import com.google.common.collect.Lists; import com.robin.core.base.exception.MissingConfigException; import com.robin.core.base.exception.OperationNotSupportException; +import com.robin.core.base.util.Const; import com.robin.core.base.util.ResourceConst; import com.robin.core.fileaccess.meta.DataCollectionMeta; import com.robin.core.fileaccess.util.ByteBufferOutputStream; @@ -36,6 +37,9 @@ public class GCSFileSystemAccessor extends AbstractCloudStorageFileSystemAccesso private List scopes; private Storage storage; private int dumpOffHeapSize = ResourceConst.DEFAULTDUMPEDOFFHEAPSIZE; + public GCSFileSystemAccessor(){ + this.identifier= Const.FILESYSTEM.GOOGLECLOUD.getValue(); + } @Override public void init(DataCollectionMeta meta) { diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/MinioFileSystemAccessor.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/MinioFileSystemAccessor.java index 92c119b1..bb0accd1 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/MinioFileSystemAccessor.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/MinioFileSystemAccessor.java @@ -42,7 +42,7 @@ public class MinioFileSystemAccessor extends AbstractCloudStorageFileSystemAcces private MinioAdminClient adminClient; private OkHttpClient httpClient; - private MinioFileSystemAccessor(){ + public MinioFileSystemAccessor(){ this.identifier= Const.FILESYSTEM.MINIO.getValue(); } diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/OBSFileSystemAccessor.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/OBSFileSystemAccessor.java index 878531dd..c77cf321 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/OBSFileSystemAccessor.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/OBSFileSystemAccessor.java @@ -27,7 +27,7 @@ public class OBSFileSystemAccessor extends AbstractCloudStorageFileSystemAccesso private String securityAccessKey; private ObsClient client; - private OBSFileSystemAccessor() { + public OBSFileSystemAccessor() { this.identifier= Const.FILESYSTEM.HUAWEI_OBS.getValue(); } diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/OSSFileSystemAccessor.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/OSSFileSystemAccessor.java index e886dbdf..5ad5d346 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/OSSFileSystemAccessor.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/OSSFileSystemAccessor.java @@ -32,7 +32,7 @@ public class OSSFileSystemAccessor extends AbstractCloudStorageFileSystemAccesso private String accessKeyId; private String securityAccessKey; - private OSSFileSystemAccessor() { + public OSSFileSystemAccessor() { this.identifier = Const.FILESYSTEM.ALIYUN.getValue(); } diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/QiniuFileSystemAccessor.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/QiniuFileSystemAccessor.java index 641ceab9..3913a370 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/QiniuFileSystemAccessor.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/QiniuFileSystemAccessor.java @@ -52,7 +52,7 @@ public class QiniuFileSystemAccessor extends AbstractCloudStorageFileSystemAcces private Client client; private String urlPrefix; - private QiniuFileSystemAccessor() { + public QiniuFileSystemAccessor() { this.identifier = Const.FILESYSTEM.QINIU.getValue(); } diff --git a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/S3FileSystemAccessor.java b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/S3FileSystemAccessor.java index ec02f053..303e0719 100644 --- a/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/S3FileSystemAccessor.java +++ b/hadooptool/src/main/java/com/robin/comm/fileaccess/fs/S3FileSystemAccessor.java @@ -35,7 +35,7 @@ public class S3FileSystemAccessor extends AbstractCloudStorageFileSystemAccessor private String accessKey; private String secret; - private S3FileSystemAccessor(){ + public S3FileSystemAccessor(){ this.identifier= Const.FILESYSTEM.S3.getValue(); } diff --git a/hadooptool/src/test/java/com/robin/test/TestCloudStorage.java b/hadooptool/src/test/java/com/robin/test/TestCloudStorage.java index 87288ff5..fd0cd2a1 100644 --- a/hadooptool/src/test/java/com/robin/test/TestCloudStorage.java +++ b/hadooptool/src/test/java/com/robin/test/TestCloudStorage.java @@ -2,14 +2,18 @@ import com.robin.comm.fileaccess.fs.MinioFileSystemAccessor; import com.robin.comm.sql.FilterSqlParser; +import com.robin.comm.util.xls.ExcelColumnProp; +import com.robin.comm.util.xls.ExcelSheetProp; import com.robin.core.base.util.Const; import com.robin.core.base.util.ResourceConst; import com.robin.core.base.util.StringUtils; +import com.robin.core.fileaccess.fs.LocalFileSystemAccessor; import com.robin.core.fileaccess.iterator.AbstractFileIterator; import com.robin.core.fileaccess.iterator.TextFileIteratorFactory; import com.robin.core.fileaccess.meta.DataCollectionMeta; import com.robin.core.fileaccess.writer.AbstractFileWriter; import com.robin.core.fileaccess.writer.TextFileWriterFactory; +import com.robin.core.fileaccess.writer.XlsxFileWriter; import com.robin.dfs.minio.MinioUtils; import io.minio.MinioAsyncClient; import io.minio.RemoveObjectArgs; @@ -17,6 +21,7 @@ import org.junit.Test; import java.io.FileInputStream; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.*; @@ -24,7 +29,7 @@ public class TestCloudStorage extends TestCase { @Test public void testDeleteMinion() throws Exception{ - MinioAsyncClient.Builder builder=MinioAsyncClient.builder().endpoint("http://36.158.32.29:18888") + MinioAsyncClient.Builder builder=MinioAsyncClient.builder().endpoint("http://36.158.32.29:18889") .credentials("jeason","Jeason@1234"); MinioAsyncClient client=builder.build(); client.removeObject(RemoveObjectArgs.builder().bucket("test").object("tmp/bigdata5.parquet.gz").build()).join(); @@ -43,19 +48,27 @@ public void testWriteToMinio(){ builder.addColumn("amount",Const.META_TYPE_INTEGER,null); builder.addColumn("type",Const.META_TYPE_INTEGER,null); - builder.resourceCfg(ResourceConst.PARQUETFILEFORMAT,ResourceConst.PARQUETSUPPORTFORMAT.PROTOBUF.getValue()).fileFormat(Const.FILEFORMATSTR.CSV.getValue()) - .resPath("/tmp/bigdata3.csv.gz").resourceCfg("protocol",Const.VFS_PROTOCOL.FTP.getValue()) - .resourceCfg("hostName","127.0.0.1").resourceCfg("userName","test").resourceCfg("password","test").protocol(Const.VFS_PROTOCOL.FTP.getValue()).fsType(Const.FILESYSTEM.VFS.getValue()) + builder.resourceCfg(ResourceConst.PARQUETFILEFORMAT,ResourceConst.PARQUETSUPPORTFORMAT.PROTOBUF.getValue()).fileFormat(Const.FILEFORMATSTR.PROTOBUF.getValue()) + .resPath("file:///f:/bigdata4.proto").resourceCfg("protocol",Const.VFS_PROTOCOL.FTP.getValue()).fsType(Const.FILESYSTEM.LOCAL.getValue()) + //.resourceCfg("hostName","127.0.0.1").resourceCfg("userName","test").resourceCfg("password","test").protocol(Const.VFS_PROTOCOL.FTP.getValue()).fsType(Const.FILESYSTEM.VFS.getValue()) //.resourceCfg(ResourceConst.USEASYNCUPLOAD,"true") .resourceCfg(ResourceConst.DEFAULTCACHEOFFHEAPSIZEKEY,1000*1000*6); - ResourceBundle bundle=ResourceBundle.getBundle("minio"); + DataCollectionMeta colmeta=builder.build(); - /*MinioFileSystemAccessor.Builder builder1=new MinioFileSystemAccessor.Builder(); + /* + ResourceBundle bundle=ResourceBundle.getBundle("minio"); + MinioFileSystemAccessor.Builder builder1=new MinioFileSystemAccessor.Builder(); MinioFileSystemAccessor accessor=builder1.accessKey(bundle.getString("minio.accessKey")).secretKey(bundle.getString("minio.secretKey")).endpoint(bundle.getString("minio.endpoint")) - .bucket("test").build();*/ + .bucket("test").build(); + QiniuFileSystemAccessor.Builder builder1=new QiniuFileSystemAccessor.Builder(); + ResourceBundle bundle=ResourceBundle.getBundle("qiniu"); + + builder1.domain(bundle.getString("domain")).region(Region.autoRegion()).bucket(bundle.getString("bucket")) + .accessKey(bundle.getString("accessKey")).urlPrefix(bundle.getString("urlPrefix")).secretKey(bundle.getString("secretKey")).withMetaConfig(colmeta); + QiniuFileSystemAccessor accessor=builder1.build();*/ - try (AbstractFileWriter jwriter = (AbstractFileWriter) TextFileWriterFactory.getWriterByType(colmeta)){ + try (AbstractFileWriter jwriter = (AbstractFileWriter) TextFileWriterFactory.getWriterByType(colmeta,LocalFileSystemAccessor.getInstance())){ System.out.println(new Date()); jwriter.beginWrite(); Map recMap = new HashMap<>(); @@ -81,9 +94,67 @@ public void testWriteToMinio(){ ex.printStackTrace(); } } + @Test + public void testRead(){ + DataCollectionMeta.Builder builder=new DataCollectionMeta.Builder(); + builder.fileFormat(Const.FILEFORMATSTR.ORC.getValue()).resPath("file:///f:/bigdata4.orc.snappy") + .fsType(Const.FILESYSTEM.LOCAL.getValue()); + try(AbstractFileIterator iterator=TextFileIteratorFactory.getProcessReaderIterator(builder.build(),LocalFileSystemAccessor.getInstance())){ + int count=0; + while (iterator.hasNext()){ + //System.out.println(iterator.next()); + iterator.next(); + count++; + } + System.out.println(count); + }catch (IOException ex){ + ex.printStackTrace(); + } + + } @Test - public void testReadFromMinio(){ + public static void testWriteStAX() { + ExcelSheetProp.Builder newBuilder = ExcelSheetProp.Builder.newBuilder(); + newBuilder.addColumnProp(new ExcelColumnProp("name", "name", Const.META_TYPE_STRING, false)); + newBuilder.addColumnProp(new ExcelColumnProp("time", "time", Const.META_TYPE_TIMESTAMP, false)); + newBuilder.addColumnProp(new ExcelColumnProp("intcol", "intcol", Const.META_TYPE_INTEGER, false)); + newBuilder.addColumnProp(new ExcelColumnProp("dval", "dval", Const.META_TYPE_DOUBLE, false)); + newBuilder.addColumnProp(new ExcelColumnProp("dval2", "dval2", Const.META_TYPE_DOUBLE, false)); + newBuilder.addColumnProp(new ExcelColumnProp("diff", "diff", Const.META_TYPE_FORMULA, "(D{P}-E{P})/C{P}")); + DataCollectionMeta.Builder builder = new DataCollectionMeta.Builder(); + builder.addColumn("name", Const.META_TYPE_STRING).addColumn("time", Const.META_TYPE_TIMESTAMP) + .addColumn("intcol", Const.META_TYPE_INTEGER).addColumn("dval", Const.META_TYPE_DOUBLE) + .addColumn("dval2", Const.META_TYPE_DOUBLE).addColumn("diff", Const.META_TYPE_DOUBLE) + .resourceCfg(Const.COLUMN_XLSX_MULTIPLESHEETS,"true") + .fileFormat(Const.FILEFORMATSTR.XLSX.getValue()).resPath("tmp/test.xlsx"); + DataCollectionMeta meta = builder.build(); + ResourceBundle bundle=ResourceBundle.getBundle("minio"); + MinioFileSystemAccessor.Builder builder1=new MinioFileSystemAccessor.Builder(); + MinioFileSystemAccessor accessor=builder1.accessKey(bundle.getString("minio.accessKey")).secretKey(bundle.getString("minio.secretKey")).endpoint(bundle.getString("minio.endpoint")) + .bucket("test").build(); + //LocalFileSystemAccessor accessor = LocalFileSystemAccessor.getInstance(); + Random random = new Random(12312321321312L); + Map cachedMap=new HashMap<>(); + try(XlsxFileWriter writer=(XlsxFileWriter) TextFileWriterFactory.getWriterByType(meta,accessor)){ + writer.setSheetProp(newBuilder.build()); + writer.beginWrite(); + Long startTs = System.currentTimeMillis() - 3600 * 24 * 1000; + for(int j=0;j<120000;j++){ + cachedMap.put("name", StringUtils.generateRandomChar(12)); + cachedMap.put("time", String.valueOf(startTs + j * 1000)); + cachedMap.put("intcol", String.valueOf(random.nextInt(1000))); + cachedMap.put("dval", String.valueOf(random.nextDouble() * 1000)); + cachedMap.put("dval2", String.valueOf(random.nextDouble() * 500)); + writer.writeRecord(cachedMap); + } + writer.finishWrite(); + }catch (Exception ex){ + ex.printStackTrace(); + } + } + @Test + public void testReadFromMinio() throws Exception{ DataCollectionMeta.Builder builder=new DataCollectionMeta.Builder(); builder.addColumn("id",Const.META_TYPE_BIGINT,null); builder.addColumn("name",Const.META_TYPE_STRING,null); @@ -103,6 +174,7 @@ public void testReadFromMinio(){ MinioFileSystemAccessor.Builder builder1=new MinioFileSystemAccessor.Builder(); MinioFileSystemAccessor accessor=builder1.accessKey(bundle.getString("minio.accessKey")).secretKey(bundle.getString("minio.secretKey")).endpoint(bundle.getString("minio.endpoint")) .bucket("test").build(); + long size=accessor.getInputStreamSize("/tmp"); try(AbstractFileIterator iterator=(AbstractFileIterator) TextFileIteratorFactory.getProcessIteratorByType(colmeta,accessor)){ int pos=0; while (iterator.hasNext()){ @@ -119,9 +191,9 @@ public void uploadFile(){ ResourceBundle bundle=ResourceBundle.getBundle("minio"); MinioAsyncClient.Builder builder= MinioAsyncClient.builder().endpoint(bundle.getString("minio.endpoint")).credentials(bundle.getString("minio.accessKey"),bundle.getString("minio.secretKey")); MinioAsyncClient client=builder.build(); - try(FileInputStream inputStream=new FileInputStream("e:/SF000010595188.pdf");){ + try(FileInputStream inputStream=new FileInputStream("E:/data/runningLibs/jars/function1.jar");){ //download(client,"20240510/SF000010715871.pdf",outputStream); - MinioUtils.putBucket(client,"test","tmp/SF000010595188.pdf",inputStream, Files.size(Paths.get("e:/SF000010595188.pdf")),"application/pdf"); + MinioUtils.putBucket(client,"test","tmp/runningJars/function1.jar",inputStream, Files.size(Paths.get("E:/data/runningLibs/jars/function1.jar")),"application/java-archive"); }catch (Exception ex){ ex.printStackTrace(); diff --git a/web/src/main/java/com/robin/core/web/controller/AbstractController.java b/web/src/main/java/com/robin/core/web/controller/AbstractController.java index e0dbc9a8..61b1fafd 100644 --- a/web/src/main/java/com/robin/core/web/controller/AbstractController.java +++ b/web/src/main/java/com/robin/core/web/controller/AbstractController.java @@ -373,6 +373,14 @@ public static Map wrapSuccessMsg(String message){ } return retmap; } + public static Map wrapSuccess(Object result){ + Map retmap=new HashMap<>(); + retmap.put(COL_SUCCESS, true); + if(!ObjectUtils.isEmpty(result)){ + retmap.put(COL_DATA,result); + } + return retmap; + } public static Map wrapFailedMsg(String message){ Map retmap=new HashMap<>(); retmap.put(COL_SUCCESS, false); diff --git a/web/src/main/java/com/robin/core/web/controller/AbstractCrudController.java b/web/src/main/java/com/robin/core/web/controller/AbstractCrudController.java index 899e3a83..e5ebfaca 100644 --- a/web/src/main/java/com/robin/core/web/controller/AbstractCrudController.java +++ b/web/src/main/java/com/robin/core/web/controller/AbstractCrudController.java @@ -92,7 +92,7 @@ protected Map doSave(Map paramMap) { try { O object=this.objectType.newInstance(); ConvertUtil.setDateTimeFormat(ConvertUtil.ymdSepformatter); - ConvertUtil.convertToModel(object,paramMap); + ConvertUtil.convertToModel(paramMap, object); P pk=this.service.saveEntity(object); constructRetMap(retMap); doAfterAdd(object,pk, retMap); @@ -137,7 +137,7 @@ protected Map doUpdate(Map paramMap,P id) { try { O originObj= this.objectType.newInstance(); ConvertUtil.setDateTimeFormat(ConvertUtil.ymdSepformatter); - ConvertUtil.convertToModel(originObj,paramMap); + ConvertUtil.convertToModel(paramMap, originObj); updateWithOrigin(id, retMap, originObj); } catch (Exception ex) { log.error("{0}", ex); diff --git a/web/src/main/java/com/robin/core/web/controller/AbstractMyBatisController.java b/web/src/main/java/com/robin/core/web/controller/AbstractMyBatisController.java index 3bc4a8f4..1de754db 100644 --- a/web/src/main/java/com/robin/core/web/controller/AbstractMyBatisController.java +++ b/web/src/main/java/com/robin/core/web/controller/AbstractMyBatisController.java @@ -142,7 +142,7 @@ protected Map doSave(Map paramMap, Consumer co try { T object=this.voType.newInstance(); ConvertUtil.setDateTimeFormat(ConvertUtil.ymdSepformatter); - ConvertUtil.convertToModel(object,paramMap); + ConvertUtil.convertToModel(paramMap, object); if(consumer!=null){ consumer.accept(object); } @@ -200,7 +200,7 @@ protected Map doUpdate(Map paramMap,P id) { try { T originObj= this.voType.getDeclaredConstructor().newInstance(); ConvertUtil.setDateTimeFormat(ConvertUtil.ymdSepformatter); - ConvertUtil.convertToModel(originObj,paramMap); + ConvertUtil.convertToModel(paramMap, originObj); updateWithOrigin(id, retMap, originObj); } catch (Exception ex) { log.error("{0}", ex); diff --git a/web/src/main/java/com/robin/core/web/filter/ServerlessFilter.java b/web/src/main/java/com/robin/core/web/filter/ServerlessFilter.java index dd1df1d0..96f77337 100644 --- a/web/src/main/java/com/robin/core/web/filter/ServerlessFilter.java +++ b/web/src/main/java/com/robin/core/web/filter/ServerlessFilter.java @@ -3,7 +3,7 @@ import com.google.gson.Gson; import com.robin.core.base.spring.SpringContextHolder; import com.robin.core.web.controller.AbstractController; -import com.robin.core.web.serverless.ServerlessFactoryBean; +import com.robin.core.web.serverless.ServerlessJarLoaderFactoryBean; import com.robin.core.web.util.URIUtils; import org.springframework.core.env.Environment; import org.springframework.web.filter.OncePerRequestFilter; @@ -15,33 +15,34 @@ import java.io.IOException; public class ServerlessFilter extends OncePerRequestFilter { - private Gson gson=new Gson(); - String functionPath="/serverless/"; - public ServerlessFilter(){ - Environment environment= SpringContextHolder.getBean(Environment.class); - if(environment!=null && environment.containsProperty("project.serverless.basePath")){ - functionPath=environment.getProperty("project.serverless.basePath"); + private final Gson gson = new Gson(); + String functionPath = "/serverless/"; + + public ServerlessFilter() { + Environment environment = SpringContextHolder.getBean(Environment.class); + if (environment != null && environment.containsProperty("project.serverless.basePath")) { + functionPath = environment.getProperty("project.serverless.basePath"); } } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - String reqPath= URIUtils.getRequestPath(request); - if(reqPath.startsWith(functionPath)){ - String callFunc=reqPath.substring(functionPath.length()); - ServerlessFactoryBean bean=SpringContextHolder.getBean(ServerlessFactoryBean.class); - if(bean==null){ + String reqPath = URIUtils.getRequestPath(request); + if (reqPath.startsWith(functionPath)) { + String callFunc = reqPath.substring(functionPath.length()); + ServerlessJarLoaderFactoryBean bean = SpringContextHolder.getBean(ServerlessJarLoaderFactoryBean.class); + if (bean == null) { response.getWriter().write(gson.toJson(AbstractController.wrapFailedMsg("ServerlessFactoryBean not registered!"))); return; - }else if(!bean.hasFunction(callFunc)){ + } else if (!bean.hasFunction(callFunc)) { response.getWriter().write(gson.toJson(AbstractController.wrapFailedMsg("serverless function not registered!"))); return; - }else{ - Object retObj=bean.invokeFunc(request,response,callFunc); + } else { + Object retObj = bean.invokeFunc(request, response, callFunc); response.getWriter().write(gson.toJson(AbstractController.wrapSuccess(retObj))); return; } } - filterChain.doFilter(request,response); + filterChain.doFilter(request, response); } } diff --git a/web/src/main/java/com/robin/core/web/serverless/DynamicFunction.java b/web/src/main/java/com/robin/core/web/serverless/DynamicFunction.java new file mode 100644 index 00000000..1d17abff --- /dev/null +++ b/web/src/main/java/com/robin/core/web/serverless/DynamicFunction.java @@ -0,0 +1,37 @@ +package com.robin.core.web.serverless; + +import com.google.common.collect.Lists; +import lombok.Getter; +import lombok.Setter; +import org.springframework.util.ObjectUtils; + +import java.lang.invoke.MethodHandle; +import java.util.List; + +@Getter +@Setter +public class DynamicFunction { + private MethodHandle invokeMethod; + private List parameters; + private boolean funStatic; + private List callMethods; + public DynamicFunction(MethodHandle handle,List parameters,boolean funStatic){ + this.invokeMethod=handle; + this.parameters=parameters; + this.funStatic=funStatic; + } + public DynamicFunction(MethodHandle handle,List parameters,boolean funStatic,String callMethods){ + this.invokeMethod=handle; + this.parameters=parameters; + this.funStatic=funStatic; + if(!ObjectUtils.isEmpty(callMethods)){ + this.callMethods= Lists.newArrayList(callMethods.split(",")); + } + } + public boolean checkCallMethod(String callMethod){ + return ObjectUtils.isEmpty(callMethods) || callMethods.contains(callMethod.toLowerCase()); + } + + + +} diff --git a/web/src/main/java/com/robin/core/web/serverless/DynamicJarClassLoader.java b/web/src/main/java/com/robin/core/web/serverless/DynamicJarClassLoader.java new file mode 100644 index 00000000..48dd9ed1 --- /dev/null +++ b/web/src/main/java/com/robin/core/web/serverless/DynamicJarClassLoader.java @@ -0,0 +1,211 @@ +package com.robin.core.web.serverless; + +import com.robin.core.fileaccess.fs.AbstractFileSystemAccessor; +import com.robin.core.fileaccess.meta.DataCollectionMeta; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.ObjectUtils; + +import java.io.*; +import java.net.*; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.jar.JarEntry; +import java.util.jar.JarInputStream; +import java.util.stream.Collectors; + +@Slf4j +public class DynamicJarClassLoader extends URLClassLoader { + private final ClassLoader superloader; + private final Map cachedMap = new ConcurrentHashMap<>(); + private final List resources = new ArrayList<>(); + private final DataCollectionMeta collectionMeta; + private static final String DOT = "."; + private static final String SEP = "/"; + private URL callUrl = null; + private String[] loadJars = null; + private final AbstractFileSystemAccessor accessor; + private final URLStreamHandler handler; + + public DynamicJarClassLoader(URL[] urls, ClassLoader parent, DataCollectionMeta collectionMeta, String loadJars, AbstractFileSystemAccessor accessor) throws MalformedURLException { + super(urls, parent); + superloader = parent; + this.collectionMeta = collectionMeta; + if (!ObjectUtils.isEmpty(loadJars)) { + this.loadJars = loadJars.split(","); + } + handler = new FsStreamHandler(); + callUrl = new URL(collectionMeta.getFsType(), null, -1, SEP, handler); + super.addURL(callUrl); + this.accessor = accessor; + try { + doInit(); + } catch (IOException ex) { + + } + } + + @Override + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + byte[] data = cachedMap.get(name); + if (data == null) { + return superloader.loadClass(name); + } + log.debug("dynamic load class " + name); + Class clazz = defineClass(translateName(name), data, 0, data.length); + return clazz; + } + + @Override + public InputStream getResourceAsStream(String name) { + byte[] data = cachedMap.get(name); + if (data == null) { + return superloader.getResourceAsStream(name); + } + return new ByteArrayInputStream(data); + } + + @Override + public URL findResource(String name) { + try { + if (cachedMap.containsKey(name)) { + return new URL(collectionMeta.getFsType(), "localhost", 0, name, handler); + } else { + return super.findResource(name); + } + } catch (MalformedURLException ex) { + + } + return null; + } + + + @Override + public Enumeration findResources(String name) throws IOException { + List urls = new ArrayList<>(); + + if (ObjectUtils.isEmpty(name)) { + for (String resourceName : resources) { + urls.add(new URL(collectionMeta.getFsType(), "localhost", 0, resourceName, handler)); + } + return Collections.enumeration(urls); + } else { + List filterList = resources.stream().filter(f -> f.startsWith(name)).collect(Collectors.toList()); + if (filterList.size() > 0) { + for (String resourceName : filterList) { + urls.add(new URL(collectionMeta.getFsType(), "localhost", 0, resourceName, handler)); + } + return Collections.enumeration(urls); + } else { + return super.findResources(name); + } + } + } + + @Override + public Enumeration getResources(String name) throws IOException { + List urls = new ArrayList<>(); + + if (ObjectUtils.isEmpty(name)) { + for (String resourceName : resources) { + urls.add(new URL(collectionMeta.getFsType(), "localhost", 0, resourceName, handler)); + } + return Collections.enumeration(urls); + } else { + List filterList = resources.stream().filter(f -> f.startsWith(name)).collect(Collectors.toList()); + if (filterList.size() > 0) { + for (String resourceName : filterList) { + urls.add(new URL(collectionMeta.getFsType(), "localhost", 0, resourceName, handler)); + } + return Collections.enumeration(urls); + } else { + return superloader.getResources(name); + } + } + } + + + @Override + public void close() throws IOException { + cachedMap.clear(); + super.close(); + } + + private class FsStreamHandler extends URLStreamHandler { + + @Override + protected URLConnection openConnection(URL u) throws IOException { + return new FsURLConnection(u); + } + } + + private class FsURLConnection extends URLConnection { + + + public FsURLConnection(URL url) { + super(url); + } + + @Override + public void connect() throws IOException { + + } + + @Override + public InputStream getInputStream() throws IOException { + String fileName = url.getFile(); + byte[] data = cachedMap.get(fileName); + if (data == null) { + throw new FileNotFoundException("class " + fileName + " not found "); + } + return new ByteArrayInputStream(data); + } + } + + public void doInit() throws IOException { + + if (loadJars != null && loadJars.length > 0) { + for (int i = 0; i < loadJars.length; i++) { + extractByteCode(loadJars[i]); + } + } + } + + private void extractByteCode(String fileName) throws IOException { + ByteArrayOutputStream out ; + int len = 0; + byte[] b = new byte[8192]; + log.debug("begin to load with fileSystem {} path {}",collectionMeta.getFsType(),fileName); + try (InputStream inputStream = accessor.getRawInputStream(fileName); + JarInputStream jis = new JarInputStream(inputStream)) { + JarEntry jarEntry ; + while ((jarEntry = jis.getNextJarEntry()) != null) { + String name = SEP + jarEntry.getName(); + if (jarEntry.isDirectory()) { + log.debug("ignore path " + name); + continue; + } + resources.add(name); + out = new ByteArrayOutputStream(); + + while ((len = jis.read(b)) > 0) { + out.write(b, 0, len); + } + + log.debug("Jar entry = " + name); + cachedMap.put(name, out.toByteArray()); + out.close(); + } + } + } + + private String translateName(String path) { + String className = path.substring(1).replace(SEP, DOT); + int pos = className.indexOf("class"); + return className.substring(0, pos - 1); + } + + + public List getResources() { + return resources; + } +} diff --git a/web/src/main/java/com/robin/core/web/serverless/FunctionScanner.java b/web/src/main/java/com/robin/core/web/serverless/FunctionScanner.java new file mode 100644 index 00000000..0eb0f4cb --- /dev/null +++ b/web/src/main/java/com/robin/core/web/serverless/FunctionScanner.java @@ -0,0 +1,290 @@ +package com.robin.core.web.serverless; + +import com.robin.core.base.annotation.ServerlessFunction; +import com.robin.core.base.annotation.ServerlessMethodParam; +import com.robin.core.base.exception.MissingConfigException; +import com.robin.core.base.spring.SpringContextHolder; +import io.github.classgraph.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang3.tuple.Triple; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.IOException; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.Parameter; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Slf4j +public class FunctionScanner { + private FunctionScanner() { + + } + + static void scanPackageOrigin(String scanPackage,DynamicJarClassLoader loader, Map serverlessFunMap, Map> functionOriginClassMap, Map userDefinedObjectMap, Map> initFuncMap, List funcList) throws IOException { + List resources = loader.getResources(); + for (String className : resources) { + if (!className.endsWith("class")) { + continue; + } + String packageName=getPackage(className); + if(!packageName.startsWith(scanPackage)){ + continue; + } + Class clazz ; + try { + clazz=loader.loadClass(className); + } catch (ClassNotFoundException ex) { + throw new MissingConfigException(ex.getMessage()); + } + if (clazz != null) { + Method[] methods = clazz.getDeclaredMethods(); + if (methods != null && methods.length > 0) { + for (Method m : methods) { + if (m.isAnnotationPresent(ServerlessFunction.class)) { + ServerlessFunction function = m.getAnnotation(ServerlessFunction.class); + boolean isStatic = Modifier.isStatic(m.getModifiers()); + String funName = ObjectUtils.isEmpty(function.value()) ? m.getName() : function.value(); + if (serverlessFunMap.containsKey(funName)) { + throw new MissingConfigException("function name " + funName + "already defined!"); + } + Parameter[] parameters = m.getParameters(); + List methodParameterInfoList = new ArrayList<>(); + if (parameters != null && parameters.length > 0) { + for (Parameter p : parameters) { + ServerlessMethodParam paramAnnoInfo = p.getAnnotation(ServerlessMethodParam.class); + ServerlessParameter parameter = new ServerlessParameter(); + parameter.setParamName(p.getName()); + parameter.setJavaType(p.getType()); + if (paramAnnoInfo != null && !ObjectUtils.isEmpty(paramAnnoInfo.value())) { + parameter.setParamName(paramAnnoInfo.value()); + } + methodParameterInfoList.add(parameter); + } + serverlessFunMap.put(funName, new DynamicFunction(getMethodHandle(m), methodParameterInfoList, isStatic,function.method())); + } else { + serverlessFunMap.put(funName, new DynamicFunction(getMethodHandle(m), null, isStatic,function.method())); + } + if (!isStatic && !ObjectUtils.isEmpty(function.initFunc())) { + String initFunc = function.initFunc(); + String initParam = function.initParam(); + try { + if (clazz != null) { + if (ObjectUtils.isEmpty(initFunc)) { + initFunc = "init"; + } + Method method = clazz.getMethod(initFunc, String.class); + if (!ObjectUtils.isEmpty(initParam)) { + initFuncMap.put(funName, Pair.of(initParam, getMethodHandle(method))); + } else { + initFuncMap.put(funName, Pair.of(null, getMethodHandle(method))); + } + } + } catch (Exception ex) { + throw new MissingConfigException(ex); + } + } + funcList.add(funName); + functionOriginClassMap.put(funName, clazz); + } + } + } + } + } + + } + + static void scanPackage(String scanPackage, ClassLoader loader, Map, Boolean>> serverlessFunMap, Map> functionOriginClassMap, Map userDefinedObjectMap, Map> initFuncMap, List funcList) { + ClassGraph graph = new ClassGraph().addClassLoader(loader).enableAllInfo(); + if (!ObjectUtils.isEmpty(scanPackage)) { + graph.whitelistPackages(scanPackage); + } + + try (ScanResult scanResult=graph.scan()){ + ClassInfoList list = scanResult.getClassesWithMethodAnnotation(ServerlessFunction.class.getName()); + for (ClassInfo info : list) { + MethodInfoList methodInfos = info.getMethodInfo(); + for (MethodInfo methodInfo : methodInfos) { + boolean isStatic = methodInfo.isStatic(); + if (methodInfo.hasAnnotation(ServerlessFunction.class.getName())) { + AnnotationInfo methodAnnoInfo = methodInfo.getAnnotationInfo(ServerlessFunction.class.getName()); + String funName = methodInfo.getName(); + String initFunc = null; + String initParam = null; + AnnotationParameterValueList parameterValues = methodAnnoInfo.getParameterValues(); + if (!parameterValues.isEmpty()) { + for (AnnotationParameterValue parameterValue : parameterValues) { + if (parameterValue.getName().equals("value") && !ObjectUtils.isEmpty(parameterValue.getValue())) { + funName = parameterValue.getValue().toString(); + } else if (parameterValue.getName().equalsIgnoreCase("initFunc") && !ObjectUtils.isEmpty(parameterValue.getValue())) { + initFunc = parameterValue.getValue().toString(); + } else if (parameterValue.getName().equalsIgnoreCase("initParam") && !ObjectUtils.isEmpty(parameterValue.getValue())) { + initParam = parameterValue.getValue().toString(); + } + } + } + if (serverlessFunMap.containsKey(funName)) { + throw new MissingConfigException("function name " + funName + "already defined!"); + } + MethodParameterInfo[] parameterInfos = methodInfo.getParameterInfo(); + if (parameterInfos != null && parameterInfos.length > 0) { + List methodParameterInfoList = new ArrayList<>(); + for (MethodParameterInfo parameterInfo : parameterInfos) { + AnnotationInfo paramAnnoInfo = parameterInfo.getAnnotationInfo(ServerlessMethodParam.class.getName()); + ServerlessParameter parameter = new ServerlessParameter(); + parameter.setParamName(parameterInfo.getName()); + parameter.setSignature(parameterInfo.getTypeSignatureOrTypeDescriptor()); + if (paramAnnoInfo != null) { + parameter.setParamName(paramAnnoInfo.getParameterValues().get(0).getValue().toString()); + } + methodParameterInfoList.add(parameter); + } + serverlessFunMap.put(funName, Triple.of(getMethodHandle(methodInfo), methodParameterInfoList, isStatic)); + } else { + serverlessFunMap.put(funName, Triple.of(getMethodHandle(methodInfo), null, isStatic)); + } + if (!ObjectUtils.isEmpty(initFunc) && !methodInfo.isStatic()) { + //Object obj = loadBeanOrUserDefined(funName,functionOriginClassMap,userDefinedObjectMap); + Class clazz = info.loadClass(); + try { + if (clazz != null) { + if (ObjectUtils.isEmpty(initFunc)) { + initFunc = "init"; + } + Method method = clazz.getMethod(initFunc, String.class); + if (!ObjectUtils.isEmpty(initParam)) { + initFuncMap.put(funName, Pair.of(initParam, getMethodHandle(method))); + } else { + initFuncMap.put(funName, Pair.of(null, getMethodHandle(method))); + } + } + } catch (Exception ex) { + throw new MissingConfigException(ex); + } + } + funcList.add(funName); + functionOriginClassMap.put(funName, info.loadClass()); + } + } + } + } catch (Exception ex) { + + } + } + + static Object loadBeanOrUserDefined(String funcName, Map> functionOriginClassMap, Map userDefinedObjectMap, Map> initFuncMap) throws Throwable { + Object obj = SpringContextHolder.getBean(functionOriginClassMap.get(funcName)); + if (obj == null) { + //user defined function or loaded function + if (userDefinedObjectMap.containsKey(funcName)) { + obj = userDefinedObjectMap.get(funcName); + } else { + ServerlessJarLoaderFactoryBean bean = SpringContextHolder.getBean(ServerlessJarLoaderFactoryBean.class); + if (bean != null) { + Class clazz = bean.loadClass(funcName); + Constructor constructor = clazz.getConstructor(); + obj = constructor.newInstance(); + if (initFuncMap.containsKey(funcName)) { + MethodHandle handle = initFuncMap.get(funcName).getRight(); + if (!ObjectUtils.isEmpty(initFuncMap.get(funcName).getKey())) { + handle.bindTo(obj).invoke(initFuncMap.get(funcName).getKey()); + } + } + userDefinedObjectMap.put(funcName, obj); + } else { + throw new MissingConfigException("Bean ServerlessJarLoaderFactoryBean not registered!"); + } + } + } + return obj; + } + + static Class loadClass(String funcName) { + ServerlessJarLoaderFactoryBean bean = SpringContextHolder.getBean(ServerlessJarLoaderFactoryBean.class); + if (bean != null) { + return bean.loadClass(funcName); + } else { + throw new MissingConfigException("Bean ServerlessJarLoaderFactoryBean not registered!"); + } + } + + public static void wrapRequestParameter(HttpServletRequest request, Map paramMap) { + Map reqMap = request.getParameterMap(); + if (!CollectionUtils.isEmpty(reqMap)) { + reqMap.entrySet().forEach(entry -> paramMap.put(entry.getKey(), entry.getValue()[0])); + } + } + + public static void readContent(HttpServletRequest request, StringBuilder builder) { + try (BufferedReader reader = request.getReader()) { + String lineStr; + while ((lineStr = reader.readLine()) != null) { + builder.append(lineStr); + } + } catch (IOException ex1) { + throw new MissingConfigException(ex1); + } + } + + + public static Object getValue(ServerlessParameter param, String value, Map prototypeHandlerMap) throws Throwable { + String signature=param.getSignature()==null?param.getJavaType().getTypeName():param.getSignature().toString(); + prototypeHandlerMap.computeIfAbsent(signature, FunctionScanner::getHandler); + if (prototypeHandlerMap.get(signature) != null) { + return prototypeHandlerMap.get(signature).invoke(value); + } else { + throw new MissingConfigException("valueOf method not found in paramter " + signature); + } + + } + + private static MethodHandle getMethodHandle(MethodInfo method) { + try { + return MethodHandles.publicLookup().unreflect(method.loadClassAndGetMethod()); + } catch (IllegalAccessException ex) { + log.error("{}", ex.getMessage()); + throw new MissingConfigException(ex.getMessage()); + } + } + + private static MethodHandle getMethodHandle(Method method) { + try { + return MethodHandles.publicLookup().unreflect(method); + } catch (IllegalAccessException ex) { + log.error("{}", ex.getMessage()); + throw new MissingConfigException(ex.getMessage()); + } + } + + private static MethodHandle getHandler(String clazzName) { + try { + Class clazz = Class.forName(clazzName); + Method method = clazz.getMethod("valueOf", String.class); + return MethodHandles.publicLookup().unreflect(method); + } catch (Exception ex) { + throw new MissingConfigException("method valueOf missing!"); + } + } + private static String getPackage(String name){ + String packageName=name; + int pos=name.indexOf("class"); + if(pos!=-1){ + int startPos=0; + if(packageName.startsWith("/")){ + startPos=1; + } + packageName=packageName.substring(startPos,pos-1); + } + pos=packageName.lastIndexOf("/"); + return packageName.substring(0,pos).replace("/","."); + } +} diff --git a/web/src/main/java/com/robin/core/web/serverless/ServerlessFactoryBean.java b/web/src/main/java/com/robin/core/web/serverless/ServerlessFactoryBean.java index 422d2b13..e383df52 100644 --- a/web/src/main/java/com/robin/core/web/serverless/ServerlessFactoryBean.java +++ b/web/src/main/java/com/robin/core/web/serverless/ServerlessFactoryBean.java @@ -32,116 +32,119 @@ @Slf4j public class ServerlessFactoryBean implements InitializingBean { - String defaultScanPackage="com.robin"; + String defaultScanPackage = "com.robin"; private ScanResult scanResult; - private Map,Boolean>> serverlessFunMap=new HashMap<>(); - private Map prototypeHandlerMap=new HashMap<>(); - private Map> functionOriginClassMap=new HashMap<>(); - private Map userDefinedObjectMap=new HashMap<>(); - private Map> initFuncMap=new HashMap<>(); - private Gson gson=new Gson(); + private final Map, Boolean>> serverlessFunMap = new HashMap<>(); + private final Map prototypeHandlerMap = new HashMap<>(); + private final Map> functionOriginClassMap = new HashMap<>(); + private final Map userDefinedObjectMap = new HashMap<>(); + private final Map> initFuncMap = new HashMap<>(); + private final Gson gson = new Gson(); @Override public void afterPropertiesSet() throws Exception { doInit(); } - public void doInit(){ - Environment environment= SpringContextHolder.getBean(Environment.class); - String scanPackage=environment!=null && environment.containsProperty("project.serverless.basePackage")? - environment.getProperty("project.serverless.basePackage"):defaultScanPackage; - ClassGraph graph= new ClassGraph().enableAllInfo(); - if(!ObjectUtils.isEmpty(scanPackage)){ + + public void doInit() { + Environment environment = SpringContextHolder.getBean(Environment.class); + String scanPackage = environment != null && environment.containsProperty("project.serverless.basePackage") ? + environment.getProperty("project.serverless.basePackage") : defaultScanPackage; + ClassGraph graph = new ClassGraph().enableAllInfo(); + if (!ObjectUtils.isEmpty(scanPackage)) { graph.whitelistPackages(scanPackage); } - scanResult=graph.scan(); + scanResult = graph.scan(); Runtime.getRuntime().addShutdownHook(new Thread(() -> scanResult.close())); - ClassInfoList list= scanResult.getClassesWithMethodAnnotation(ServerlessFunction.class.getName()); - for(ClassInfo info:list){ + ClassInfoList list = scanResult.getClassesWithMethodAnnotation(ServerlessFunction.class.getName()); + for (ClassInfo info : list) { MethodInfoList methodInfos = info.getMethodInfo(); - for(MethodInfo methodInfo:methodInfos){ - boolean isStatic=methodInfo.isStatic(); - if(methodInfo.hasAnnotation(ServerlessFunction.class.getName())){ - AnnotationInfo methodAnnoInfo= methodInfo.getAnnotationInfo(ServerlessFunction.class.getName()); - String funName= methodInfo.getName(); - String initFunc=null; - String initParam=null; - AnnotationParameterValueList parameterValues= methodAnnoInfo.getParameterValues(); - if(!parameterValues.isEmpty()){ - for(AnnotationParameterValue parameterValue:parameterValues){ - if(parameterValue.getName().equals("value") && !ObjectUtils.isEmpty(parameterValue.getValue())){ - funName=parameterValue.getValue().toString(); - }else if(parameterValue.getName().equalsIgnoreCase("initFunc") && !ObjectUtils.isEmpty(parameterValue.getValue())){ - initFunc=parameterValue.getValue().toString(); - }else if(parameterValue.getName().equalsIgnoreCase("initParam") && !ObjectUtils.isEmpty(parameterValue.getValue())){ - initParam=parameterValue.getValue().toString(); + for (MethodInfo methodInfo : methodInfos) { + boolean isStatic = methodInfo.isStatic(); + if (methodInfo.hasAnnotation(ServerlessFunction.class.getName())) { + AnnotationInfo methodAnnoInfo = methodInfo.getAnnotationInfo(ServerlessFunction.class.getName()); + String funName = methodInfo.getName(); + String initFunc = null; + String initParam = null; + AnnotationParameterValueList parameterValues = methodAnnoInfo.getParameterValues(); + if (!parameterValues.isEmpty()) { + for (AnnotationParameterValue parameterValue : parameterValues) { + if (parameterValue.getName().equals("value") && !ObjectUtils.isEmpty(parameterValue.getValue())) { + funName = parameterValue.getValue().toString(); + } else if (parameterValue.getName().equalsIgnoreCase("initFunc") && !ObjectUtils.isEmpty(parameterValue.getValue())) { + initFunc = parameterValue.getValue().toString(); + } else if (parameterValue.getName().equalsIgnoreCase("initParam") && !ObjectUtils.isEmpty(parameterValue.getValue())) { + initParam = parameterValue.getValue().toString(); } } } - MethodParameterInfo[] parameterInfos= methodInfo.getParameterInfo(); - if(parameterInfos!=null && parameterInfos.length>0){ - List methodParameterInfoList=new ArrayList<>(); - for(MethodParameterInfo parameterInfo:parameterInfos) { - AnnotationInfo paramAnnoInfo= parameterInfo.getAnnotationInfo(ServerlessMethodParam.class.getName()); + MethodParameterInfo[] parameterInfos = methodInfo.getParameterInfo(); + if (parameterInfos != null && parameterInfos.length > 0) { + List methodParameterInfoList = new ArrayList<>(); + for (MethodParameterInfo parameterInfo : parameterInfos) { + AnnotationInfo paramAnnoInfo = parameterInfo.getAnnotationInfo(ServerlessMethodParam.class.getName()); ServerlessParameter parameter = new ServerlessParameter(); parameter.setParamName(parameterInfo.getName()); parameter.setSignature(parameterInfo.getTypeSignatureOrTypeDescriptor()); - if(paramAnnoInfo!=null){ + if (paramAnnoInfo != null) { parameter.setParamName(paramAnnoInfo.getParameterValues().get(0).getValue().toString()); } methodParameterInfoList.add(parameter); } - serverlessFunMap.put(funName, Triple.of(getMethodHandle(methodInfo),methodParameterInfoList,isStatic)); - }else{ - serverlessFunMap.put(funName,Triple.of(getMethodHandle(methodInfo),null,isStatic)); + serverlessFunMap.put(funName, Triple.of(getMethodHandle(methodInfo), methodParameterInfoList, isStatic)); + } else { + serverlessFunMap.put(funName, Triple.of(getMethodHandle(methodInfo), null, isStatic)); } - if(!ObjectUtils.isEmpty(initFunc) && !methodInfo.isStatic()){ - Object obj=loadBeanOrUserDefined(funName); + if (!ObjectUtils.isEmpty(initFunc) && !methodInfo.isStatic()) { + Object obj = loadBeanOrUserDefined(funName); try { if (obj != null) { - Method method = null; + Method method = obj.getClass().getMethod(initFunc, Map.class); if (!ObjectUtils.isEmpty(initParam)) { - method = obj.getClass().getMethod(initFunc, Map.class); - if (method != null) { - initFuncMap.put(funName,Pair.of(initParam,getMethodHandle(method))); - } + initFuncMap.put(funName, Pair.of(initParam, getMethodHandle(method))); + }else{ + initFuncMap.put(funName, Pair.of(null, getMethodHandle(method))); } } - }catch (Exception ex){ + } catch (Exception ex) { throw new MissingConfigException(ex); } } - functionOriginClassMap.put(funName,info.loadClass()); + functionOriginClassMap.put(funName, info.loadClass()); } } } } - private MethodHandle getMethodHandle(MethodInfo method){ - try{ + + private MethodHandle getMethodHandle(MethodInfo method) { + try { return MethodHandles.publicLookup().unreflect(method.loadClassAndGetMethod()); - }catch (IllegalAccessException ex) { + } catch (IllegalAccessException ex) { log.error("{}", ex.getMessage()); throw new MissingConfigException(ex.getMessage()); } } - private MethodHandle getMethodHandle(Method method){ - try{ + + private MethodHandle getMethodHandle(Method method) { + try { return MethodHandles.publicLookup().unreflect(method); - }catch (IllegalAccessException ex) { + } catch (IllegalAccessException ex) { log.error("{}", ex.getMessage()); throw new MissingConfigException(ex.getMessage()); } } - public void registerServerlessFunction(String functionName, IUserDefineServerlessFunction serverlessFunction) throws NoSuchMethodException,IllegalAccessException{ - if(serverlessFunMap.containsKey(functionName)){ - throw new MissingConfigException("function "+functionName+" already defined!"); - }else{ - IUserDefineServerlessFunction userFuncObj= (IUserDefineServerlessFunction) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{IUserDefineServerlessFunction.class}, - (proxy, method, args) -> serverlessFunction.doFunction((Map)args[0])); - userDefinedObjectMap.put(functionName,userFuncObj); - MethodHandle handler=MethodHandles.publicLookup().unreflect(userFuncObj.getClass().getMethod("doFunction", Map.class)); - if(handler!=null){ - ServerlessParameter parameter=new ServerlessParameter(); + + public void registerServerlessFunction(String functionName, IUserDefineServerlessFunction serverlessFunction) throws NoSuchMethodException, IllegalAccessException { + if (serverlessFunMap.containsKey(functionName)) { + throw new MissingConfigException("function " + functionName + " already defined!"); + } else { + IUserDefineServerlessFunction userFuncObj = (IUserDefineServerlessFunction) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{IUserDefineServerlessFunction.class}, + (proxy, method, args) -> serverlessFunction.doFunction((Map) args[0])); + userDefinedObjectMap.put(functionName, userFuncObj); + MethodHandle handler = MethodHandles.publicLookup().unreflect(userFuncObj.getClass().getMethod("doFunction", Map.class)); + if (handler != null) { + ServerlessParameter parameter = new ServerlessParameter(); parameter.setParamName("map"); parameter.setSignature(new TypeSignature() { @Override @@ -159,35 +162,30 @@ protected String getClassName() { return "java.util.Map"; } }); - List parameters=new ArrayList<>(); + List parameters = new ArrayList<>(); parameters.add(parameter); - serverlessFunMap.put(functionName,Triple.of(handler,parameters,false)); + serverlessFunMap.put(functionName, Triple.of(handler, parameters, false)); } } } - public boolean hasFunction(String functionName){ - return serverlessFunMap.containsKey(functionName); + + public boolean hasFunction(String functionName) { + return serverlessFunMap.containsKey(functionName); } - public Object invokeFunc(HttpServletRequest request, HttpServletResponse response,String funcName){ - Object retObj=null; - if(serverlessFunMap.containsKey(funcName)){ - Triple,Boolean> function=serverlessFunMap.get(funcName); - Map paramMap=new HashMap<>(); - wrapRequestParameter(request,paramMap); + + public Object invokeFunc(HttpServletRequest request, HttpServletResponse response, String funcName) { + Object retObj ; + if (serverlessFunMap.containsKey(funcName)) { + Triple, Boolean> function = serverlessFunMap.get(funcName); + Map paramMap = new HashMap<>(); + wrapRequestParameter(request, paramMap); try { if (!CollectionUtils.isEmpty(function.getMiddle())) { List objects = new ArrayList<>(); String content = null; if (request.getMethod().equalsIgnoreCase("post") || request.getMethod().equalsIgnoreCase("put")) { StringBuilder builder = new StringBuilder(); - try (BufferedReader reader = request.getReader()) { - String lineStr = null; - while ((lineStr = reader.readLine()) != null) { - builder.append(lineStr); - } - } catch (IOException ex1) { - - } + readContent(request, builder); content = builder.toString(); Assert.isTrue(content.startsWith("{") && content.endsWith("}"), "content not a validate json"); } @@ -211,68 +209,76 @@ public Object invokeFunc(HttpServletRequest request, HttpServletResponse respons } } - if(function.getRight()) { + if (function.getRight()) { retObj = function.getLeft().invokeWithArguments(objects); - }else{ + } else { Object obj = loadBeanOrUserDefined(funcName); - retObj=function.getLeft().bindTo(obj).invokeWithArguments(objects); + retObj = function.getLeft().bindTo(obj).invokeWithArguments(objects); } } else { - if(function.getRight()) { + if (function.getRight()) { retObj = function.getLeft().invoke(null); - }else{ + } else { Object obj = loadBeanOrUserDefined(funcName); - retObj=function.getLeft().bindTo(obj).invokeExact(null); + retObj = function.getLeft().bindTo(obj).invokeExact(null); } } return retObj; - }catch (Throwable ex){ + } catch (Throwable ex) { return AbstractController.wrapFailedMsg(ex.getMessage()); } - }else{ - return AbstractController.wrapFailedMsg("function name "+funcName+" does not register!"); + } else { + return AbstractController.wrapFailedMsg("function name " + funcName + " does not register!"); + } + } + + private static void readContent(HttpServletRequest request, StringBuilder builder) { + try (BufferedReader reader = request.getReader()) { + String lineStr ; + while ((lineStr = reader.readLine()) != null) { + builder.append(lineStr); + } + } catch (IOException ex1) { + throw new MissingConfigException(ex1); } } private Object loadBeanOrUserDefined(String funcName) { Object obj = SpringContextHolder.getBean(functionOriginClassMap.get(funcName)); - if(obj==null){ - if(userDefinedObjectMap.containsKey(funcName)){ - obj=userDefinedObjectMap.get(funcName); - }else { + if (obj == null) { + if (userDefinedObjectMap.containsKey(funcName)) { + obj = userDefinedObjectMap.get(funcName); + } else { throw new MissingConfigException("with exception of static function and user defined,object must be managed bean"); } - } return obj; + } + return obj; } - public void wrapRequestParameter(HttpServletRequest request,Map paramMap){ - Map reqMap= request.getParameterMap(); - if(!CollectionUtils.isEmpty(reqMap)){ - reqMap.entrySet().forEach(entry->{ - paramMap.put(entry.getKey(),entry.getValue()[0]); - }); + public void wrapRequestParameter(HttpServletRequest request, Map paramMap) { + Map reqMap = request.getParameterMap(); + if (!CollectionUtils.isEmpty(reqMap)) { + reqMap.entrySet().forEach(entry -> paramMap.put(entry.getKey(), entry.getValue()[0])); } } - public Object getValue(TypeSignature signature,String value) throws Throwable{ - prototypeHandlerMap.computeIfAbsent(signature.toString(),k->getHandler(k)); - if(prototypeHandlerMap.get(signature.toString())!=null){ + + public Object getValue(TypeSignature signature, String value) throws Throwable { + prototypeHandlerMap.computeIfAbsent(signature.toString(), this::getHandler); + if (prototypeHandlerMap.get(signature.toString()) != null) { return prototypeHandlerMap.get(signature.toString()).invoke(value); - }else{ - throw new MissingConfigException("valueOf method not found in paramter "+signature); + } else { + throw new MissingConfigException("valueOf method not found in paramter " + signature); } } - private MethodHandle getHandler(String clazzName){ + + private MethodHandle getHandler(String clazzName) { try { Class clazz = Class.forName(clazzName); - Method method = clazz.getMethod("valueOf",String.class); - if(method!=null){ - return MethodHandles.publicLookup().unreflect(method); - }else{ - throw new MissingConfigException("valueOf method not found in paramter "+clazzName); - } - }catch (Exception ex){ - throw new RuntimeException(ex); + Method method = clazz.getMethod("valueOf", String.class); + return MethodHandles.publicLookup().unreflect(method); + } catch (Exception ex) { + throw new MissingConfigException("method valueOf missing!"); } } } diff --git a/web/src/main/java/com/robin/core/web/serverless/ServerlessJarLoaderFactoryBean.java b/web/src/main/java/com/robin/core/web/serverless/ServerlessJarLoaderFactoryBean.java new file mode 100644 index 00000000..1bd4819e --- /dev/null +++ b/web/src/main/java/com/robin/core/web/serverless/ServerlessJarLoaderFactoryBean.java @@ -0,0 +1,227 @@ +package com.robin.core.web.serverless; + +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import com.robin.comm.util.json.GsonUtil; +import com.robin.core.base.exception.MissingConfigException; +import com.robin.core.base.spring.SpringContextHolder; +import com.robin.core.base.util.Const; +import com.robin.core.fileaccess.fs.AbstractFileSystemAccessor; +import com.robin.core.fileaccess.meta.DataCollectionMeta; +import com.robin.core.web.controller.AbstractController; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.env.Environment; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Proxy; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +public class ServerlessJarLoaderFactoryBean implements InitializingBean { + //default classloader carry infrastructure + private ClassLoader defaultLoader = null; + private final DataCollectionMeta defaultMetaDefined = new DataCollectionMeta(); + private final Map classLoaderMap = new HashMap<>(); + private String defaultScanPackage = "com.robin"; + private final Map serverlessFunMap = new HashMap<>(); + private final Map prototypeHandlerMap = new HashMap<>(); + private final Map> functionOriginClassMap = new HashMap<>(); + private final Map userDefinedObjectMap = new HashMap<>(); + private final Map> initFuncMap = new HashMap<>(); + private final Map> jarFunctionListMap = new HashMap<>(); + private final Gson gson = GsonUtil.getGson(); + private String basePath = "/data/runningLibs/jars/"; + private final DataCollectionMeta collectionMeta; + private final AbstractFileSystemAccessor accessor; + + public ServerlessJarLoaderFactoryBean(DataCollectionMeta collectionMeta, AbstractFileSystemAccessor accessor) { + this.collectionMeta = collectionMeta; + this.accessor = accessor; + } + + @Override + public void afterPropertiesSet() throws Exception { + Environment environment = SpringContextHolder.getBean(Environment.class); + //default jars must be local + defaultMetaDefined.setFsType(Const.FILESYSTEM.LOCAL.getValue()); + if (environment != null && !ObjectUtils.isEmpty(environment.getProperty("project.serverless.defaultJars"))) { + //default load local file jar,no need to dynamic update + String[] loadJar = environment.getProperty("project.serverless.defaultJars").split(","); + URL[] urls = new URL[loadJar.length]; + for (int i = 0; i < loadJar.length; i++) { + urls[i] = new File(loadJar[i]).toURI().toURL(); + } + defaultLoader = new URLClassLoader(urls, getClass().getClassLoader()); + } else { + defaultLoader = getClass().getClassLoader(); + } + if (environment != null && environment.containsProperty("project.serverless.basePackage")) { + defaultScanPackage = environment.getProperty("project.serverless.basePackage"); + } + if (environment != null && environment.containsProperty("project.serverless.jarDefaultPath")) { + basePath = environment.getProperty("project.serverless.jarDefaultPath"); + } + } + + //dynamic add a new URLClassLoader to access + public void addJar(String jarFile, String scanPackage) throws IOException { + DynamicJarClassLoader classLoader = new DynamicJarClassLoader(new URL[]{}, defaultLoader, collectionMeta, basePath + jarFile, accessor); + List funcList = new ArrayList<>(); + FunctionScanner.scanPackageOrigin(ObjectUtils.isEmpty(scanPackage) ? defaultScanPackage : scanPackage, classLoader, serverlessFunMap, functionOriginClassMap, userDefinedObjectMap, initFuncMap, funcList); + //FunctionScanner.scanPackage(ObjectUtils.isEmpty(scanPackage)?defaultScanPackage:scanPackage,classLoader,serverlessFunMap,functionOriginClassMap,userDefinedObjectMap,initFuncMap,funcList); + String jarFileName = getJarName(jarFile); + jarFunctionListMap.put(jarFileName, funcList); + classLoaderMap.put(jarFileName, classLoader); + } + + //unload dynamic jar + public void removeJar(String jarFile) throws IOException { + String jarFileName = getJarName(jarFile); + if (!ObjectUtils.isEmpty(jarFileName)) { + if (classLoaderMap.containsKey(jarFileName)) { + DynamicJarClassLoader loader = classLoaderMap.remove(jarFileName); + if (jarFunctionListMap.containsKey(jarFileName)) { + jarFunctionListMap.get(jarFileName).forEach(f -> { + serverlessFunMap.remove(f); + functionOriginClassMap.remove(f); + if (userDefinedObjectMap.containsKey(f)) { + //remove no static function call object + Object obj = userDefinedObjectMap.remove(f); + obj = null; + } + initFuncMap.remove(f); + }); + jarFunctionListMap.remove(jarFileName); + } + loader.close(); + } + } + } + + public void updateJar(String jarFile, String scanPackage) throws IOException { + removeJar(jarFile); + addJar(jarFile, scanPackage); + } + + public void registerServerlessFunction(String functionName, String callMethod, IUserDefineServerlessFunction serverlessFunction) throws NoSuchMethodException, IllegalAccessException { + if (serverlessFunMap.containsKey(functionName)) { + throw new MissingConfigException("function " + functionName + " already defined!"); + } else { + IUserDefineServerlessFunction userFuncObj = (IUserDefineServerlessFunction) Proxy.newProxyInstance(defaultLoader, new Class[]{IUserDefineServerlessFunction.class}, + (proxy, method, args) -> serverlessFunction.doFunction((Map) args[0])); + userDefinedObjectMap.put(functionName, userFuncObj); + MethodHandle handler = MethodHandles.publicLookup().unreflect(userFuncObj.getClass().getMethod("doFunction", Map.class)); + if (handler != null) { + ServerlessParameter parameter = new ServerlessParameter(); + parameter.setParamName("map"); + parameter.setJavaType(Map.class); + List parameters = new ArrayList<>(); + parameters.add(parameter); + serverlessFunMap.put(functionName, new DynamicFunction(handler, parameters, false, callMethod)); + } + } + } + + public Object invokeFunc(HttpServletRequest request, HttpServletResponse response, String funcName) { + Object retObj; + if (serverlessFunMap.containsKey(funcName)) { + DynamicFunction function = serverlessFunMap.get(funcName); + if (!function.checkCallMethod(request.getMethod())) { + return AbstractController.wrapFailedMsg("http method " + request.getMethod() + " not allowed!"); + } + Map paramMap = new HashMap<>(); + FunctionScanner.wrapRequestParameter(request, paramMap); + try { + if (!CollectionUtils.isEmpty(function.getParameters())) { + List objects = new ArrayList<>(); + String content = null; + if (request.getMethod().equalsIgnoreCase("post") || request.getMethod().equalsIgnoreCase("put")) { + StringBuilder builder = new StringBuilder(); + FunctionScanner.readContent(request, builder); + content = builder.toString(); + Assert.isTrue(content.startsWith("{") && content.endsWith("}"), "content not a validate json"); + } + + for (ServerlessParameter parameter : function.getParameters()) { + if ((!ObjectUtils.isEmpty(parameter.getSignature()) && parameter.getSignature().toString().contains("HttpServletRequest")) + || (!ObjectUtils.isEmpty(parameter.getJavaType()) && parameter.getJavaType().getTypeName().contains("HttpServletRequest"))) { + objects.add(request); + } else if ((!ObjectUtils.isEmpty(parameter.getSignature()) && parameter.getSignature().toString().contains("HttpServletResponse")) + || (!ObjectUtils.isEmpty(parameter.getJavaType()) && parameter.getJavaType().getTypeName().contains("HttpServletResponse"))) { + objects.add(response); + } + if ((!ObjectUtils.isEmpty(parameter.getSignature()) && parameter.getSignature().toString().startsWith("java.util.Map")) + || (!ObjectUtils.isEmpty(parameter.getJavaType()) && parameter.getJavaType().getTypeName().contains("java.util.Map"))) { + if (!ObjectUtils.isEmpty(content)) { + Map reqMap = gson.fromJson(content, new TypeToken>() { + }.getType()); + objects.add(reqMap); + } else { + throw new MissingConfigException("content is null,please use post or put to access HashMap"); + } + } else if (paramMap.containsKey(parameter.getParamName())) { + objects.add(FunctionScanner.getValue(parameter, paramMap.get(parameter.getParamName()), prototypeHandlerMap)); + } + + } + if (function.isFunStatic()) { + retObj = function.getInvokeMethod().invokeWithArguments(objects); + } else { + Object obj = FunctionScanner.loadBeanOrUserDefined(funcName, functionOriginClassMap, userDefinedObjectMap, initFuncMap); + retObj = function.getInvokeMethod().bindTo(obj).invokeWithArguments(objects); + } + } else { + if (function.isFunStatic()) { + retObj = function.getInvokeMethod().invoke(null); + } else { + Object obj = FunctionScanner.loadBeanOrUserDefined(funcName, functionOriginClassMap, userDefinedObjectMap, initFuncMap); + retObj = function.getInvokeMethod().bindTo(obj).invoke(null); + } + } + return retObj; + } catch (Throwable ex) { + return AbstractController.wrapFailedMsg(ex.getMessage()); + } + } else { + return AbstractController.wrapFailedMsg("function name " + funcName + " does not register!"); + } + } + + public Class loadClass(String funcName) { + if (functionOriginClassMap.containsKey(funcName) && serverlessFunMap.containsKey(funcName)) { + return functionOriginClassMap.get(funcName); + } + return null; + } + + private String getJarName(String jarPath) { + + int namePos = jarPath.indexOf("."); + if (namePos != -1) { + return jarPath.substring(0, namePos); + } + return null; + + } + + public boolean hasFunction(String functionName) { + return serverlessFunMap.containsKey(functionName); + } + + +} diff --git a/web/src/main/java/com/robin/core/web/serverless/ServerlessParameter.java b/web/src/main/java/com/robin/core/web/serverless/ServerlessParameter.java index b1a02aa0..409cd2f2 100644 --- a/web/src/main/java/com/robin/core/web/serverless/ServerlessParameter.java +++ b/web/src/main/java/com/robin/core/web/serverless/ServerlessParameter.java @@ -5,11 +5,14 @@ import lombok.Getter; import lombok.Setter; +import java.lang.reflect.Type; + @Getter @Setter public class ServerlessParameter { private String paramName; private TypeSignature signature; + private Type javaType; } From 9fffff0f46a168f1967ab529c88908671483cdaa Mon Sep 17 00:00:00 2001 From: robinhoodjim Date: Fri, 31 Oct 2025 18:44:05 +0800 Subject: [PATCH 7/7] serverless function --- .../robin/basis/controller/system/SysResourceContorller.java | 4 ++-- .../basis/controller/system/SysResponsiblityController.java | 2 +- .../com/robin/basis/controller/system/SysRoleContorller.java | 2 +- .../basis/controller/system/SysResponsiblityController.java | 2 +- .../com/robin/basis/controller/system/SysRoleContorller.java | 2 +- .../com/robin/basis/controller/system/SysOrgController.java | 2 +- .../com/robin/basis/controller/system/SysRoleContorller.java | 2 +- .../core/web/serverless/ServerlessJarLoaderFactoryBean.java | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResourceContorller.java b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResourceContorller.java index 8401c8a5..f120469f 100644 --- a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResourceContorller.java +++ b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResourceContorller.java @@ -87,7 +87,7 @@ public Map saveMenu(HttpServletRequest request, Session session=(Session) request.getSession().getAttribute(Const.SESSION); Map map=wrapRequest(request); SysResource resource=new SysResource(); - ConvertUtil.convertToModel(resource, map); + ConvertUtil.convertToModel(map, resource); resource.setTenantId(session.getTenantId()); resource.setType("1"); Long id=service.saveEntity(resource); @@ -126,7 +126,7 @@ public Map updateSysResource(HttpServletRequest request, Long id=Long.valueOf(request.getParameter("id")); SysResource user=service.getEntity(id); SysResource tmpuser=new SysResource(); - ConvertUtil.convertToModel(tmpuser, map); + ConvertUtil.convertToModel(map, tmpuser); ConvertUtil.convertToModelForUpdate(tmpuser, user); service.updateEntity(user); retmap.put("id", String.valueOf(id)); diff --git a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java index 4788e4ac..2f94a2b4 100644 --- a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java +++ b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java @@ -83,7 +83,7 @@ public String saveRole(HttpServletRequest request, try{ Map map=wrapRequest(request); SysResponsibility user=new SysResponsibility(); - ConvertUtil.convertToModel(user, map); + ConvertUtil.convertToModel(map, user); Long id=service.saveEntity(user); retmap.put("id", String.valueOf(id)); retmap.put("success", "true"); diff --git a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java index 73ff8199..02848060 100644 --- a/example/boot-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java +++ b/example/boot-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java @@ -60,7 +60,7 @@ public String saveRole(HttpServletRequest request, try{ Map map=wrapRequest(request); SysRole user=new SysRole(); - ConvertUtil.convertToModel(user, map); + ConvertUtil.convertToModel(map, user); Long id=service.saveEntity(user); retmap.put("id", String.valueOf(id)); retmap.put("success", "true"); diff --git a/example/config-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java b/example/config-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java index 1f162560..66bf4017 100644 --- a/example/config-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java +++ b/example/config-example/src/main/java/com/robin/basis/controller/system/SysResponsiblityController.java @@ -83,7 +83,7 @@ public String saveRole(HttpServletRequest request, try{ Map map=wrapRequest(request); SysResponsibility user=new SysResponsibility(); - ConvertUtil.convertToModel(user, map); + ConvertUtil.convertToModel(map, user); Long id=service.saveEntity(user); retmap.put("id", String.valueOf(id)); retmap.put("success", "true"); diff --git a/example/config-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java b/example/config-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java index cd0354f6..08bc20e8 100644 --- a/example/config-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java +++ b/example/config-example/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java @@ -52,7 +52,7 @@ public String saveRole(HttpServletRequest request, try{ Map map=wrapRequest(request); SysRole user=new SysRole(); - ConvertUtil.convertToModel(user, map); + ConvertUtil.convertToModel(map, user); Long id=service.saveEntity(user); retmap.put("id", String.valueOf(id)); retmap.put("success", "true"); diff --git a/vueback/src/main/java/com/robin/basis/controller/system/SysOrgController.java b/vueback/src/main/java/com/robin/basis/controller/system/SysOrgController.java index 8baac759..0698c725 100644 --- a/vueback/src/main/java/com/robin/basis/controller/system/SysOrgController.java +++ b/vueback/src/main/java/com/robin/basis/controller/system/SysOrgController.java @@ -87,7 +87,7 @@ public Map saveOrg(HttpServletRequest request, HttpServletRespon return retMap; } - @GetMapping("/list") + @GetMapping @ResponseBody public Map getdeptJson(Map reqMap) { FilterConditionBuilder builder=new FilterConditionBuilder(); diff --git a/vueback/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java b/vueback/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java index 624d435d..1633eb7d 100644 --- a/vueback/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java +++ b/vueback/src/main/java/com/robin/basis/controller/system/SysRoleContorller.java @@ -42,7 +42,7 @@ public Map saveRole(HttpServletRequest request, try{ Map map=wrapRequest(request); SysRole user=new SysRole(); - ConvertUtil.convertToModel(user, map); + ConvertUtil.convertToModel(map, user); service.save(user); wrapSuccessMap(retmap,"OK"); }catch(Exception ex){ diff --git a/web/src/main/java/com/robin/core/web/serverless/ServerlessJarLoaderFactoryBean.java b/web/src/main/java/com/robin/core/web/serverless/ServerlessJarLoaderFactoryBean.java index 1bd4819e..e221fcd9 100644 --- a/web/src/main/java/com/robin/core/web/serverless/ServerlessJarLoaderFactoryBean.java +++ b/web/src/main/java/com/robin/core/web/serverless/ServerlessJarLoaderFactoryBean.java @@ -49,7 +49,7 @@ public class ServerlessJarLoaderFactoryBean implements InitializingBean { private final DataCollectionMeta collectionMeta; private final AbstractFileSystemAccessor accessor; - public ServerlessJarLoaderFactoryBean(DataCollectionMeta collectionMeta, AbstractFileSystemAccessor accessor) { + public ServerlessJarLoaderFactoryBean(DataCollectionMeta collectionMeta, AbstractFileSystemAccessor accessor) { this.collectionMeta = collectionMeta; this.accessor = accessor; }