diff --git a/README.adoc b/README.adoc index ee4c277bec..6dddd00793 100644 --- a/README.adoc +++ b/README.adoc @@ -90,7 +90,6 @@ image::doc/image/老寇IoT云平台架构图-阿里巴巴.png[架构图,align=ce |Spring Authorization Server |1.3.1 |Mybatis Plus |3.5.7 |Nacos |2.4.0.1 -|Seata |2.0.0 |Sentinel |1.8.8 |Redis |7.2.5 |Elasticsearch |8.14.3 @@ -113,7 +112,7 @@ image::doc/image/老寇IoT云平台架构图-阿里巴巴.png[架构图,align=ce - 负载均衡:Spring Cloud Loadbalancer - 服务熔断&降级&限流:Sentinel - 分库分表:Mybatis Plus -- 分布式事务:Seata & RocketMQ +- 分布式事务:RocketMQ - 消息队列:RocketMQ & Kafka & MQTT - 服务监控:Spring Boot Admin & Prometheus - 高亮搜索:Elasticsearch @@ -167,7 +166,6 @@ image::doc/image/老寇IoT云平台架构图-阿里巴巴.png[架构图,align=ce └── laokou-common-openfeign --- 远程调用组件 └── laokou-common-data-cache --- 数据缓存组件 └── laokou-common-mybatis-plus --- 对象映射组件 - └── laokou-common-seata --- 分布式事务组件 └── laokou-common-tdengine --- 时序数据库组件 └── laokou-common-sentinel --- 服务限流&熔断降级组件 ├── laokou-cloud @@ -175,7 +173,6 @@ image::doc/image/老寇IoT云平台架构图-阿里巴巴.png[架构图,align=ce └── laokou-monitor --- 服务监控 └── laokou-register --- 服务治理 └── laokou-sentinel --- 流量治理 - └── laokou-seata --- 分布式事务 └── laokou-snail-job --- 分布式任务调度 ├── laokou-service └── laokou-iot --- 物联网模块 diff --git a/doc/db/kcloud_platform.sql b/doc/db/kcloud_platform.sql index 755377e89e..53a6496b1f 100644 --- a/doc/db/kcloud_platform.sql +++ b/doc/db/kcloud_platform.sql @@ -2350,160 +2350,6 @@ VALUES ('95TxSsTPFA3tF12TBSMmUVK0da', '95TxSsTPFA3tF12TBSMmUVK0da', '2024-04-30 '{"@class":"java.util.Collections$UnmodifiableMap","settings.client.require-proof-key":false,"settings.client.require-authorization-consent":true}', '{"@class":"java.util.Collections$UnmodifiableMap","settings.token.reuse-refresh-tokens":true,"settings.token.id-token-signature-algorithm":["org.springframework.security.oauth2.jose.jws.SignatureAlgorithm","RS256"],"settings.token.access-token-time-to-live":["java.time.Duration",3600.000000000],"settings.token.access-token-format":{"@class":"org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat","value":"self-contained"},"settings.token.refresh-token-time-to-live":["java.time.Duration",21600.000000000],"settings.token.authorization-code-time-to-live":["java.time.Duration",3600.000000000],"settings.token.device-code-time-to-live":["java.time.Duration",3600.000000000]}'); -create table if not exists public.seata_state_inst -( - id varchar(48) not null, - machine_inst_id varchar(128) not null, - name varchar(128) not null, - type varchar(20), - service_name varchar(128), - service_method varchar(128), - service_type varchar(16), - business_key varchar(48), - state_id_compensated_for varchar(50), - state_id_retried_for varchar(50), - gmt_started timestamp(3) not null, - is_for_update smallint, - input_params text, - output_params text, - status varchar(2) not null, - excep bytea, - gmt_updated timestamp(3), - gmt_end timestamp(3), - primary key (id, machine_inst_id) -); - -comment on column public.seata_state_inst.id is 'id'; - -comment on column public.seata_state_inst.machine_inst_id is 'state machine instance id'; - -comment on column public.seata_state_inst.name is 'state name'; - -comment on column public.seata_state_inst.type is 'state type'; - -comment on column public.seata_state_inst.service_name is 'service name'; - -comment on column public.seata_state_inst.service_method is 'method name'; - -comment on column public.seata_state_inst.service_type is 'service type'; - -comment on column public.seata_state_inst.business_key is 'business key'; - -comment on column public.seata_state_inst.state_id_compensated_for is 'state compensated for'; - -comment on column public.seata_state_inst.state_id_retried_for is 'state retried for'; - -comment on column public.seata_state_inst.gmt_started is 'start time'; - -comment on column public.seata_state_inst.is_for_update is 'is service for update'; - -comment on column public.seata_state_inst.input_params is 'input parameters'; - -comment on column public.seata_state_inst.output_params is 'output parameters'; - -comment on column public.seata_state_inst.status is 'status(SU succeed|FA failed|UN unknown|SK skipped|RU running)'; - -comment on column public.seata_state_inst.excep is 'exception'; - -comment on column public.seata_state_inst.gmt_updated is 'update time'; - -comment on column public.seata_state_inst.gmt_end is 'end time'; - -alter table public.seata_state_inst - owner to root; - -create table if not exists public.seata_state_machine_def -( - id varchar(32) not null - primary key, - name varchar(128) not null, - tenant_id varchar(32) not null, - app_name varchar(32) not null, - type varchar(20), - comment_ varchar(255), - ver varchar(16) not null, - gmt_create timestamp(3) not null, - status varchar(2) not null, - content text, - recover_strategy varchar(16) -); - -comment on column public.seata_state_machine_def.id is 'id'; - -comment on column public.seata_state_machine_def.name is 'name'; - -comment on column public.seata_state_machine_def.tenant_id is 'tenant id'; - -comment on column public.seata_state_machine_def.app_name is 'application name'; - -comment on column public.seata_state_machine_def.type is 'state language type'; - -comment on column public.seata_state_machine_def.comment_ is 'comment'; - -comment on column public.seata_state_machine_def.ver is 'version'; - -comment on column public.seata_state_machine_def.gmt_create is 'create time'; - -comment on column public.seata_state_machine_def.status is 'status(AC:active|IN:inactive)'; - -comment on column public.seata_state_machine_def.content is 'content'; - -comment on column public.seata_state_machine_def.recover_strategy is 'transaction recover strategy(compensate|retry)'; - -alter table public.seata_state_machine_def - owner to root; - -create table if not exists public.seata_state_machine_inst -( - id varchar(128) not null - primary key, - machine_id varchar(32) not null, - tenant_id varchar(32) not null, - parent_id varchar(128), - gmt_started timestamp(3) not null, - business_key varchar(48), - start_params text, - gmt_end timestamp(3), - excep bytea, - end_params text, - status varchar(2), - compensation_status varchar(2), - is_running smallint, - gmt_updated timestamp(3) not null -); - -comment on column public.seata_state_machine_inst.id is 'id'; - -comment on column public.seata_state_machine_inst.machine_id is 'state machine definition id'; - -comment on column public.seata_state_machine_inst.tenant_id is 'tenant id'; - -comment on column public.seata_state_machine_inst.parent_id is 'parent id'; - -comment on column public.seata_state_machine_inst.gmt_started is 'start time'; - -comment on column public.seata_state_machine_inst.business_key is 'business key'; - -comment on column public.seata_state_machine_inst.start_params is 'start parameters'; - -comment on column public.seata_state_machine_inst.gmt_end is 'end time'; - -comment on column public.seata_state_machine_inst.excep is 'exception'; - -comment on column public.seata_state_machine_inst.end_params is 'end parameters'; - -comment on column public.seata_state_machine_inst.status is 'status(SU succeed|FA failed|UN unknown|SK skipped|RU running)'; - -comment on column public.seata_state_machine_inst.compensation_status is 'compensation status(SU succeed|FA failed|UN unknown|SK skipped|RU running)'; - -comment on column public.seata_state_machine_inst.is_running is 'is running(0 no|1 yes)'; - -alter table public.seata_state_machine_inst - owner to root; - -create unique index if not exists seata_state_machine_inst_business_key_tenant_id_idx - on public.seata_state_machine_inst (business_key, tenant_id); - create table boot_sys_api_log ( id bigint generated by default as identity diff --git a/doc/db/kcloud_platform_nacos.sql b/doc/db/kcloud_platform_nacos.sql index 52e1829a3b..3fb32f91cc 100644 --- a/doc/db/kcloud_platform_nacos.sql +++ b/doc/db/kcloud_platform_nacos.sql @@ -664,157 +664,7 @@ VALUES (2178, 'application-logstash.yaml', 'LAOKOU_GROUP', 'spring: access-token: yRagfkAddGXdTySYTFzhvMguinulMIMSCcXUbljWDhe intentionalities: 7', '81c3de6319db8560c68935977f2d141f', '2023-11-03 07:37:45', '2024-01-30 14:46:47', 'nacos', '0:0:0:0:0:0:0:1', 'laokou-logstash', 'a61abd4c-ef96-42a5-99a1-616adee531f3', '', '', '', 'yaml', '', ''); -INSERT INTO "public"."config_info" -VALUES (2260, 'seataServer.properties', 'SEATA_GROUP', '#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html -#Transport configuration, for client and server -transport.type=TCP -transport.server=NIO -transport.heartbeat=true -transport.enableTmClientBatchSendRequest=false -transport.enableRmClientBatchSendRequest=true -transport.enableTcServerBatchSendResponse=false -transport.rpcRmRequestTimeout=30000 -transport.rpcTmRequestTimeout=30000 -transport.rpcTcRequestTimeout=30000 -transport.threadFactory.bossThreadPrefix=NettyBoss -transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker -transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler -transport.threadFactory.shareBossWorker=false -transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector -transport.threadFactory.clientSelectorThreadSize=1 -transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread -transport.threadFactory.bossThreadSize=1 -transport.threadFactory.workerThreadSize=default -transport.shutdown.wait=3 -transport.serialization=seata -transport.compressor=none - -#Transaction routing rules configuration, only for the client -service.vgroupMapping.default_tx_group=default -#If you use a registry, you can ignore it -service.default.grouplist=seata.laokou.org:8091 -service.enableDegrade=false -service.disableGlobalTransaction=false - -client.metadataMaxAgeMs=30000 -#Transaction rule configuration, only for the client -client.rm.asyncCommitBufferLimit=10000 -client.rm.lock.retryInterval=10 -client.rm.lock.retryTimes=30 -client.rm.lock.retryPolicyBranchRollbackOnConflict=true -client.rm.reportRetryCount=5 -client.rm.tableMetaCheckEnable=true -client.rm.tableMetaCheckerInterval=60000 -client.rm.sqlParserType=hikari -client.rm.reportSuccessEnable=false -client.rm.sagaBranchRegisterEnable=false -client.rm.sagaJsonParser=jackson -client.rm.tccActionInterceptorOrder=-2147482648 -client.tm.commitRetryCount=5 -client.tm.rollbackRetryCount=5 -client.tm.defaultGlobalTransactionTimeout=60000 -client.tm.degradeCheck=false -client.tm.degradeCheckAllowTimes=10 -client.tm.degradeCheckPeriod=2000 -client.tm.interceptorOrder=-2147482648 -client.undo.dataValidation=true -client.undo.logSerialization=jackson -client.undo.onlyCareUpdateColumns=true -server.undo.logSaveDays=7 -server.undo.logDeletePeriod=86400000 -client.undo.logTable=undo_log -client.undo.compress.enable=true -client.undo.compress.type=zip -client.undo.compress.threshold=64k -#For TCC transaction mode -tcc.fence.logTableName=tcc_fence_log -tcc.fence.cleanPeriod=1h -# You can choose from the following options: fastjson, jackson, gson -tcc.contextJsonParserType=fastjson - -#Log rule configuration, for client and server -log.exceptionRate=100 - -#Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional. -store.mode=redis -store.lock.mode=redis -store.session.mode=redis -#Used for password encryption -store.publicKey= - -#If `store.mode,store.lock.mode,store.session.mode` are not equal to `file`, you can remove the configuration block. -store.file.dir=file_store/data -store.file.maxBranchSessionSize=16384 -store.file.maxGlobalSessionSize=512 -store.file.fileWriteBufferCacheSize=16384 -store.file.flushDiskMode=async -store.file.sessionReloadReadSize=100 - -#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block. -store.db.datasource=hikari -store.db.dbType=mysql -store.db.driverClassName=com.mysql.cj.jdbc.Driver -store.db.url=jdbc:mysql://mysql.laokou.org:3306/kcloud_platform_alibaba_seata?useUnicode=true&rewriteBatchedStatements=true -store.db.user=root -store.db.password=laokou123 -store.db.minConn=5 -store.db.maxConn=30 -store.db.globalTable=global_table -store.db.branchTable=branch_table -store.db.distributedLockTable=distributed_lock -store.db.queryLimit=100 -store.db.lockTable=lock_table -store.db.maxWait=5000 - -#These configurations are required if the `store mode` is `redis`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `redis`, you can remove the configuration block. -store.redis.mode=single -store.redis.type=pipeline -store.redis.single.host=redis.laokou.org -store.redis.single.port=6379 -store.redis.sentinel.masterName= -store.redis.sentinel.sentinelHosts= -store.redis.sentinel.sentinelPassword= -store.redis.maxConn=10 -store.redis.minConn=1 -store.redis.maxTotal=100 -store.redis.database=0 -store.redis.password=laokou123 -store.redis.queryLimit=100 - -#Transaction rule configuration, only for the server -server.recovery.committingRetryPeriod=1000 -server.recovery.asynCommittingRetryPeriod=1000 -server.recovery.rollbackingRetryPeriod=1000 -server.recovery.timeoutRetryPeriod=1000 -server.maxCommitRetryTimeout=-1 -server.maxRollbackRetryTimeout=-1 -server.rollbackRetryTimeoutUnlockEnable=false -server.distributedLockExpireTime=10000 -server.session.branchAsyncQueueSize=5000 -server.session.enableBranchAsyncRemove=false -server.enableParallelRequestHandle=true -server.enableParallelHandleBranch=false - -server.raft.cluster=seata.laokou.org:7091,seata.laokou.org:7092,seata.laokou.org:7093 -server.raft.snapshotInterval=600 -server.raft.applyBatch=32 -server.raft.maxAppendBufferSize=262144 -server.raft.maxReplicatorInflightMsgs=256 -server.raft.disruptorBufferSize=16384 -server.raft.electionTimeoutMs=2000 -server.raft.reporterEnabled=false -server.raft.reporterInitialDelay=60 -server.raft.serialization=jackson -server.raft.compressor=none -server.raft.sync=true - -#Metrics configuration, only for the server -metrics.enabled=false -metrics.registryType=compact -metrics.exporterList=prometheus -metrics.exporterPrometheusPort=9898', '26217408b5ee26c2fec37325ea785e2f', '2023-11-27 16:36:34', '2024-03-04 11:55:27', - 'nacos', '0:0:0:0:0:0:0:1', 'laokou-seata', 'a61abd4c-ef96-42a5-99a1-616adee531f3', 'seata配置', '', '', - 'properties', '', ''); + INSERT INTO "public"."config_info" VALUES (1570, 'admin-degrade.json', 'LAOKOU_GROUP', '[ { @@ -977,50 +827,7 @@ knife4j: gateway: enabled: true', 'b4ccbf4df335be2d07acf78a456ad733', '2024-05-25 18:13:33.458', '2024-05-25 18:46:18.892', 'nacos', '127.0.0.1', 'laokou-gateway', '0dac1a68-2f01-40df-bd26-bf0cb199057a', 'gateway配置', '', '', 'yaml', '', ''); -INSERT INTO "public"."config_info" -VALUES (1254, 'application-common-seata.yaml', 'LAOKOU_GROUP', '# seata -seata: - saga: - enabled: true - state-machine: - enable-async: true - table-prefix: seata_ - async-thread-pool: - core-pool-size: 1 - max-pool-size: 20 - keep-alive-time: 60 - trans-operation-timeout: 1800000 - service-invoke-timeout: 300000 - auto-register-resources: true - resources: - - classpath*:seata/saga/statelang/**/*.json - default-tenant-id: 0 - charset: UTF-8 - client: - tm: - default-global-transaction-timeout: 30000 - config: - type: nacos - nacos: - server-addr: https://nacos.laokou.org:8848 - namespace: a61abd4c-ef96-42a5-99a1-616adee531f3 - username: nacos - password: nacos - group: SEATA_GROUP - data-id: seataServer.properties - registry: - type: nacos - nacos: - namespace: a61abd4c-ef96-42a5-99a1-616adee531f3 - group: SEATA_GROUP - username: nacos - password: nacos - server-addr: https://nacos.laokou.org:8848 - enabled: true - tx-service-group: default_tx_group - data-source-proxy-mode: AT', '20aac9490838d442049d7ddfd8d0a7d2', '2023-01-18 13:53:56', '2024-05-15 00:13:12.626', - 'nacos', '0:0:0:0:0:0:0:1', '', 'a61abd4c-ef96-42a5-99a1-616adee531f3', 'seata公共配置', '', '', 'yaml', '', - ''); + INSERT INTO "public"."config_info" VALUES (33, 'gateway-flow.json', 'LAOKOU_GROUP', '[ { @@ -1095,157 +902,7 @@ VALUES (41, 'application-logstash.yaml', 'LAOKOU_GROUP', 'spring: access-token: yRagfkAddGXdTySYTFzhvMguinulMIMSCcXUbljWDhe intentionalities: 7', '81c3de6319db8560c68935977f2d141f', '2024-05-25 18:13:10.655', '2024-05-25 18:13:10.655', NULL, '127.0.0.1', 'laokou-logstash', '8140e92b-fb43-48f5-b63b-7506185206a5', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO "public"."config_info" -VALUES (42, 'seataServer.properties', 'SEATA_GROUP', '#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html -#Transport configuration, for client and server -transport.type=TCP -transport.server=NIO -transport.heartbeat=true -transport.enableTmClientBatchSendRequest=false -transport.enableRmClientBatchSendRequest=true -transport.enableTcServerBatchSendResponse=false -transport.rpcRmRequestTimeout=30000 -transport.rpcTmRequestTimeout=30000 -transport.rpcTcRequestTimeout=30000 -transport.threadFactory.bossThreadPrefix=NettyBoss -transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker -transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler -transport.threadFactory.shareBossWorker=false -transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector -transport.threadFactory.clientSelectorThreadSize=1 -transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread -transport.threadFactory.bossThreadSize=1 -transport.threadFactory.workerThreadSize=default -transport.shutdown.wait=3 -transport.serialization=seata -transport.compressor=none - -#Transaction routing rules configuration, only for the client -service.vgroupMapping.default_tx_group=default -#If you use a registry, you can ignore it -service.default.grouplist=seata.laokou.org:8091 -service.enableDegrade=false -service.disableGlobalTransaction=false - -client.metadataMaxAgeMs=30000 -#Transaction rule configuration, only for the client -client.rm.asyncCommitBufferLimit=10000 -client.rm.lock.retryInterval=10 -client.rm.lock.retryTimes=30 -client.rm.lock.retryPolicyBranchRollbackOnConflict=true -client.rm.reportRetryCount=5 -client.rm.tableMetaCheckEnable=true -client.rm.tableMetaCheckerInterval=60000 -client.rm.sqlParserType=hikari -client.rm.reportSuccessEnable=false -client.rm.sagaBranchRegisterEnable=false -client.rm.sagaJsonParser=jackson -client.rm.tccActionInterceptorOrder=-2147482648 -client.tm.commitRetryCount=5 -client.tm.rollbackRetryCount=5 -client.tm.defaultGlobalTransactionTimeout=60000 -client.tm.degradeCheck=false -client.tm.degradeCheckAllowTimes=10 -client.tm.degradeCheckPeriod=2000 -client.tm.interceptorOrder=-2147482648 -client.undo.dataValidation=true -client.undo.logSerialization=jackson -client.undo.onlyCareUpdateColumns=true -server.undo.logSaveDays=7 -server.undo.logDeletePeriod=86400000 -client.undo.logTable=undo_log -client.undo.compress.enable=true -client.undo.compress.type=zip -client.undo.compress.threshold=64k -#For TCC transaction mode -tcc.fence.logTableName=tcc_fence_log -tcc.fence.cleanPeriod=1h -# You can choose from the following options: fastjson, jackson, gson -tcc.contextJsonParserType=fastjson - -#Log rule configuration, for client and server -log.exceptionRate=100 - -#Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional. -store.mode=redis -store.lock.mode=redis -store.session.mode=redis -#Used for password encryption -store.publicKey= - -#If `store.mode,store.lock.mode,store.session.mode` are not equal to `file`, you can remove the configuration block. -store.file.dir=file_store/data -store.file.maxBranchSessionSize=16384 -store.file.maxGlobalSessionSize=512 -store.file.fileWriteBufferCacheSize=16384 -store.file.flushDiskMode=async -store.file.sessionReloadReadSize=100 - -#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block. -store.db.datasource=hikari -store.db.dbType=mysql -store.db.driverClassName=com.mysql.cj.jdbc.Driver -store.db.url=jdbc:mysql://mysql.laokou.org:3306/kcloud_platform_alibaba_seata?useUnicode=true&rewriteBatchedStatements=true -store.db.user=root -store.db.password=laokou123 -store.db.minConn=5 -store.db.maxConn=30 -store.db.globalTable=global_table -store.db.branchTable=branch_table -store.db.distributedLockTable=distributed_lock -store.db.queryLimit=100 -store.db.lockTable=lock_table -store.db.maxWait=5000 - -#These configurations are required if the `store mode` is `redis`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `redis`, you can remove the configuration block. -store.redis.mode=single -store.redis.type=pipeline -store.redis.single.host=redis.laokou.org -store.redis.single.port=6379 -store.redis.sentinel.masterName= -store.redis.sentinel.sentinelHosts= -store.redis.sentinel.sentinelPassword= -store.redis.maxConn=10 -store.redis.minConn=1 -store.redis.maxTotal=100 -store.redis.database=0 -store.redis.password=laokou123 -store.redis.queryLimit=100 - -#Transaction rule configuration, only for the server -server.recovery.committingRetryPeriod=1000 -server.recovery.asynCommittingRetryPeriod=1000 -server.recovery.rollbackingRetryPeriod=1000 -server.recovery.timeoutRetryPeriod=1000 -server.maxCommitRetryTimeout=-1 -server.maxRollbackRetryTimeout=-1 -server.rollbackRetryTimeoutUnlockEnable=false -server.distributedLockExpireTime=10000 -server.session.branchAsyncQueueSize=5000 -server.session.enableBranchAsyncRemove=false -server.enableParallelRequestHandle=true -server.enableParallelHandleBranch=false - -server.raft.cluster=seata.laokou.org:7091,seata.laokou.org:7092,seata.laokou.org:7093 -server.raft.snapshotInterval=600 -server.raft.applyBatch=32 -server.raft.maxAppendBufferSize=262144 -server.raft.maxReplicatorInflightMsgs=256 -server.raft.disruptorBufferSize=16384 -server.raft.electionTimeoutMs=2000 -server.raft.reporterEnabled=false -server.raft.reporterInitialDelay=60 -server.raft.serialization=jackson -server.raft.compressor=none -server.raft.sync=true - -#Metrics configuration, only for the server -metrics.enabled=false -metrics.registryType=compact -metrics.exporterList=prometheus -metrics.exporterPrometheusPort=9898', '26217408b5ee26c2fec37325ea785e2f', '2024-05-25 18:13:10.662', - '2024-05-25 18:13:10.662', NULL, '127.0.0.1', 'laokou-seata', '8140e92b-fb43-48f5-b63b-7506185206a5', - 'seata配置', NULL, NULL, 'properties', NULL, ''); + INSERT INTO "public"."config_info" VALUES (44, 'admin-degrade.json', 'LAOKOU_GROUP', '[ { @@ -1418,49 +1075,7 @@ springdoc: swagger-ui: path: /swagger-ui.html', 'e83a99587ac917866dee016df29fd662', '2024-05-25 18:13:10.622', '2024-05-26 00:02:32.884', 'nacos', '127.0.0.1', '', '8140e92b-fb43-48f5-b63b-7506185206a5', '', '', '', 'yaml', '', ''); -INSERT INTO "public"."config_info" -VALUES (45, 'application-common-seata.yaml', 'LAOKOU_GROUP', '# seata -seata: - saga: - enabled: true - state-machine: - enable-async: true - table-prefix: seata_ - async-thread-pool: - core-pool-size: 1 - max-pool-size: 20 - keep-alive-time: 60 - trans-operation-timeout: 1800000 - service-invoke-timeout: 300000 - auto-register-resources: true - resources: - - classpath*:seata/saga/statelang/**/*.json - default-tenant-id: 0 - charset: UTF-8 - client: - tm: - default-global-transaction-timeout: 30000 - config: - type: nacos - nacos: - server-addr: https://nacos.laokou.org:8848 - namespace: 8140e92b-fb43-48f5-b63b-7506185206a5 - username: nacos - password: nacos - group: SEATA_GROUP - data-id: seataServer.properties - registry: - type: nacos - nacos: - namespace: 8140e92b-fb43-48f5-b63b-7506185206a5 - group: SEATA_GROUP - username: nacos - password: nacos - server-addr: https://nacos.laokou.org:8848 - enabled: true - tx-service-group: default_tx_group - data-source-proxy-mode: AT', 'eeeffb74bfa083c4186b2690f4d16288', '2024-05-25 18:13:10.683', '2024-05-25 18:50:17.125', - 'nacos', '127.0.0.1', '', '8140e92b-fb43-48f5-b63b-7506185206a5', 'seata公共配置', '', '', 'yaml', '', ''); + INSERT INTO "public"."config_info" VALUES (27, 'application-common-redis.yaml', 'LAOKOU_GROUP', '# jasypt jasypt: @@ -2032,157 +1647,7 @@ VALUES (63, 'application-logstash.yaml', 'LAOKOU_GROUP', 'spring: access-token: yRagfkAddGXdTySYTFzhvMguinulMIMSCcXUbljWDhe intentionalities: 7', '81c3de6319db8560c68935977f2d141f', '2024-05-25 18:13:33.419', '2024-05-25 18:13:33.419', NULL, '127.0.0.1', 'laokou-logstash', '0dac1a68-2f01-40df-bd26-bf0cb199057a', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO "public"."config_info" -VALUES (64, 'seataServer.properties', 'SEATA_GROUP', '#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html -#Transport configuration, for client and server -transport.type=TCP -transport.server=NIO -transport.heartbeat=true -transport.enableTmClientBatchSendRequest=false -transport.enableRmClientBatchSendRequest=true -transport.enableTcServerBatchSendResponse=false -transport.rpcRmRequestTimeout=30000 -transport.rpcTmRequestTimeout=30000 -transport.rpcTcRequestTimeout=30000 -transport.threadFactory.bossThreadPrefix=NettyBoss -transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker -transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler -transport.threadFactory.shareBossWorker=false -transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector -transport.threadFactory.clientSelectorThreadSize=1 -transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread -transport.threadFactory.bossThreadSize=1 -transport.threadFactory.workerThreadSize=default -transport.shutdown.wait=3 -transport.serialization=seata -transport.compressor=none - -#Transaction routing rules configuration, only for the client -service.vgroupMapping.default_tx_group=default -#If you use a registry, you can ignore it -service.default.grouplist=seata.laokou.org:8091 -service.enableDegrade=false -service.disableGlobalTransaction=false - -client.metadataMaxAgeMs=30000 -#Transaction rule configuration, only for the client -client.rm.asyncCommitBufferLimit=10000 -client.rm.lock.retryInterval=10 -client.rm.lock.retryTimes=30 -client.rm.lock.retryPolicyBranchRollbackOnConflict=true -client.rm.reportRetryCount=5 -client.rm.tableMetaCheckEnable=true -client.rm.tableMetaCheckerInterval=60000 -client.rm.sqlParserType=hikari -client.rm.reportSuccessEnable=false -client.rm.sagaBranchRegisterEnable=false -client.rm.sagaJsonParser=jackson -client.rm.tccActionInterceptorOrder=-2147482648 -client.tm.commitRetryCount=5 -client.tm.rollbackRetryCount=5 -client.tm.defaultGlobalTransactionTimeout=60000 -client.tm.degradeCheck=false -client.tm.degradeCheckAllowTimes=10 -client.tm.degradeCheckPeriod=2000 -client.tm.interceptorOrder=-2147482648 -client.undo.dataValidation=true -client.undo.logSerialization=jackson -client.undo.onlyCareUpdateColumns=true -server.undo.logSaveDays=7 -server.undo.logDeletePeriod=86400000 -client.undo.logTable=undo_log -client.undo.compress.enable=true -client.undo.compress.type=zip -client.undo.compress.threshold=64k -#For TCC transaction mode -tcc.fence.logTableName=tcc_fence_log -tcc.fence.cleanPeriod=1h -# You can choose from the following options: fastjson, jackson, gson -tcc.contextJsonParserType=fastjson - -#Log rule configuration, for client and server -log.exceptionRate=100 - -#Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional. -store.mode=redis -store.lock.mode=redis -store.session.mode=redis -#Used for password encryption -store.publicKey= - -#If `store.mode,store.lock.mode,store.session.mode` are not equal to `file`, you can remove the configuration block. -store.file.dir=file_store/data -store.file.maxBranchSessionSize=16384 -store.file.maxGlobalSessionSize=512 -store.file.fileWriteBufferCacheSize=16384 -store.file.flushDiskMode=async -store.file.sessionReloadReadSize=100 - -#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block. -store.db.datasource=hikari -store.db.dbType=mysql -store.db.driverClassName=com.mysql.cj.jdbc.Driver -store.db.url=jdbc:mysql://mysql.laokou.org:3306/kcloud_platform_alibaba_seata?useUnicode=true&rewriteBatchedStatements=true -store.db.user=root -store.db.password=laokou123 -store.db.minConn=5 -store.db.maxConn=30 -store.db.globalTable=global_table -store.db.branchTable=branch_table -store.db.distributedLockTable=distributed_lock -store.db.queryLimit=100 -store.db.lockTable=lock_table -store.db.maxWait=5000 - -#These configurations are required if the `store mode` is `redis`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `redis`, you can remove the configuration block. -store.redis.mode=single -store.redis.type=pipeline -store.redis.single.host=redis.laokou.org -store.redis.single.port=6379 -store.redis.sentinel.masterName= -store.redis.sentinel.sentinelHosts= -store.redis.sentinel.sentinelPassword= -store.redis.maxConn=10 -store.redis.minConn=1 -store.redis.maxTotal=100 -store.redis.database=0 -store.redis.password=laokou123 -store.redis.queryLimit=100 - -#Transaction rule configuration, only for the server -server.recovery.committingRetryPeriod=1000 -server.recovery.asynCommittingRetryPeriod=1000 -server.recovery.rollbackingRetryPeriod=1000 -server.recovery.timeoutRetryPeriod=1000 -server.maxCommitRetryTimeout=-1 -server.maxRollbackRetryTimeout=-1 -server.rollbackRetryTimeoutUnlockEnable=false -server.distributedLockExpireTime=10000 -server.session.branchAsyncQueueSize=5000 -server.session.enableBranchAsyncRemove=false -server.enableParallelRequestHandle=true -server.enableParallelHandleBranch=false - -server.raft.cluster=seata.laokou.org:7091,seata.laokou.org:7092,seata.laokou.org:7093 -server.raft.snapshotInterval=600 -server.raft.applyBatch=32 -server.raft.maxAppendBufferSize=262144 -server.raft.maxReplicatorInflightMsgs=256 -server.raft.disruptorBufferSize=16384 -server.raft.electionTimeoutMs=2000 -server.raft.reporterEnabled=false -server.raft.reporterInitialDelay=60 -server.raft.serialization=jackson -server.raft.compressor=none -server.raft.sync=true - -#Metrics configuration, only for the server -metrics.enabled=false -metrics.registryType=compact -metrics.exporterList=prometheus -metrics.exporterPrometheusPort=9898', '26217408b5ee26c2fec37325ea785e2f', '2024-05-25 18:13:33.425', - '2024-05-25 18:13:33.425', NULL, '127.0.0.1', 'laokou-seata', '0dac1a68-2f01-40df-bd26-bf0cb199057a', - 'seata配置', NULL, NULL, 'properties', NULL, ''); + INSERT INTO "public"."config_info" VALUES (66, 'admin-degrade.json', 'LAOKOU_GROUP', '[ { @@ -2204,49 +1669,7 @@ VALUES (66, 'admin-degrade.json', 'LAOKOU_GROUP', '[ ]', '2c0d4de0716f94bd6878b0a68d3faa0f', '2024-05-25 18:13:33.436', '2024-05-25 18:13:33.436', NULL, '127.0.0.1', 'laokou-admin', '0dac1a68-2f01-40df-bd26-bf0cb199057a', 'admin sentinel degrade rule', NULL, NULL, 'json', NULL, ''); -INSERT INTO "public"."config_info" -VALUES (67, 'application-common-seata.yaml', 'LAOKOU_GROUP', '# seata -seata: - saga: - enabled: true - state-machine: - enable-async: true - table-prefix: seata_ - async-thread-pool: - core-pool-size: 1 - max-pool-size: 20 - keep-alive-time: 60 - trans-operation-timeout: 1800000 - service-invoke-timeout: 300000 - auto-register-resources: true - resources: - - classpath*:seata/saga/statelang/**/*.json - default-tenant-id: 0 - charset: UTF-8 - client: - tm: - default-global-transaction-timeout: 30000 - config: - type: nacos - nacos: - server-addr: nacos.laokou.org - namespace: 0dac1a68-2f01-40df-bd26-bf0cb199057a - username: nacos - password: nacos - group: SEATA_GROUP - data-id: seataServer.properties - registry: - type: nacos - nacos: - namespace: 0dac1a68-2f01-40df-bd26-bf0cb199057a - group: SEATA_GROUP - username: nacos - password: nacos - server-addr: nacos.laokou.org - enabled: true - tx-service-group: default_tx_group - data-source-proxy-mode: AT', 'd121fc4a27f2da0223bc33374be43f73', '2024-05-25 18:13:33.441', '2024-05-25 18:49:36.942', - 'nacos', '127.0.0.1', '', '0dac1a68-2f01-40df-bd26-bf0cb199057a', 'seata公共配置', '', '', 'yaml', '', ''); + INSERT INTO "public"."config_info" VALUES (68, 'application-admin.yaml', 'LAOKOU_GROUP', '# jasypt jasypt: @@ -2795,8 +2218,7 @@ INSERT INTO "public"."config_tags_relation" VALUES (2118, 'report', '', 'application-report.yaml', 'LAOKOU_GROUP', 'a61abd4c-ef96-42a5-99a1-616adee531f3', 720); INSERT INTO "public"."config_tags_relation" VALUES (1570, 'admin', '', 'admin-degrade.json', 'LAOKOU_GROUP', 'a61abd4c-ef96-42a5-99a1-616adee531f3', 4); -INSERT INTO "public"."config_tags_relation" -VALUES (1254, 'seata', '', 'application-common-seata.yaml', 'LAOKOU_GROUP', 'a61abd4c-ef96-42a5-99a1-616adee531f3', 31); + INSERT INTO "public"."config_tags_relation" VALUES (26, 'gateway', '', 'router.json', 'LAOKOU_GROUP', 'a61abd4c-ef96-42a5-99a1-616adee531f3', 54); INSERT INTO "public"."config_tags_relation" diff --git a/doc/deploy/docker-compose.yml b/doc/deploy/docker-compose.yml index 5f63cec8cf..e25448441b 100644 --- a/doc/deploy/docker-compose.yml +++ b/doc/deploy/docker-compose.yml @@ -233,27 +233,6 @@ services: depends_on: - laokou-register network_mode: bridge - laokou-seata: - image: registry.cn-shenzhen.aliyuncs.com/koushenhai/laokou-seata:3.2.1 - container_name: laokou-seata - tty: true - env_file: - - env/common.env - - env/seata.env - ports: - - "7091:7091" - - "8091:8091" - volumes: - - ./seata/logs:/opt - extra_hosts: - - "postgresql.laokou.org:192.168.30.1" - - "nacos.laokou.org:192.168.30.1" - - "redis.laokou.org:192.168.30.1" - restart: always - privileged: true - depends_on: - - laokou-register - network_mode: bridge laokou-gateway: image: registry.cn-shenzhen.aliyuncs.com/koushenhai/laokou-gateway:3.2.1 container_name: laokou-gateway @@ -336,13 +315,11 @@ services: - "postgresql.laokou.org:192.168.30.1" - "rocketmq.laokou.org:192.168.30.1" - "elasticsearch.laokou.org:192.168.30.1" - - "seata.laokou.org:192.168.30.1" restart: always privileged: true network_mode: bridge depends_on: - laokou-register - - laokou-seata - elasticsearch laokou-logstash: image: registry.cn-shenzhen.aliyuncs.com/koushenhai/laokou-logstash-start:3.2.1 diff --git a/doc/deploy/env/seata.env b/doc/deploy/env/seata.env deleted file mode 100644 index 9535a8f7f0..0000000000 --- a/doc/deploy/env/seata.env +++ /dev/null @@ -1,7 +0,0 @@ -SEATA_GROUP=SEATA_GROUP -SEATA_GROUP=SEATA_GROUP -SEATA_USERNAME=seata -SEATA_PASSWORD=seata -SEATA_LOG_PATH=/opt -JASYPT_ENCRYPTOR_PASSWORD=5201314wumeihua -JVM_OPTS="-Xmx512m -Xms512m -Xmn256m -XX:+UseG1GC" diff --git a/laokou-cloud/laokou-gateway/pom.xml b/laokou-cloud/laokou-gateway/pom.xml index 043b6d6ab1..a8253d66fd 100644 --- a/laokou-cloud/laokou-gateway/pom.xml +++ b/laokou-cloud/laokou-gateway/pom.xml @@ -36,6 +36,16 @@ io.grpc grpc-netty + + + io.grpc + grpc-api + + + io.grpc + grpc-core + + org.laokou diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/.babelrc b/laokou-cloud/laokou-seata-saga-statemachine-designer/.babelrc deleted file mode 100644 index 56b133d788..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/.babelrc +++ /dev/null @@ -1,20 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - [ - "@babel/preset-react", - { - "runtime": "automatic" - } - ] - ], - "plugins": [ - [ - "@babel/plugin-transform-react-jsx", - { - "importSource": "@bpmn-io/properties-panel/preact", - "runtime": "automatic" - } - ] - ] -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/.eslintignore b/laokou-cloud/laokou-seata-saga-statemachine-designer/.eslintignore deleted file mode 100644 index 3dda1c9d00..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -es -cjs -dist -scripts diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/.eslintrc.json b/laokou-cloud/laokou-seata-saga-statemachine-designer/.eslintrc.json deleted file mode 100644 index 8720470c67..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/.eslintrc.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "env": { - "browser": true - }, - "parser": "@babel/eslint-parser", - "extends": "airbnb", - "rules": { - "arrow-body-style": 0, - "class-methods-use-this": 0, - "func-names": 0, - "import/extensions": 0, - "import/no-extraneous-dependencies": 0, - "import/no-unresolved": 0, - "jsx-a11y/anchor-is-valid":0, - "jsx-a11y/no-static-element-interactions": 0, - "no-param-reassign": 0, - "no-plusplus": 0, - "object-curly-newline": 0, - "react/destructuring-assignment": 0, - "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }], - "react/no-multi-comp": 0, - "react/prefer-stateless-function": 0, - "react/prop-types": 0, - "react/sort-comp": 0, - "react/no-deprecated": 0, - "react/react-in-jsx-scope": 0, - "react/jsx-no-bind": 0, - "no-underscore-dangle": 0 - } -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/.gitignore b/laokou-cloud/laokou-seata-saga-statemachine-designer/.gitignore deleted file mode 100644 index 60fc8df7a1..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/.idea/ -/.vscode/ - -/node_modules/ -/dist/ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/LICENSE b/laokou-cloud/laokou-seata-saga-statemachine-designer/LICENSE deleted file mode 100644 index b916c3e8ef..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/LICENSE +++ /dev/null @@ -1,14 +0,0 @@ -Licensed to the Apache Software Foundation (ASF) under one or more -contributor license agreements. See the NOTICE file distributed with -this work for additional information regarding copyright ownership. -The ASF licenses this file to You under the Apache License, Version 2.0 -(the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/README-zh.md b/laokou-cloud/laokou-seata-saga-statemachine-designer/README-zh.md deleted file mode 100644 index 27466c3e01..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/README-zh.md +++ /dev/null @@ -1,633 +0,0 @@ -# Seata Saga state machine designer - -由于旧版 Saga 状态机设计器的基座框架 ggeditor 不再维护,且 ggeditor 暴露出来的漏洞较多,影响了项目整体安全性。所以我们采取重构状态机设计器的做法,并使用新框架 diagram-js 为基座构建新的设计器。本文档涵盖 diagram-js 框架使用指南、设计器实现思路、代码结构等方面,旨在提供一个文档方便社区协作。 - - - -[TOC] - - - -## diagram-js - -[diagram-js](https://github.com/bpmn-io/diagram-js) 是 bpmn.io 组织开发维护的一款用于在网页上显示和修改流程图的框架。它使我们能够渲染视觉元素并在它们之上构建交互式体验。它为我们提供了一个非常简单的模块系统,用于构建服务发现的功能和依赖注入。该系统还提供了许多实现流程图要点的核心服务。此外 diagram-js 还定义了图形元素及其关系的数据模型。 - -基于 diagram-js 构建的知名项目有 bpmn-js, dmn-js 等等。在实现 Saga 状态机设计器时参考了很多 [bpmn-js](https://github.com/bpmn-io/bpmn-js) 的实现,一方面 Seata Saga 和 BPMN 规范有很多相似之处,且借鉴了很多 BPMN 的元素;另一方面,bpmn-js 就是基于 diagram-js 实现的,为 Saga 设计器的实现提供了一个模板。 - -下面我将总结一些 diagram-js 的整体架构,带大家快速入门。 - -### Diagram - -`Diagram` 是 diagram-js 提供的核心类入口,如果想要在页面的 canvas 块中挂载一个图,可以使用以下代码 - -```js -const editor = new Diagram({ - container: document.querySelector('#canvas'), - keyboard: { bindTo: document }, -}); -``` - -### 挂钩到生命周期 - -diagram-js 内部使用事件驱动架构,允许我们通过事件总线连接到 `Diagram` 的生命周期以及交互。以下代码展示了如何捕获一般变化的元素和建模操作, - -```js -diagram.get('eventBus').on('commandStack.changed', () => { - // user modeled something or - // performed an undo/redo operation -}); - -modeler.on('element.changed', (event) => { - const element = event.element; - - // the element was changed by the user -}); -``` - -### 模块系统 - -要向 `Diagram` 注册扩展可以将它们作为数组传递给构造函数的 `modules` 选项中,这将允许传递修改或替换现有功能的自定义模块。 - -```js -const diagram = new Diagram({ - container: document.querySelector('#canvas'), - keyboard: { bindTo: document }, - modules: [ - PropertiesPanel, - PropertiesProvider, - ], -}); -``` - -而模块在 diagram-js 中是是定义一个或多个命名服务的单元。这些服务提供附加功能,通过挂钩到 diagram 的生命周期来实现。在底层,diagram-js使用依赖注入 (DI) 来连接和发现图表组件。这个机制是建立在 [didi ](https://github.com/nikku/didi) 之上的。下面显示了一个 [挂钩到生命周期](#挂钩到生命周期) 而实现的服务。 - -```js -const MyLoggingPlugin = (eventBus) => { - eventBus.on('element.changed', (event) => { - console.log('element ', event.element, ' changed'); - }); -} - -// ensure the dependency names are still available after minification -MyLoggingPlugin.$inject = [ 'eventBus' ]; -``` - -我们必须使用模块定义以唯一的名称发布服务: - -```js -import CoreModule from 'diagram-js/lib/core'; - -// export as module -export default { - __depends__: [ CoreModule ], // {2} - __init__: [ 'myLoggingPlugin' ], // {3} - myLoggingPlugin: [ 'type', MyLoggingPlugin ] // {1} -}; -``` - -该定义告诉 DI 基础设施该服务叫做`myLoggingPlugin` `{1}`,它依赖于 diagram-js 核心模块 `{2}`,并且该服务应在创建图表时初始化 `{3}`。有关更多详细信息,请查看 [didi 文档](https://github.com/nikku/didi/blob/master/README.md)。 - -现在可以基于创建出的模块传递到 `Diagram` 当中, - -```js -import MyLoggingModule from 'path-to-my-logging-module'; - -const diagram = new Diagram({ - modules: [ - MyLoggingModule - ] -}); -``` - -### 核心服务 - -[diagram-js 核心](https://github.com/bpmn-io/diagram-js/tree/master/lib/core)是围绕许多基础服务构建的: - -- [`Canvas`](https://github.com/bpmn-io/diagram-js/blob/master/lib/core/Canvas.js)- 提供用于添加和删除图形元素的API;处理元素生命周期并提供 API 来缩放和滚动。 -- [`EventBus`](https://github.com/bpmn-io/diagram-js/blob/master/lib/core/EventBus.js)- 全局沟通渠道,采用 *fire and forget* 政策。感兴趣的各方可以订阅各种事件,并在事件发出后对其采取行动。事件总线帮助我们解耦关注点并模块化功能,以便新功能可以轻松地与现有行为挂钩。 -- [`ElementFactory`](https://github.com/bpmn-io/diagram-js/blob/master/lib/core/ElementFactory.js)- 根据 diagram-js 的内部数据模型创建形状和连接的工厂。 -- [`ElementRegistry`](https://github.com/bpmn-io/diagram-js/blob/master/lib/core/ElementRegistry.js)- 管理添加到图中的所有元素,并提供 API 来通过 id 检索元素及其图形表示。 - -### 数据模型 - -在底层,diagram-js 实现了一个由 `Shape` 和 `Connection` 组成的简单数据模型。`Shape` 具有父级、子级列表以及传入和传出 `Connections` 的列表。一个 `Connection` 有一个父级以及一个源和目标,分别指向一个 `Shape`。 - -[`ElementRegistry`](https://github.com/bpmn-io/diagram-js/blob/master/lib/core/ElementRegistry.js) 负责根据 [模型](https://github.com/bpmn-io/diagram-js/blob/master/lib/model/index.js) 创建 `Shape` 和 `Connection`。在建模过程中,[Modeling](https://github.com/bpmn-io/diagram-js/blob/master/lib/features/modeling/Modeling.js) 服务会根据用户操作更新元素关系。 - -### 辅助服务(工具箱) - -除了数据模型及其核心服务之外,diagram-js 还提供了丰富的附加帮助工具箱。 - -- [`CommandStack`](https://github.com/bpmn-io/diagram-js/blob/master/lib/command/CommandStack.js)- 负责建模期间的重做和撤消。 -- [`ContextPad`](https://github.com/bpmn-io/diagram-js/blob/master/lib/features/context-pad/ContextPad.js)- 提供围绕元素的上下文操作。 -- [`Overlays`](https://github.com/bpmn-io/diagram-js/blob/master/lib/features/overlays/Overlays.js)- 提供用于将附加信息附加到图表元素的 API。 -- [`Modeling`](https://github.com/bpmn-io/diagram-js/blob/master/lib/features/modeling/Modeling.js)- 提供用于更新画布上的元素(移动、删除)的 API -- [`Palette`](https://github.com/bpmn-io/diagram-js/blob/master/lib/features/palette/Palette.js) -- ... - - - -## Saga 设计器深入解析 - - - -### 代码入口 - -#### Editor.js - -在本文件中定义了名为 `Editor` 的类,继承自 diagram-js 的 `Diagram` 类。 - -首先定义 `Editor` 需要的模块,这里的模块指的是前文介绍的[模块系统](#模块系统)中的概念。`Editor` 的模块可以分为两类:定制化模块,和 diagram-js 内置模块。 - -```js -Editor.prototype.modules = [ - // Customized modules - Layout, - Modeling, - Providers, - Render, - - // Built-in modules - AlignElementsModule, - AutoScrollModule, - BendpointsModule, - // ... -]; -``` - -值得注意的是 `Editor` 的两个方法, - -**`Editor#import`** - -用于从 JSON 定义的状态机导入进 `Editor` 中,内部逻辑是先清楚图中当前所有元素,然后调用 `sagaImporter` 模块的 `import` 方法,其中 `sagaImporter` 是定制化模块 `Modeling` 中的子模块,后续会进行介绍。 - -```js -Editor.prototype.import = function (definitions) { - this.clear(); - this.get('sagaImporter') - .import(definitions); -}; -``` - -**`Editor#export`** - -用于将 `Editor` 当前图中元素导出为 JSON 文件,调用 `sagaExporter` 模块的 `export` 方法,其中 `sagaExporter` 是定制化模块 `Modeling` 中的子模块,后续会进行介绍。 - -```js -Editor.prototype.export = function () { - return this.get('sagaExporter') - .export(); -}; -``` - -除此之外,`Editor` 还提供了一系列的实用方法以供调用,比如 `clear` 清除图中所有元素, `detach` 从容器中卸载等等。 - - - -#### index.js - -新建 `Editor` 对象,挂载到 `canvas` block 中 - -```js -const editor = new Editor({ - container: document.querySelector('#canvas'), - keyboard: { bindTo: document }, - propertiesPanel: { parent: '#properties' }, - // Add properties panel as additional modules - additionalModules: [ - PropertiesPanel, - PropertiesProvider, - ], -}); -``` - -值得注意的是,这里将 `PropertiesPanel`, `PropertiesProvider` 作为附加模块添加到 `Editor` 中而不是在 `Editor.prototype.modules` 中直接加入,是基于属性面板是一个可插拔模块的考虑。如果后续打算把设计器作为一个 npm 包进行发布,用户使用 `Editor` 时不需要捆绑属性面板使用。 - - - -在创建 `Editor` 对象之后,通过以下这行代码, - -```js -control(editor); -``` - -是用于在画布上创建控制按钮,分别用于控制 `Editor` 进行导入、导出文件 - -![control](assets/control.png) - -### providers - -providers 文件夹用于为 diagram-js 工具箱(见[辅助服务(工具箱)](#辅助服务(工具箱))章节)提供对应条目的。 - -#### providers/ContextPadProvider.js - -![ContextPad](assets/context-pad.png) - -ContextPad 是 diagram-js 内置的辅助模块,可以定义 Provider 为其填充条目。实现的核心在于 `ContextPadProvider.prototype.getContextPadEntries` 方法,当前设计器针对于 Shape 会提供连接和删除两个条目,对于边则仅提供删除条目(边上再连边显然不合理)。 - - - -#### providers/PaletteProvider.js - -palette - -Palette 是 diagram-js 内置的左侧画板,实现的核心在于 `PaletteProvider.prototype.getPaletteEntries` 方法,这里目前只实现了(ServiceTask, Fail, Success 三种类型状态,还有一个开始节点,状态仍需扩充)除了各种状态之外,在最上方还提供了拉索工具,用于批量框选状态从而进行删除或移动等操作。 - - - -### spec - -spec 文件夹中内聚了所有状态的定义,主要作用是规定了每个状态新建时的默认属性,且通过 `importJson` 和 `exportJson` 定义了一些导入导出的转换逻辑。这里的代码文件不再展开介绍,可以通过比对代码和下方的类图进行理解。 - -```mermaid ---- -title: Spec Class Diagram ---- -classDiagram - BaseSpec <|-- StateMachine - - BaseSpec <|-- NodeStyle - BaseSpec <|-- Node - - Node <|-- StartState - Node <|-- State - - State <|-- TaskState - TaskState <|-- ServiceTask - TaskState <|-- ScriptTask - - BaseSpec <|-- EdgeStyle - BaseSpec <|-- Edge - - note for Transition "所有边的基类" - Edge <|-- Transition - Transition <|-- ChoiceEntry - Transition <|-- CatchEntry - - Node *-- NodeStyle - Edge *-- EdgeStyle - - BaseSpec : String Type - - class StateMachine { - String Name - String Comment - String Version - } - - NodeStyle : Object bounds - - class Node{ - NodeStyle style - } - - class EdgeStyle { - Object source - Object target - List waypoints - } - - class Edge{ - EdgeStyle style - } - - class State { - String Name - String Comment - } - - class TaskState { - List[Object] Input - Object Output - Object Status - List Retry - } - - class ServiceTask { - String ServiceName - String ServiceMethod - } -``` - -根据上图,可以了解 Spec 相关类图,和 Saga Java 代码中定义有类似之处。与 Java 代码不同的是,由于设计器需要将状态机以图的形式呈现给用户,所以状态、连接都需要通过 `style` 属性进行记录。 - - - -### modeling - -Modeling 模块是 Saga 状态机设计器的逻辑核心,这个模块逻辑内聚了 Saga 规范。每个文件都很重要,下文将针对每个代码文件分别展开进行描述。 - - - -#### modeling/Modeling.js - -`Modeling` 继承 diagram-js 的 `BaseModeling`,本文件主要定义了 - -1. 创建连接时基于 `rules` 模块判断是否可以连接 - - ```js - if (!attrs) { - attrs = rules.canConnect(source, target); - } - - return this.createConnection(source, target, attrs, rootElement, hints); - ``` - -2. 定义实用方法 `Modeling#updateProperties`,用于更新元素属性,实现了属性更新和撤回的逻辑,分别位于 `UpdatePropertiesHandler#execute` 和 `UpdatePropertiesHandler#revert` 中。 - - - -#### modeling/SagaFactory.js - -`SagaFacotry` 作为 Saga 规范的工厂类,其主要的方法是 - -```js -SagaFactory.prototype.create = function (type) { - const Spec = this.typeToSpec.get(type); - return new Spec(); -}; -``` - -传入字符串类型的元素类型,`SagaFactory` 获取类型对应的 `Spec` 并创建新对象进行返回。关于 `Spec` 请参考前文 [spec](#spec) 章节。 - - - -#### modeling/ElementFacotry.js - -`ElementFactory` 本身是 diagram-js 提供的核心模块之一,这里我们使用继承的方式对其进行扩展。主要重载了 `ElementFactory#create` 方法,使用 `SagaFactory` 创建业务对象保存在元素的 `businessObject` 字段中 - -```js -ElementFactory.prototype.create = function (elementType, attrs) { - const { sagaFactory } = this; - - attrs = attrs || {}; - - let { businessObject } = attrs; - - if (!businessObject) { - if (!attrs.type) { - throw new Error('no shape type specified'); - } - - businessObject = sagaFactory.create(attrs.type); - } - - const size = sagaFactory.getDefaultSize(businessObject); - - attrs = assign({ businessObject }, size, attrs); - - return this.baseCreate(elementType, attrs); -}; -``` - - - -#### modeling/SagaRules.js - -`SagaRules` 继承了 diagram-js 的 `RuleProvider` 类,旨在提供绘图的验证规则。比如说在 Saga 状态机中,一条边不能连向自身状态(否则会造成产生死循环),这里我们通过 `SagaRules#canConnect` 方法进行实现。 - - - -#### modeling/SagaImporter.js - -`SagaImporter` 的功能单一,聚焦于将 JSON 状态机定义导入到设计器中,核心的代码实现在于 `SagaImporter#import` 方法中,代码逻辑也不复杂, - -```js -try { - const root = this.sagaFactory.create('StateMachine'); - root.importJson(definitions); - this.root(root); - - // Add start state - const start = this.sagaFactory.create('StartState'); - start.importJson(definitions); - this.add(start); - - const edges = []; - forEach(definitions.States, (semantic) => { - const state = this.sagaFactory.create(semantic.Type); - state.importJson(semantic); - this.add(state); - if (semantic.edge) { - edges.push(...Object.values(semantic.edge)); - } - }); - - // Add start edge - if (definitions.edge) { - const startEdge = this.sagaFactory.create('Transition'); - startEdge.importJson(definitions.edge); - this.add(startEdge, { source: start }); - } - - forEach(edges, (semantic) => { - const transition = this.sagaFactory.create(semantic.Type); - transition.importJson(semantic); - this.add(transition); - }); -``` - -首先根据状态机 StateMachine 自身定义创建根元素,然后再基于 StateMachine 的 style 属性创建出一个起始元素“伪状态”,随后遍历 `States` 字段,创建出每个状态并收集边集 `edges` 。对于边的创建,需要从“伪状态”加一条边到 `StartState`,此后再根据 `edges` 依次创建即可。 - - - -#### modeling/SagaExporter.js - -`SagaExporter` 和 `SagaImporter` 的功能相反,是根据绘图导出为 JSON 文件定义。这里需要注意的是 `SagaExporter` 和 `SagaImporter` 的实现上可以相互对照,基本上互为彼此的逆操作。 - - - -### render - -render 模块,顾名思义就是渲染的核心模块,负责将状态机以 SVG 矢量图的形式呈现给用户。 - - - -#### render/Renderer.js - -`Renderer` 是所有元素的绘图入口,对于不同的元素类型我们使用 `handlers` 变量中定义的不同处理器进行绘图, - -```js -Transition(p, element) { - const fill = getFillColor(element, defaultFillColor); - const stroke = getStrokeColor(element, defaultStrokeColor); - const attrs = { - stroke, - strokeWidth: 1, - strokeLinecap: 'round', - strokeLinejoin: 'round', - markerEnd: marker('connection-end', fill, stroke), - }; - - return drawLine(p, element.waypoints, attrs); -}, -``` - - - -#### render/TextRenderer.js - -为渲染文字单独抽象出来的实用类,后续应该不需要改动。 - - - -#### render/PathMap.js - -核心定义了一个 `pathMap` 用于记录不同的绘图元素的 SVG 路径,比如 - -```js -this.pathMap = { - TASK_TYPE_SERVICE: { - d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' - + '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' - + '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' - + 'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' - + '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' - + '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' - + 'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' - + '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' - + 'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' - + 'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' - + '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' - + 'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' - + 'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' - + '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' - + '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z', - }, - TASK_TYPE_SERVICE_FILL: { - d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' - + '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' - + '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z', - }, - MARKER_COMPENSATION: { - d: 'm {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z', - height: 10, - width: 21, - heightElements: [], - widthElements: [], - }, - MARKER_LOOP: { - d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' - + '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' - + '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' - + 'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902', - height: 13.9, - width: 13.7, - heightElements: [], - widthElements: [], - }, -}; -``` - -对于 Saga 状态机设计器而言,我们几乎所有的状态和元素绘图都可以参考 BPMN 规范的设计元素,所以可以直接参考使用 bpmn-js 的 [PathMap.js](https://github.com/bpmn-io/bpmn-js/blob/develop/lib/draw/PathMap.js) 文件即可。 - - - -### layout - -Layout 模块专注于布局变化。 - - - -#### layout/Layouter.js - -`Layouter` 继承自 diagram-js 的 `BaseLayouter` ,并在此基础上通过重载 `layoutConnection` 方法实现了连接线根据箭头朝向加入转折点的行为。 - -![waypoint](assets/waypoint.png) - - - -#### layout/behaviour/*.js - -在 layout/behaviour 文件夹中定义了一系列的行为用于在布局变动(比如添加新元素、连接,或者对现有图重布局等等)时对布局进行自动调整、逻辑适配。 - -##### layout/behaviour/LayoutConnectionBehaviour.js - -`LayoutConnectionBehaviour` 用于在布局变动时为边的连接点重新定位,如果不加入这个子模块,连接是这样的: - -![no-layout-connection](assets/no-layout-connection.png) - -加入这个子模块之后,无论在创建、移动边的时候指向哪里,最终的边都会指向元素中部位置,使得布局更清晰: - -![layout-connection](assets/layout-connection.png) - -这部分实现逻辑比较复杂和业务关系不大,主要实现在了 `LayoutConnectionBehaviour` 构造方法中,且附加上了代码注释。 - - - -##### layout/behaviour/ReplaceConnectionBehavior.js - -`ReplaceConnectionBehaviour` 用于配合 [rules](#modeling/SagaRules.js) 模块实现当连接更改连接点(即 `source` 或者 `target` )时验证是否可以进行连接,如可以再进行连接。 - - - -##### layout/behaviour/LayoutUpdateBehavior.js - -`LayoutUpdateBehavior` 用于在布局发生变化时为业务对象 `businessObject` 进行逻辑适配。目前主要是用于在布局变动时更新 `businessObject.style` 属性。 - - - -### properties-panel - -properties-panel 组件的开发基于 @bpmn-io/properties-panel 包,和 diagram-js 一样也是由 bpmn-io 组织开发,是一套属性面板基础组件。 - -属性面板目前类似于旧版设计器的实现,需要用户填写 JSON 来更新状态。 - -properties-panel - -在 properties-panel 根目录下的几个代码文件主要用于定义属性面板的样式,后续不太需要维护,这里简单介绍一下。 - -- `PropertiesPanelRenderer` 为属性面板的根元素,用于在页面上渲染出一个属性面板来 - -- `PropertiesPanel` 基于 diagram-js `PropertiesPanel` 的组件重新定制的组件,功能包含了向事件总线上注册一系列处理器,比如 selection 变化时更改属性面板的目标元素等等。 - -- `PropertiesPanelContext` 是一个 React Context,用于提供了一个在组件树间进行数据传递的方法。 - -- `PanelHeaderProvider` 用于定义属性面板头部显示内容 - - header - -- `PanelPlaceHolderProvider` 用于定义无元素选择时显示的内容 - - placeholder - -#### properties-panel/provider - -properties-panel 模块定义了属性面板,properties-panel/provider 模块则定义了为状态提供怎样的属性编辑。 - -provider - -##### properties-panel/provider/PropertiesProvider.js - -`PropertiesProvider` 该文件定义了针对不同的元素(状态或连接)应该展示怎样的属性编辑。 - -##### properties-panel/provider/properties - -目前支持的属性编辑都可以在 properties-panel/provider/properties 文件夹下找到,General 组提供了 `Name`, `Comment`, `Version` 的支持,JSON Props 组提供了 JSON 属性的编辑和 `style` 样式的展示。 - -比如说想要调整 `Name` 属性的编辑逻辑,则应该到 properties-panel/provider/properties/NameProps.js 文件中进行更改。 - - - -## Build - -项目基于 webpack 进行构建,构建文件 webpack.config.js 位于根目录下。使用 package.json 中定义的脚本可以完成构建、运行等操作。 - -``` -npm install -``` - -Bundle the editor contained in `src` and output it to `dist`: - -``` -npm run build -``` - -Start the development setup, opening the app and rebuild on changes: - -``` -npm run start -``` - - - diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/README.md b/laokou-cloud/laokou-seata-saga-statemachine-designer/README.md deleted file mode 100644 index d79cc0101a..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/README.md +++ /dev/null @@ -1,497 +0,0 @@ -# Seata Saga State Machine Designer - -Due to the discontinuation of maintenance for the old version of the Saga State Machine Designer's underlying framework, ggeditor, and the numerous vulnerabilities exposed by ggeditor, which affected the overall security of the project, we have chosen to refactor the State Machine Designer. We are using a new framework, diagram-js, as the foundation for building the new designer. This document covers aspects such as the usage guide for the diagram-js framework, the implementation approach of the designer, code structure, and more, aiming to provide a document that facilitates community collaboration. - -[TOC] - -## diagram-js - -[diagram-js](https://github.com/bpmn-io/diagram-js) is a framework developed and maintained by the bpmn.io organization for displaying and modifying process diagrams on web pages. It allows us to render visual elements and build interactive experiences on top of them. It provides a simple module system for building functionality and dependency injection for service discovery. The system also offers many core services that implement key points of a process diagram. Additionally, diagram-js defines the data model for graphical elements and their relationships. - -Well-known projects built on diagram-js include bpmn-js, dmn-js, and more. When implementing the Saga State Machine Designer, we referred to many implementations of [bpmn-js](https://github.com/bpmn-io/bpmn-js). On one hand, Seata Saga and BPMN specifications share many similarities, and we borrowed elements from BPMN. On the other hand, bpmn-js is implemented based on diagram-js, providing a template for implementing the Saga Designer. - -Below, I will summarize the overall architecture of diagram-js to help you quickly get started. - -### Diagram - -`Diagram` is the core class provided by diagram-js. If you want to mount a diagram in a canvas block on a page, you can use the following code: - -```js -const editor = new Diagram({ - container: document.querySelector('#canvas'), - keyboard: { bindTo: document }, -}); -``` - -### Hook into Lifecycle - -Diagram-js internally uses an event-driven architecture, allowing us to connect to the lifecycle and interactions of the `Diagram` through the event bus. The following code shows how to capture general changes to elements and modeling operations: - -```js -diagram.get('eventBus').on('commandStack.changed', () => { - // User modeled something or - // performed an undo/redo operation -}); - -modeler.on('element.changed', (event) => { - const element = event.element; - - // The element was changed by the user -}); -``` - -### Module System - -To register extensions with `Diagram`, you can pass them as an array to the `modules` option of the constructor. This allows custom modules to be passed that modify or replace existing functionality. - -```js -const diagram = new Diagram({ - container: document.querySelector('#canvas'), - keyboard: { bindTo: document }, - modules: [ - PropertiesPanel, - PropertiesProvider, - ], -}); -``` - -Modules in diagram-js define units that provide one or more named services. These services offer additional functionality by hooking into the lifecycle of the diagram. Under the hood, diagram-js uses Dependency Injection (DI) for connecting and discovering chart components, built on top of [didi](https://github.com/nikku/didi). The following example demonstrates a service implemented by [hooking into the lifecycle](#hook-into-lifecycle). - -```js -const MyLoggingPlugin = (eventBus) => { - eventBus.on('element.changed', (event) => { - console.log('element ', event.element, ' changed'); - }); -} - -// Ensure the dependency names are still available after minification -MyLoggingPlugin.$inject = [ 'eventBus' ]; -``` - -We must use a module definition to publish services with unique names: - -```js -import CoreModule from 'diagram-js/lib/core'; - -// Export as a module -export default { - __depends__: [ CoreModule ], // {2} - __init__: [ 'myLoggingPlugin' ], // {3} - myLoggingPlugin: [ 'type', MyLoggingPlugin ] // {1} -}; -``` - -This definition tells the DI infrastructure that the service is called `myLoggingPlugin` `{1}`, it depends on the diagram-js core module `{2}`, and the service should be initialized when the chart is created `{3}`. For more detailed information, refer to the [didi documentation](https://github.com/nikku/didi/blob/master/README.md). - -Now you can pass the created module to `Diagram`: - -```js -import MyLoggingModule from 'path-to-my-logging-module'; - -const diagram = new Diagram({ - modules: [ - MyLoggingModule - ] -}); -``` - -### Core Services - -[diagram-js core](https://github.com/bpmn-io/diagram-js/tree/master/lib/core) is built around many fundamental services: - -- [`Canvas`](https://github.com/bpmn-io/diagram-js/blob/master/lib/core/Canvas.js): Provides an API for adding and removing graphical elements; handles the lifecycle of elements and provides an API for zooming and scrolling. -- [`EventBus`](https://github.com/bpmn-io/diagram-js/blob/master/lib/core/EventBus.js): Global communication channel with a *fire and forget* policy. Interested parties can subscribe to various events and take action after the event is fired. The event bus helps decouple concerns and modularize functionality for easy integration of new features with existing behavior. -- [`ElementFactory`](https://github.com/bpmn-io/diagram-js/blob/master/lib/core/ElementFactory.js): Factory for creating shapes and connections based on the internal data model of diagram-js. -- [`ElementRegistry`](https://github.com/bpmn-io/diagram-js/blob/master/lib/core/ElementRegistry.js): Manages all elements added to the chart and provides an API to retrieve elements and their graphical representations by id. - -### Data Model - -At its core, diagram-js implements a simple data model consisting of `Shape` and `Connection`. `Shape` has a parent, a list of children, and lists of incoming and outgoing `Connections`. A `Connection` has a parent and source and target pointing to a `Shape`. - -[`ElementRegistry`](https://github.com/bpmn-io/diagram-js/blob/master/lib/core/ElementRegistry.js) is responsible for creating `Shape` and `Connection` based on the [model](https://github.com/bpmn-io/diagram-js/blob/master/lib/model/index.js). During modeling, the [Modeling](https://github.com/bpmn-io/diagram-js/blob/master/lib/features/modeling/Modeling.js) service updates element relationships based on user actions. - -### Auxiliary Services (Toolbox) - -In addition to the data model and its core services, diagram-js also provides a rich set of additional auxiliary toolbox services: - -- [`CommandStack`](https://github.com/bpmn-io/diagram-js/blob/master/lib/command/CommandStack.js): Responsible for redo and undo during modeling. -- [`ContextPad`](https://github.com/bpmn-io/diagram-js/blob/master/lib/features/context-pad/ContextPad.js): Provides context operations around elements. -- [`Overlays`](https://github.com/bpmn-io/diagram-js/blob/master/lib/features/overlays/Overlays.js): Provides an API for attaching additional information to chart elements. -- [`Modeling`](https://github.com/bpm - -n-io/diagram-js/blob/master/lib/features/modeling/Modeling.js): Provides an API for updating elements on the canvas (moving, deleting). -- [`Palette`](https://github.com/bpmn-io/diagram-js/blob/master/lib/features/palette/Palette.js) -- ... - -## In-Depth Analysis of Saga Designer - -### Code Entry - -#### Editor.js - -In this file, a class named `Editor` is defined, which inherits from the `Diagram` class of diagram-js. - -First, the required modules for `Editor` are defined. These modules can be categorized into two types: customized modules and built-in modules of diagram-js. - -```js -Editor.prototype.modules = [ - // Customized modules - Layout, - Modeling, - Providers, - Render, - - // Built-in modules - AlignElementsModule, - AutoScrollModule, - BendpointsModule, - // ... -]; -``` - -It's worth noting two methods of `Editor`: - -**`Editor#import`** - -Used to import a state machine defined in JSON into the `Editor`. The internal logic involves clearing all current elements in the diagram first and then calling the `import` method of the `sagaImporter` module. The `sagaImporter` is a submodule in the customized module `Modeling`, which will be introduced later. - -```js -Editor.prototype.import = function (definitions) { - this.clear(); - this.get('sagaImporter') - .import(definitions); -}; -``` - -**`Editor#export`** - -Used to export the current elements in the `Editor` to a JSON file. It calls the `export` method of the `sagaExporter` module. The `sagaExporter` is also a submodule in the customized module `Modeling`, which will be introduced later. - -```js -Editor.prototype.export = function () { - return this.get('sagaExporter') - .export(); -}; -``` - -In addition to these, `Editor` provides a series of utility methods for clearing all elements in the diagram (`clear`), detaching from the container (`detach`), and more. - -#### index.js - -Create a new `Editor` object and mount it to the `canvas` block. - -```js -const editor = new Editor({ - container: document.querySelector('#canvas'), - keyboard: { bindTo: document }, - propertiesPanel: { parent: '#properties' }, - // Add properties panel as additional modules - additionalModules: [ - PropertiesPanel, - PropertiesProvider, - ], -}); -``` - -It's worth noting that `PropertiesPanel` and `PropertiesProvider` are added as additional modules to `Editor` rather than directly in `Editor.prototype.modules`. This is done considering that the property panel is a pluggable module. If the designer is intended to be published as an npm package in the future, users can use `Editor` without bundling the property panel. - -After creating the `Editor` object, the following code: - -```js -control(editor); -``` - -is used to create control buttons on the canvas, allowing control over the import and export of files in the `Editor`. - -![control](assets/control.png) - -### Providers - -The providers folder is used to provide corresponding entries for the diagram-js toolbox (see the [Auxiliary Services (Toolbox)](#auxiliary-services-toolbox) section). - -#### providers/ContextPadProvider.js - -![ContextPad](assets/context-pad.png) - -ContextPad is a built-in auxiliary module in diagram-js, and providers can be defined to populate entries for it. The core implementation is in the `ContextPadProvider.prototype.getContextPadEntries` method. In the current designer, entries for connecting and deleting are provided for shapes, while only the delete entry is provided for edges (connecting edges to edges is not logical). - -#### providers/PaletteProvider.js - -palette - -Palette is a built-in left-side panel in diagram-js. The core implementation is in the `PaletteProvider.prototype.getPaletteEntries` method. Currently, it only implements entries for various states (ServiceTask, Fail, Success, three types of states, and a start node; more state types may be added later). In addition to various states, a lasso tool is provided at the top for batch selection of states for operations such as deletion or movement. - -### Spec - -The spec folder contains all the definitions for states, mainly specifying the default attributes when creating each state. It also defines some conversion logic for import and export using `importJson` and `exportJson`. The code files here are not expanded for discussion, and understanding can be gained by comparing the code with the class diagram below. - -```mermaid ---- -title: Spec Class Diagram ---- -classDiagram - BaseSpec <|-- StateMachine - - BaseSpec <|-- NodeStyle - BaseSpec <|-- Node - - Node <|-- StartState - Node <|-- State - - State <|-- TaskState - TaskState <|-- ServiceTask - TaskState <|-- ScriptTask - - BaseSpec <|-- EdgeStyle - BaseSpec <|-- Edge - - note for Transition "All edges' base class" - Edge <|-- Transition - Transition <|-- ChoiceEntry - Transition <|-- CatchEntry - - Node *-- NodeStyle - Edge *-- EdgeStyle - - BaseSpec : String Type - - class StateMachine { - String Name - String Comment - String Version - } - - NodeStyle : Object bounds - - class Node{ - NodeStyle style - } - - class EdgeStyle { - Object source - Object target - List waypoints - } - - class Edge{ - EdgeStyle style - } - - class State { - String Name - String Comment - } - - class TaskState { - List[Object] Input - Object Output - Object Status - List Retry - } - - class ServiceTask { - String ServiceName - String ServiceMethod - } -``` - -According to the diagram above, you can understand the class diagram related to the Spec classes, which has similarities with the Saga Java code definitions. The difference from Java code is that, since the designer needs to present the state machine as a graph to the user, states and connections need to be recorded through the `style` attribute. - -### Modeling Module Deep Dive - -The `modeling` module is the core logic of the Saga state machine designer, and it tightly integrates with the Saga specification. Let's explore each code file in this module. - -#### modeling/Modeling.js - -This file defines the `Modeling` class, which extends diagram-js's `BaseModeling`. The main functionalities include: - -1. Creating connections based on the `rules` module to determine if a connection is allowed. - - ```js - if (!attrs) { - attrs = rules.canConnect(source, target); - } - - return this.createConnection(source, target, attrs, rootElement, hints); - ``` - -2. Defining utility method `Modeling#updateProperties` for updating element properties. It implements the logic for property updates and undoing the updates, located in `UpdatePropertiesHandler#execute` and `UpdatePropertiesHandler#revert`, respectively. - -#### modeling/SagaFactory.js - -The `SagaFactory` acts as the factory class for Saga specifications. Its main method is: - -```js -SagaFactory.prototype.create = function (type) { - const Spec = this.typeToSpec.get(type); - return new Spec(); -}; -``` - -Given a string representing the element type, the `SagaFactory` retrieves the corresponding `Spec` and creates a new object. - -#### modeling/ElementFactory.js - -`ElementFactory` is an extension of the core module provided by diagram-js. It overrides the `ElementFactory#create` method, using `SagaFactory` to create a business object and save it in the element's `businessObject` field. - -```js -ElementFactory.prototype.create = function (elementType, attrs) { - const { sagaFactory } = this; - - attrs = attrs || {}; - - let { businessObject } = attrs; - - if (!businessObject) { - if (!attrs.type) { - throw new Error('no shape type specified'); - } - - businessObject = sagaFactory.create(attrs.type); - } - - const size = sagaFactory.getDefaultSize(businessObject); - - attrs = assign({ businessObject }, size, attrs); - - return this.baseCreate(elementType, attrs); -}; -``` - -#### modeling/SagaRules.js - -`SagaRules` extends diagram-js's `RuleProvider` class and aims to provide validation rules for drawing. For instance, in Saga state machines, a transition cannot connect to the same state (as it would create a deadlock). This is implemented in the `SagaRules#canConnect` method. - -#### modeling/SagaImporter.js - -The `SagaImporter` focuses on importing JSON state machine definitions into the designer. The core logic is in the `SagaImporter#import` method. The code logic involves creating the root element, creating a pseudo-state element, iterating over the states, and creating edges. - -#### modeling/SagaExporter.js - -`SagaExporter` and `SagaImporter` are counterparts, where `SagaExporter` exports the current state machine into a JSON file. It's essential to note that their implementations can be compared as inverse operations of each other. - -### render Module - -The `render` module is responsible for the core rendering of the state machine in SVG format. - -#### render/Renderer.js - -The `Renderer` serves as the entry point for drawing all elements. For different element types, it uses handlers defined in the `handlers` variable for rendering. - -```js -Transition(p, element) { - const fill = getFillColor(element, defaultFillColor); - const stroke = getStrokeColor(element, defaultStrokeColor); - const attrs = { - stroke, - strokeWidth: 1, - strokeLinecap: 'round', - strokeLinejoin: 'round', - markerEnd: marker('connection-end', fill, stroke), - }; - - return drawLine(p, element.waypoints, attrs); -}, -``` - -#### render/TextRenderer.js - -A utility class specifically abstracted for rendering text. It is not likely to require modifications in the future. - -#### render/PathMap.js - -This file defines a `pathMap` used to record SVG paths for different drawing elements. For the Saga state machine designer, almost all drawing elements can be referenced from the design elements in the BPMN specification. Therefore, you can directly use bpmn-js's [PathMap.js](https://github.com/bpmn-io/bpmn-js/blob/develop/lib/draw/PathMap.js) file. - -### layout Module - -The `layout` module focuses on layout changes. - -#### layout/Layouter.js - -`Layouter` extends diagram-js's `BaseLayouter` and, on top of that, implements the `layoutConnection` method to introduce bends in the connection lines based on the direction of the arrow. - -![waypoint](assets/waypoint.png) - -#### layout/behaviour/*.js - -In the `layout/behaviour` folder, a series of behaviors are defined to automatically adjust the layout and logic adaptation of the layout when layout changes occur (such as adding new elements, connections, or re-layouting the existing diagram). - -##### layout/behaviour/LayoutConnectionBehaviour.js - -`LayoutConnectionBehaviour` is used to reposition the connection points for edges when the layout changes. If this submodule is not added, connections look like this: - -![no-layout-connection](assets/no-layout-connection.png) - -After adding this submodule, regardless of where the edge points during creation or movement, the final edge will point to the middle of the element, making the layout clearer: - -![layout-connection](assets/layout-connection.png) - -The implementation logic for this part is relatively complex and not directly related to business relationships, mainly implemented in the constructor of `LayoutConnectionBehaviour`, accompanied by code comments. - -##### layout/behaviour/ReplaceConnectionBehavior.js - -`ReplaceConnectionBehaviour` works in conjunction with the [rules](#modeling/SagaRules.js) module to validate whether a connection can be made when changing connection points (`source` or `target`). - -##### layout/behaviour/LayoutUpdateBehavior.js - -`LayoutUpdateBehavior` is used to logically adapt the business object `businessObject` when the layout changes. Currently, it is mainly used to update the `businessObject.style` attribute when the layout changes. - -### properties-panel - -The development of the `properties-panel` component is based on the `@bpmn-io/properties-panel` package, similar to `diagram-js`, and is also developed by the bpmn-io organization. It is a set of basic components for property panels. - -The property panel currently resembles the implementation of the old version of the designer, requiring users to fill in JSON to update the state. - -![properties-panel](assets/properties-panel.png) - -The several code files in the root directory of `properties-panel` are mainly used to define the styles of the property panel. They are not likely to require much maintenance in the future. Here is a brief introduction: - -- `PropertiesPanelRenderer` is the root element of the property panel, used to render a property panel on the page. - -- `PropertiesPanel` is a component based on `PropertiesPanel` from diagram-js, and it is a customized component. Its functionality includes registering a series of handlers on the event bus, such as changing the target element of the property panel when the selection changes. - -- `PropertiesPanelContext` is a React Context used to provide a method for data transmission between components in the component tree. - -- `PanelHeaderProvider` is used to define the content displayed in the header of the property panel. - - ![header](assets/header.png) - -- `PanelPlaceHolderProvider` is used to define the content displayed when no element is selected. - - ![placeholder](assets/placeholder.png) - -#### properties-panel/provider - -The `properties-panel` module defines the property panel, and the `properties-panel/provider` module defines how properties are provided for states. - -![provider](assets/provider.png) - -##### properties-panel/provider/PropertiesProvider.js - -`PropertiesProvider` defines how different elements (states or connections) should display property editors. - -##### properties-panel/provider/properties - -Currently supported property editors can be found in the `properties-panel/provider/properties` folder. The General group provides support for `Name`, `Comment`, and `Version`. The JSON Props group provides editing for JSON properties and displays for the `style` attribute. - -For example, if you want to adjust the editing logic for the `Name` property, you should make changes in the `properties-panel/provider/properties/NameProps.js` file. - -## Build - -The project is built using webpack, and the webpack configuration file `webpack.config.js` is located in the root directory. The scripts defined in the `package.json` can be used to perform build, run, and other operations. - -```bash -npm install -``` - -Bundle the editor contained in `src` and output it to `dist`: - -```bash -npm run build -``` - -Start the development setup, opening the app, and rebuilding on changes: - -```bash -npm run start -``` diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/context-pad.png b/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/context-pad.png deleted file mode 100644 index 7d0b9870f5..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/context-pad.png and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/control.png b/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/control.png deleted file mode 100644 index b77993f08f..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/control.png and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/header.png b/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/header.png deleted file mode 100644 index 424064852d..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/header.png and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/layout-connection.png b/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/layout-connection.png deleted file mode 100644 index b0350e1282..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/layout-connection.png and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/no-layout-connection.png b/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/no-layout-connection.png deleted file mode 100644 index b8dd9b1709..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/no-layout-connection.png and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/palette.png b/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/palette.png deleted file mode 100644 index d645b77c0a..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/palette.png and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/placeholder.png b/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/placeholder.png deleted file mode 100644 index d180d9211e..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/placeholder.png and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/properties-panel.png b/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/properties-panel.png deleted file mode 100644 index 2012b8fc65..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/properties-panel.png and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/provider.png b/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/provider.png deleted file mode 100644 index 83c4beb6c6..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/provider.png and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/waypoint.png b/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/waypoint.png deleted file mode 100644 index e184f21904..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/assets/waypoint.png and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/package-lock.json b/laokou-cloud/laokou-seata-saga-statemachine-designer/package-lock.json deleted file mode 100644 index 662ec8998f..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/package-lock.json +++ /dev/null @@ -1,17651 +0,0 @@ -{ - "name": "seata-saga-statemachine-designer", - "version": "3.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "seata-saga-statemachine-designer", - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@bpmn-io/properties-panel": "^3.8.0", - "bpmn-font": "^0.12.1", - "diagram-js": "^14.0.0", - "diagram-js-grid": "^1.0.0", - "inherits-browser": "^0.1.0", - "min-dash": "^4.1.1", - "min-dom": "^5.0.0", - "tiny-svg": "^4.0.0" - }, - "devDependencies": { - "@babel/core": "^7.23.0", - "@babel/eslint-parser": "^7.22.15", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-runtime": "^7.22.15", - "@babel/preset-env": "^7.22.20", - "@babel/preset-react": "^7.22.15", - "babel-loader": "^9.1.3", - "babel-plugin-module-resolver": "^5.0.0", - "copy-webpack-plugin": "^12.0.0", - "css-loader": "^7.0.0", - "eslint": "^9.0.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "html-webpack-plugin": "^5.5.3", - "mini-css-extract-plugin": "^2.7.6", - "npm-run-all2": "^6.0.0", - "webpack": "^5.1.0", - "webpack-cli": "^5.0.0", - "webpack-dev-server": "^5.0.0" - }, - "peerDependencies": { - "react": "^16.3.0 || ^18.0.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", - "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", - "dev": true, - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", - "dev": true, - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", - "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", - "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-react-display-name": "^7.24.1", - "@babel/plugin-transform-react-jsx": "^7.23.4", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bpmn-io/cm-theme": { - "version": "0.1.0-alpha.2", - "resolved": "https://registry.npmjs.org/@bpmn-io/cm-theme/-/cm-theme-0.1.0-alpha.2.tgz", - "integrity": "sha512-ZILgiYzxk3KMvxplUXmdRFQo45/JehDPg5k9tWfehmzUOSE13ssyLPil8uCloMQnb3yyzyOWTjb/wzKXTHlFQw==", - "dependencies": { - "@codemirror/language": "^6.3.1", - "@codemirror/view": "^6.5.1", - "@lezer/highlight": "^1.1.4" - }, - "workspaces": { - "packages": [ - "preview-themes" - ] - } - }, - "node_modules/@bpmn-io/diagram-js-ui": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bpmn-io/diagram-js-ui/-/diagram-js-ui-0.2.3.tgz", - "integrity": "sha512-OGyjZKvGK8tHSZ0l7RfeKhilGoOGtFDcoqSGYkX0uhFlo99OVZ9Jn1K7TJGzcE9BdKwvA5Y5kGqHEhdTxHvFfw==", - "dependencies": { - "htm": "^3.1.1", - "preact": "^10.11.2" - } - }, - "node_modules/@bpmn-io/feel-editor": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@bpmn-io/feel-editor/-/feel-editor-1.2.0.tgz", - "integrity": "sha512-402yrNL+a58d9AiNE48IScTiWDGmB+8Fpiq9eqg/sKCzhdHahl5fZyl+cksfcyJjzJF1byUOhYy3UxL3/tbLmQ==", - "dependencies": { - "@bpmn-io/feel-lint": "^1.2.0", - "@codemirror/autocomplete": "^6.12.0", - "@codemirror/commands": "^6.3.3", - "@codemirror/language": "^6.10.0", - "@codemirror/lint": "^6.4.2", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.23.0", - "@lezer/highlight": "^1.2.0", - "lang-feel": "^2.0.0", - "min-dom": "^4.1.0" - }, - "engines": { - "node": ">= 16" - } - }, - "node_modules/@bpmn-io/feel-editor/node_modules/min-dom": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-4.1.0.tgz", - "integrity": "sha512-1lj1EyoSwY/UmTeT/hhPiZTsq+vK9D+8FAJ/53iK5jT1otkG9rJTixSKdjmTieEvdfES+sKbbTptzaQJhnacjA==", - "dependencies": { - "component-event": "^0.2.1", - "domify": "^1.4.1", - "min-dash": "^4.0.0" - } - }, - "node_modules/@bpmn-io/feel-lint": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@bpmn-io/feel-lint/-/feel-lint-1.2.0.tgz", - "integrity": "sha512-nsvAYxiSbWyjpd3gNnJd+60aTWrZvngYnZfe+GpmkM/pQoOgtF17GhD/p4fgaeAd/uUP3q9sO6EWRX+OU/p9dw==", - "dependencies": { - "@codemirror/language": "^6.8.0", - "lezer-feel": "^1.2.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@bpmn-io/properties-panel": { - "version": "3.18.1", - "resolved": "https://registry.npmjs.org/@bpmn-io/properties-panel/-/properties-panel-3.18.1.tgz", - "integrity": "sha512-ygBhVH99IFG1VbMlbvInXQUeqHwQH4uaajFaUi3OsjELpM1WcmHQ72fXPd1tC/OtJJhZoQajHiTI8SdL38t9ug==", - "dependencies": { - "@bpmn-io/feel-editor": "^1.2.0", - "@codemirror/view": "^6.14.0", - "classnames": "^2.3.1", - "feelers": "^1.3.0", - "focus-trap": "^7.5.2", - "min-dash": "^4.1.1", - "min-dom": "^4.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@bpmn-io/properties-panel/node_modules/min-dom": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-4.1.0.tgz", - "integrity": "sha512-1lj1EyoSwY/UmTeT/hhPiZTsq+vK9D+8FAJ/53iK5jT1otkG9rJTixSKdjmTieEvdfES+sKbbTptzaQJhnacjA==", - "dependencies": { - "component-event": "^0.2.1", - "domify": "^1.4.1", - "min-dash": "^4.0.0" - } - }, - "node_modules/@codemirror/autocomplete": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.12.0.tgz", - "integrity": "sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - }, - "peerDependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@codemirror/commands": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.3.3.tgz", - "integrity": "sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.1.0" - } - }, - "node_modules/@codemirror/language": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.0.tgz", - "integrity": "sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.23.0", - "@lezer/common": "^1.1.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0", - "style-mod": "^4.0.0" - } - }, - "node_modules/@codemirror/lint": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.4.2.tgz", - "integrity": "sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/state": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.0.tgz", - "integrity": "sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==" - }, - "node_modules/@codemirror/view": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.23.0.tgz", - "integrity": "sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ==", - "dependencies": { - "@codemirror/state": "^6.4.0", - "style-mod": "^4.1.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", - "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@eslint/eslintrc/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/@eslint/js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.0.0.tgz", - "integrity": "sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.12.3.tgz", - "integrity": "sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/config-array/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/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "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.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "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==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "node_modules/@lezer/common": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", - "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==" - }, - "node_modules/@lezer/highlight": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz", - "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/lr": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.0.tgz", - "integrity": "sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/markdown": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.2.0.tgz", - "integrity": "sha512-d7MwsfAukZJo1GpPrcPGa3MxaFFOqNp0gbqF+3F7pTeNDOgeJN1muXzx1XXDPt+Ac+/voCzsH7qXqnn+xReG/g==", - "dependencies": { - "@lezer/common": "^1.0.0", - "@lezer/highlight": "^1.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "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/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.56.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", - "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", - "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", - "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-module-resolver": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.0.tgz", - "integrity": "sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q==", - "dev": true, - "dependencies": { - "find-babel-config": "^2.0.0", - "glob": "^8.0.3", - "pkg-up": "^3.1.0", - "reselect": "^4.1.7", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">= 16" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "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/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/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/body-parser/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/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "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==", - "dev": true - }, - "node_modules/bpmn-font": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/bpmn-font/-/bpmn-font-0.12.1.tgz", - "integrity": "sha512-quQ47cFuFSZw3y5ta4J2eg+g/UG38pN9Uk8QzR988RyjFP7agdgwmVXPErCGqaFm4UyTTNGtx9jCFdcxw990vg==" - }, - "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/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.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "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.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001599", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", - "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", - "dev": true, - "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": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "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" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "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/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "node_modules/component-event": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/component-event/-/component-event-0.2.1.tgz", - "integrity": "sha512-wGA++isMqiDq1jPYeyv2as/Bt/u+3iLW0rEa+8NQ82jAv3TgqMiCM+B2SaBdn2DfLilLjjq736YcezihRYhfxw==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/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/compression/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/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "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/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", - "dev": true, - "dependencies": { - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.1", - "globby": "^14.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", - "dev": true, - "dependencies": { - "browserslist": "^4.23.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.0.0.tgz", - "integrity": "sha512-WrO4FVoamxt5zY9CauZjoJgXRi/LZKIk+Ta7YvpSGr5r/eMYPNp5/T9ODlMe4/1rF5DYlycG1avhV4g3A/tiAw==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "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==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "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/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/diagram-js": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/diagram-js/-/diagram-js-14.3.1.tgz", - "integrity": "sha512-QXwH2kdlTP8cfWDCfYnnhvJ9PXX8UQ/M8TJaeLfcIjJPBOrfSEfLI/wuI7VNtAZZ9munlcGmCnh8hEBtcjB8kA==", - "dependencies": { - "@bpmn-io/diagram-js-ui": "^0.2.3", - "clsx": "^2.1.0", - "didi": "^10.2.2", - "inherits-browser": "^0.1.0", - "min-dash": "^4.1.0", - "min-dom": "^4.1.0", - "object-refs": "^0.4.0", - "path-intersection": "^3.0.0", - "tiny-svg": "^3.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/diagram-js-grid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/diagram-js-grid/-/diagram-js-grid-1.0.0.tgz", - "integrity": "sha512-h3fCeoRnjNXaa4DW2upsKZv4xZvrI29zdSQwYb//nngNpAl1BgxTTI3Wb++AFmDFi1RydVH+TzRmpWvVyl4u8Q==", - "dependencies": { - "min-dash": "^4.1.1", - "tiny-svg": "^3.0.1" - } - }, - "node_modules/diagram-js-grid/node_modules/tiny-svg": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-3.0.1.tgz", - "integrity": "sha512-P8T4iwiW1t95vpHVHqrD36Brn7TqFYCPSHIWk9WLJtYK1X4aDd+5cgqcAADIWSjf1/i5idKnpCh9mim8hEdRBg==" - }, - "node_modules/diagram-js/node_modules/min-dom": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-4.1.0.tgz", - "integrity": "sha512-1lj1EyoSwY/UmTeT/hhPiZTsq+vK9D+8FAJ/53iK5jT1otkG9rJTixSKdjmTieEvdfES+sKbbTptzaQJhnacjA==", - "dependencies": { - "component-event": "^0.2.1", - "domify": "^1.4.1", - "min-dash": "^4.0.0" - } - }, - "node_modules/diagram-js/node_modules/tiny-svg": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-3.0.1.tgz", - "integrity": "sha512-P8T4iwiW1t95vpHVHqrD36Brn7TqFYCPSHIWk9WLJtYK1X4aDd+5cgqcAADIWSjf1/i5idKnpCh9mim8hEdRBg==" - }, - "node_modules/didi": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/didi/-/didi-10.2.2.tgz", - "integrity": "sha512-l8NYkYFXV1izHI65EyT8EXOjUZtKmQkHLTT89cSP7HU5J/G7AOj0dXKtLc04EXYlga99PBY18IPjOeZ+c3DI4w==", - "engines": { - "node": ">= 16" - } - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "dependencies": { - "utila": "~0.4" - } - }, - "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==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "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 - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/domify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/domify/-/domify-1.4.2.tgz", - "integrity": "sha512-m4yreHcUWHBncGVV7U+yQzc12vIlq0jMrtHZ5mW6dQMiL/7skSYNVX9wqKwOtyO9SGCgevrAFEgOCAHmamHTUA==" - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.710", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.710.tgz", - "integrity": "sha512-w+9yAVHoHhysCa+gln7AzbO9CdjFcL/wN/5dd+XW/Msl2d/4+WisEaCF1nty0xbAKaxdaJfgLB2296U7zZB7BA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "node_modules/envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.1", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", - "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", - "dev": true, - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.4", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "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==", - "dev": true - }, - "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/eslint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.0.0.tgz", - "integrity": "sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^3.0.2", - "@eslint/js": "9.0.0", - "@humanwhocodes/config-array": "^0.12.3", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.1", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.0.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", - "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", - "dev": true, - "dependencies": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" - }, - "engines": { - "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0" - } - }, - "node_modules/eslint-config-airbnb/node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-jsx-a11y/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/eslint-plugin-jsx-a11y/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/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/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/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-plugin-react/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/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "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/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/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/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", - "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", - "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", - "dev": true, - "dependencies": { - "acorn": "^8.11.3", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/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/express/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/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "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/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/feelers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/feelers/-/feelers-1.3.0.tgz", - "integrity": "sha512-aldR3ybeQlXs1T+PqhKTLyaBJ1NP4bovDrQZzBZ9UUnN4HdEObQpWl9hsgyb8HKwojzRtBoq1BzmGIf07vuRCg==", - "dependencies": { - "@bpmn-io/cm-theme": "^0.1.0-alpha.2", - "@bpmn-io/feel-lint": "^1.2.0", - "@codemirror/autocomplete": "^6.10.1", - "@codemirror/commands": "^6.3.0", - "@codemirror/language": "^6.9.1", - "@codemirror/lint": "^6.4.2", - "@codemirror/state": "^6.3.0", - "@codemirror/view": "^6.21.3", - "@lezer/common": "^1.1.0", - "@lezer/highlight": "^1.1.6", - "@lezer/lr": "^1.3.13", - "@lezer/markdown": "^1.1.0", - "feelin": "^3.0.0", - "lezer-feel": "^1.2.4", - "min-dom": "^4.1.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/feelers/node_modules/min-dom": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-4.1.0.tgz", - "integrity": "sha512-1lj1EyoSwY/UmTeT/hhPiZTsq+vK9D+8FAJ/53iK5jT1otkG9rJTixSKdjmTieEvdfES+sKbbTptzaQJhnacjA==", - "dependencies": { - "component-event": "^0.2.1", - "domify": "^1.4.1", - "min-dash": "^4.0.0" - } - }, - "node_modules/feelin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/feelin/-/feelin-3.0.1.tgz", - "integrity": "sha512-aYXH3UYkM2eopg3scgNRNEo/ecwizKH6qTqkEu5nSLMMlMgfhLDhWrLl7ChG5iHspO9o4Q2YSP1o4wW8q0L2Qw==", - "dependencies": { - "@lezer/lr": "^1.3.9", - "lezer-feel": "^1.2.5", - "luxon": "^3.1.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "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/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/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/finalhandler/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/find-babel-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.0.0.tgz", - "integrity": "sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw==", - "dev": true, - "dependencies": { - "json5": "^2.1.1", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/find-babel-config/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/focus-trap": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", - "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", - "dependencies": { - "tabbable": "^6.2.0" - } - }, - "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==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "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/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", - "dev": true, - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - } - }, - "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/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/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/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/htm": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", - "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==" - }, - "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "dev": true - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", - "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "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/inherits-browser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/inherits-browser/-/inherits-browser-0.1.0.tgz", - "integrity": "sha512-CJHHvW3jQ6q7lzsXPpapLdMx5hDpSF3FSh45pwsj6bKxJJ8Nl8v43i5yXnr3BdfOimGHKyniewQtnAIp3vyJJw==" - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - } - }, - "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-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-network-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.0.1.tgz", - "integrity": "sha512-OwQXkwBJeESyhFw+OumbJVD58BFBJJI5OM5S1+eyrDKlgDZPX2XNT5gXS56GSD3NPbbwUuMlR1Q71SRp5SobuQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "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/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "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/lang-feel": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lang-feel/-/lang-feel-2.0.0.tgz", - "integrity": "sha512-cMD6EIhb7vyXLs4kXmaphfZZNr5SkbRxmkfsZUjUJzOV5YxyKBF73VI/8fC3GDUifzs0lVo2DruVszk5igrddg==", - "dependencies": { - "@codemirror/autocomplete": "^6.9.1", - "@codemirror/language": "^6.9.1", - "@codemirror/state": "^6.2.1", - "@codemirror/view": "^6.21.0", - "@lezer/common": "^1.1.2", - "lezer-feel": "^1.2.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lezer-feel": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/lezer-feel/-/lezer-feel-1.2.6.tgz", - "integrity": "sha512-SkTqHThCVZYWhVXy6xh79ULDYPLcWMw0XNcY4ZIr+b5jXTsGDIMxNFZe7oNXNBBZizH045jG3vgfM6t/59pvcw==", - "dependencies": { - "@lezer/highlight": "^1.2.0", - "@lezer/lr": "^1.4.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/luxon": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", - "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.7.7.tgz", - "integrity": "sha512-x9qc6k88J/VVwnfTkJV8pRRswJ2156Rc4w5rciRqKceFDZ0y1MqsNL9pkg5sE0GOcDzZYbonreALhaHzg1siFw==", - "dev": true, - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "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/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-dash": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/min-dash/-/min-dash-4.2.1.tgz", - "integrity": "sha512-to+unsToePnm7cUeR9TrMzFlETHd/UXmU+ELTRfWZj5XGT41KF6X3L233o3E/GdEs3sk2Tbw/lOLD1avmWkg8A==" - }, - "node_modules/min-dom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-5.0.0.tgz", - "integrity": "sha512-eqZlSlxmCje0Q1B4sR2RUuh5DOE8FyYLPo35xuJabHBrlzEcG/DFg09TT2tIWRVB3w/6ZgCBkVIPpcOiD66BxQ==", - "dependencies": { - "domify": "^2.0.0", - "min-dash": "^4.2.1" - } - }, - "node_modules/min-dom/node_modules/domify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/domify/-/domify-2.0.0.tgz", - "integrity": "sha512-rmvrrmWQPD/X1A/nPBfIVg4r05792QdG9Z4Prk6oQG0F9zBMDkr0GKAdds1wjb2dq1rTz/ywc4ZxpZbgz0tttg==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", - "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", - "dev": true, - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "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/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-run-all2": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.1.2.tgz", - "integrity": "sha512-WwwnS8Ft+RpXve6T2EIEVpFLSqN+ORHRvgNk3H9N62SZXjmzKoRhMFg3I17TK3oMaAEr+XFbRirWS2Fn3BCPSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "cross-spawn": "^7.0.3", - "memorystream": "^0.3.1", - "minimatch": "^9.0.0", - "pidtree": "^0.6.0", - "read-package-json-fast": "^3.0.2", - "shell-quote": "^1.7.3" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "npm-run-all2": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0", - "npm": ">= 8" - } - }, - "node_modules/npm-run-all2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm-run-all2/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/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - } - }, - "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-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-refs": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-refs/-/object-refs-0.4.0.tgz", - "integrity": "sha512-6kJqKWryKZmtte6QYvouas0/EIJKPI1/MMIuRsiBlNuhIMfqYTggzX2F1AJ2+cDs288xyi9GL7FyasHINR98BQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/open": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/open/-/open-10.0.4.tgz", - "integrity": "sha512-oujJ/FFr7ra6/7gJuQ4ZJJ8Gf2VHM0J3J/W7IvH++zaqEzacWVxzK++NiVY5NLHTTj7u/jNH5H3Ei9biL31Lng==", - "dev": true, - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/p-retry": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", - "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/path-intersection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-intersection/-/path-intersection-3.0.0.tgz", - "integrity": "sha512-Rdnfb33F9+qadWe3ZyzDpw3KSXQhsK1MByL44QzSDIQtMAujd0zFx9f+kt4SaQp1JOoXl5pl5K28EoEuAEgarA==", - "engines": { - "node": ">= 14.20" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "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" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", - "dev": true, - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true - }, - "node_modules/preact": { - "version": "10.19.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz", - "integrity": "sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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 - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.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/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/reselect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", - "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "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/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - } - }, - "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 - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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 - }, - "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/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/send/node_modules/debug/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/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/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/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/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/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-mod": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.0.tgz", - "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "node_modules/tiny-svg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-4.0.0.tgz", - "integrity": "sha512-r5fvsVXJ6BvLzEmAVF3gJusimBveGJJ25rtwTxW9FqgGsEP/gYgiKzEEqekmm27gkW6BEp4rfruvhz9n+3CVSw==", - "engines": { - "node": ">= 16" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/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/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/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.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==", - "dev": true - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" - }, - "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/webpack": { - "version": "5.91.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", - "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", - "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", - "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.1.0", - "ws": "^8.16.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "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/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "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/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", - "dev": true, - "requires": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" - } - }, - "@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", - "dev": true - }, - "@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - } - }, - "@babel/eslint-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", - "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", - "dev": true, - "requires": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - } - }, - "@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", - "dev": true, - "requires": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, - "requires": { - "@babel/types": "^7.24.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - } - }, - "@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - } - }, - "@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", - "dev": true, - "requires": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - } - }, - "@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - } - }, - "@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "dev": true - }, - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", - "dev": true, - "requires": { - "@babel/plugin-transform-react-jsx": "^7.22.5" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", - "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", - "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-react-display-name": "^7.24.1", - "@babel/plugin-transform-react-jsx": "^7.23.4", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.24.1" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - } - }, - "@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@bpmn-io/cm-theme": { - "version": "0.1.0-alpha.2", - "resolved": "https://registry.npmjs.org/@bpmn-io/cm-theme/-/cm-theme-0.1.0-alpha.2.tgz", - "integrity": "sha512-ZILgiYzxk3KMvxplUXmdRFQo45/JehDPg5k9tWfehmzUOSE13ssyLPil8uCloMQnb3yyzyOWTjb/wzKXTHlFQw==", - "requires": { - "@codemirror/language": "^6.3.1", - "@codemirror/view": "^6.5.1", - "@lezer/highlight": "^1.1.4" - } - }, - "@bpmn-io/diagram-js-ui": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bpmn-io/diagram-js-ui/-/diagram-js-ui-0.2.3.tgz", - "integrity": "sha512-OGyjZKvGK8tHSZ0l7RfeKhilGoOGtFDcoqSGYkX0uhFlo99OVZ9Jn1K7TJGzcE9BdKwvA5Y5kGqHEhdTxHvFfw==", - "requires": { - "htm": "^3.1.1", - "preact": "^10.11.2" - } - }, - "@bpmn-io/feel-editor": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@bpmn-io/feel-editor/-/feel-editor-1.2.0.tgz", - "integrity": "sha512-402yrNL+a58d9AiNE48IScTiWDGmB+8Fpiq9eqg/sKCzhdHahl5fZyl+cksfcyJjzJF1byUOhYy3UxL3/tbLmQ==", - "requires": { - "@bpmn-io/feel-lint": "^1.2.0", - "@codemirror/autocomplete": "^6.12.0", - "@codemirror/commands": "^6.3.3", - "@codemirror/language": "^6.10.0", - "@codemirror/lint": "^6.4.2", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.23.0", - "@lezer/highlight": "^1.2.0", - "lang-feel": "^2.0.0", - "min-dom": "^4.1.0" - }, - "dependencies": { - "min-dom": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-4.1.0.tgz", - "integrity": "sha512-1lj1EyoSwY/UmTeT/hhPiZTsq+vK9D+8FAJ/53iK5jT1otkG9rJTixSKdjmTieEvdfES+sKbbTptzaQJhnacjA==", - "requires": { - "component-event": "^0.2.1", - "domify": "^1.4.1", - "min-dash": "^4.0.0" - } - } - } - }, - "@bpmn-io/feel-lint": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@bpmn-io/feel-lint/-/feel-lint-1.2.0.tgz", - "integrity": "sha512-nsvAYxiSbWyjpd3gNnJd+60aTWrZvngYnZfe+GpmkM/pQoOgtF17GhD/p4fgaeAd/uUP3q9sO6EWRX+OU/p9dw==", - "requires": { - "@codemirror/language": "^6.8.0", - "lezer-feel": "^1.2.3" - } - }, - "@bpmn-io/properties-panel": { - "version": "3.18.1", - "resolved": "https://registry.npmjs.org/@bpmn-io/properties-panel/-/properties-panel-3.18.1.tgz", - "integrity": "sha512-ygBhVH99IFG1VbMlbvInXQUeqHwQH4uaajFaUi3OsjELpM1WcmHQ72fXPd1tC/OtJJhZoQajHiTI8SdL38t9ug==", - "requires": { - "@bpmn-io/feel-editor": "^1.2.0", - "@codemirror/view": "^6.14.0", - "classnames": "^2.3.1", - "feelers": "^1.3.0", - "focus-trap": "^7.5.2", - "min-dash": "^4.1.1", - "min-dom": "^4.0.3" - }, - "dependencies": { - "min-dom": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-4.1.0.tgz", - "integrity": "sha512-1lj1EyoSwY/UmTeT/hhPiZTsq+vK9D+8FAJ/53iK5jT1otkG9rJTixSKdjmTieEvdfES+sKbbTptzaQJhnacjA==", - "requires": { - "component-event": "^0.2.1", - "domify": "^1.4.1", - "min-dash": "^4.0.0" - } - } - } - }, - "@codemirror/autocomplete": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.12.0.tgz", - "integrity": "sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==", - "requires": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - } - }, - "@codemirror/commands": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.3.3.tgz", - "integrity": "sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==", - "requires": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.1.0" - } - }, - "@codemirror/language": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.0.tgz", - "integrity": "sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==", - "requires": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.23.0", - "@lezer/common": "^1.1.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0", - "style-mod": "^4.0.0" - } - }, - "@codemirror/lint": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.4.2.tgz", - "integrity": "sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==", - "requires": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "@codemirror/state": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.0.tgz", - "integrity": "sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==" - }, - "@codemirror/view": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.23.0.tgz", - "integrity": "sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ==", - "requires": { - "@codemirror/state": "^6.4.0", - "style-mod": "^4.1.0", - "w3c-keyname": "^2.2.4" - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - } - } - }, - "@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", - "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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" - } - }, - "globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "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" - } - } - } - }, - "@eslint/js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.0.0.tgz", - "integrity": "sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.12.3.tgz", - "integrity": "sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "dependencies": { - "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" - } - }, - "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" - } - } - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@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.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@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==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "@lezer/common": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", - "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==" - }, - "@lezer/highlight": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz", - "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==", - "requires": { - "@lezer/common": "^1.0.0" - } - }, - "@lezer/lr": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.0.tgz", - "integrity": "sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==", - "requires": { - "@lezer/common": "^1.0.0" - } - }, - "@lezer/markdown": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.2.0.tgz", - "integrity": "sha512-d7MwsfAukZJo1GpPrcPGa3MxaFFOqNp0gbqF+3F7pTeNDOgeJN1muXzx1XXDPt+Ac+/voCzsH7qXqnn+xReG/g==", - "requires": { - "@lezer/common": "^1.0.0", - "@lezer/highlight": "^1.0.0" - } - }, - "@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "requires": { - "eslint-scope": "5.1.1" - } - }, - "@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" - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, - "@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true - }, - "@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.56.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", - "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "@types/node": { - "version": "20.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", - "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true - }, - "@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dev": true, - "requires": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "requires": {} - }, - "@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "requires": { - "dequal": "^2.0.3" - } - }, - "array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - } - }, - "array.prototype.findlast": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", - "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - } - }, - "ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, - "axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "dev": true - }, - "axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "requires": { - "dequal": "^2.0.3" - } - }, - "babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "requires": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - } - }, - "babel-plugin-module-resolver": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.0.tgz", - "integrity": "sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q==", - "dev": true, - "requires": { - "find-babel-config": "^2.0.0", - "glob": "^8.0.3", - "pkg-up": "^3.1.0", - "reselect": "^4.1.7", - "resolve": "^1.22.1" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", - "semver": "^6.3.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.1" - } - }, - "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 - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "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 - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "bpmn-font": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/bpmn-font/-/bpmn-font-0.12.1.tgz", - "integrity": "sha512-quQ47cFuFSZw3y5ta4J2eg+g/UG38pN9Uk8QzR988RyjFP7agdgwmVXPErCGqaFm4UyTTNGtx9jCFdcxw990vg==" - }, - "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" - } - }, - "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.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "requires": { - "run-applescript": "^7.0.0" - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "caniuse-lite": { - "version": "1.0.30001599", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", - "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "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" - } - } - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" - }, - "clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "component-event": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/component-event/-/component-event-0.2.1.tgz", - "integrity": "sha512-wGA++isMqiDq1jPYeyv2as/Bt/u+3iLW0rEa+8NQ82jAv3TgqMiCM+B2SaBdn2DfLilLjjq736YcezihRYhfxw==" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "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 - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", - "dev": true, - "requires": { - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.1", - "globby": "^14.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" - } - }, - "core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", - "dev": true, - "requires": { - "browserslist": "^4.23.0" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.0.0.tgz", - "integrity": "sha512-WrO4FVoamxt5zY9CauZjoJgXRi/LZKIk+Ta7YvpSGr5r/eMYPNp5/T9ODlMe4/1rF5DYlycG1avhV4g3A/tiAw==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.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==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "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" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "requires": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - } - }, - "default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "requires": { - "execa": "^5.0.0" - } - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "diagram-js": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/diagram-js/-/diagram-js-14.3.1.tgz", - "integrity": "sha512-QXwH2kdlTP8cfWDCfYnnhvJ9PXX8UQ/M8TJaeLfcIjJPBOrfSEfLI/wuI7VNtAZZ9munlcGmCnh8hEBtcjB8kA==", - "requires": { - "@bpmn-io/diagram-js-ui": "^0.2.3", - "clsx": "^2.1.0", - "didi": "^10.2.2", - "inherits-browser": "^0.1.0", - "min-dash": "^4.1.0", - "min-dom": "^4.1.0", - "object-refs": "^0.4.0", - "path-intersection": "^3.0.0", - "tiny-svg": "^3.0.1" - }, - "dependencies": { - "min-dom": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-4.1.0.tgz", - "integrity": "sha512-1lj1EyoSwY/UmTeT/hhPiZTsq+vK9D+8FAJ/53iK5jT1otkG9rJTixSKdjmTieEvdfES+sKbbTptzaQJhnacjA==", - "requires": { - "component-event": "^0.2.1", - "domify": "^1.4.1", - "min-dash": "^4.0.0" - } - }, - "tiny-svg": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-3.0.1.tgz", - "integrity": "sha512-P8T4iwiW1t95vpHVHqrD36Brn7TqFYCPSHIWk9WLJtYK1X4aDd+5cgqcAADIWSjf1/i5idKnpCh9mim8hEdRBg==" - } - } - }, - "diagram-js-grid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/diagram-js-grid/-/diagram-js-grid-1.0.0.tgz", - "integrity": "sha512-h3fCeoRnjNXaa4DW2upsKZv4xZvrI29zdSQwYb//nngNpAl1BgxTTI3Wb++AFmDFi1RydVH+TzRmpWvVyl4u8Q==", - "requires": { - "min-dash": "^4.1.1", - "tiny-svg": "^3.0.1" - }, - "dependencies": { - "tiny-svg": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-3.0.1.tgz", - "integrity": "sha512-P8T4iwiW1t95vpHVHqrD36Brn7TqFYCPSHIWk9WLJtYK1X4aDd+5cgqcAADIWSjf1/i5idKnpCh9mim8hEdRBg==" - } - } - }, - "didi": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/didi/-/didi-10.2.2.tgz", - "integrity": "sha512-l8NYkYFXV1izHI65EyT8EXOjUZtKmQkHLTT89cSP7HU5J/G7AOj0dXKtLc04EXYlga99PBY18IPjOeZ+c3DI4w==" - }, - "dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "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==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/domify/-/domify-1.4.2.tgz", - "integrity": "sha512-m4yreHcUWHBncGVV7U+yQzc12vIlq0jMrtHZ5mW6dQMiL/7skSYNVX9wqKwOtyO9SGCgevrAFEgOCAHmamHTUA==" - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.710", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.710.tgz", - "integrity": "sha512-w+9yAVHoHhysCa+gln7AzbO9CdjFcL/wN/5dd+XW/Msl2d/4+WisEaCF1nty0xbAKaxdaJfgLB2296U7zZB7BA==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", - "dev": true - }, - "es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.1", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" - } - }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true - }, - "es-iterator-helpers": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", - "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", - "dev": true, - "requires": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.4", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.0" - } - }, - "es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - } - }, - "es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "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==", - "dev": true - }, - "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 - }, - "eslint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.0.0.tgz", - "integrity": "sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^3.0.2", - "@eslint/js": "9.0.0", - "@humanwhocodes/config-array": "^0.12.3", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.1", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.0.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint-scope": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", - "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.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" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } - }, - "eslint-config-airbnb": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", - "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" - }, - "dependencies": { - "eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - } - } - } - }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "requires": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "dependencies": { - "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" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "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" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, - "dependencies": { - "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" - } - }, - "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" - } - } - } - }, - "eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", - "dev": true, - "requires": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" - }, - "dependencies": { - "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" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "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" - } - }, - "resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "peer": true, - "requires": {} - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", - "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", - "dev": true, - "requires": { - "acorn": "^8.11.3", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true - } - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "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" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "feelers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/feelers/-/feelers-1.3.0.tgz", - "integrity": "sha512-aldR3ybeQlXs1T+PqhKTLyaBJ1NP4bovDrQZzBZ9UUnN4HdEObQpWl9hsgyb8HKwojzRtBoq1BzmGIf07vuRCg==", - "requires": { - "@bpmn-io/cm-theme": "^0.1.0-alpha.2", - "@bpmn-io/feel-lint": "^1.2.0", - "@codemirror/autocomplete": "^6.10.1", - "@codemirror/commands": "^6.3.0", - "@codemirror/language": "^6.9.1", - "@codemirror/lint": "^6.4.2", - "@codemirror/state": "^6.3.0", - "@codemirror/view": "^6.21.3", - "@lezer/common": "^1.1.0", - "@lezer/highlight": "^1.1.6", - "@lezer/lr": "^1.3.13", - "@lezer/markdown": "^1.1.0", - "feelin": "^3.0.0", - "lezer-feel": "^1.2.4", - "min-dom": "^4.1.0" - }, - "dependencies": { - "min-dom": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-4.1.0.tgz", - "integrity": "sha512-1lj1EyoSwY/UmTeT/hhPiZTsq+vK9D+8FAJ/53iK5jT1otkG9rJTixSKdjmTieEvdfES+sKbbTptzaQJhnacjA==", - "requires": { - "component-event": "^0.2.1", - "domify": "^1.4.1", - "min-dash": "^4.0.0" - } - } - } - }, - "feelin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/feelin/-/feelin-3.0.1.tgz", - "integrity": "sha512-aYXH3UYkM2eopg3scgNRNEo/ecwizKH6qTqkEu5nSLMMlMgfhLDhWrLl7ChG5iHspO9o4Q2YSP1o4wW8q0L2Qw==", - "requires": { - "@lezer/lr": "^1.3.9", - "lezer-feel": "^1.2.5", - "luxon": "^3.1.0" - } - }, - "file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "requires": { - "flat-cache": "^4.0.0" - } - }, - "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" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "find-babel-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.0.0.tgz", - "integrity": "sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw==", - "dev": true, - "requires": { - "json5": "^2.1.1", - "path-exists": "^4.0.0" - }, - "dependencies": { - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "requires": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - } - }, - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - } - }, - "flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "focus-trap": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", - "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", - "requires": { - "tabbable": "^6.2.0" - } - }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - } - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "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.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.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" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", - "dev": true, - "requires": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.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 - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "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 - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "htm": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", - "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==" - }, - "html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "dev": true - }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - } - }, - "html-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", - "dev": true, - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - } - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "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 - }, - "inherits-browser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/inherits-browser/-/inherits-browser-0.1.0.tgz", - "integrity": "sha512-CJHHvW3jQ6q7lzsXPpapLdMx5hDpSF3FSh45pwsj6bKxJJ8Nl8v43i5yXnr3BdfOimGHKyniewQtnAIp3vyJJw==" - }, - "internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true - }, - "ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "dev": true - }, - "is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - } - }, - "is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "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-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "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-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "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-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "requires": { - "is-docker": "^3.0.0" - } - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true - }, - "is-network-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.0.1.tgz", - "integrity": "sha512-OwQXkwBJeESyhFw+OumbJVD58BFBJJI5OM5S1+eyrDKlgDZPX2XNT5gXS56GSD3NPbbwUuMlR1Q71SRp5SobuQ==", - "dev": true - }, - "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-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "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" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "requires": { - "which-typed-array": "^1.1.14" - } - }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "requires": { - "is-inside-container": "^1.0.0" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "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 - }, - "iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "requires": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - } - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "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 - }, - "lang-feel": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lang-feel/-/lang-feel-2.0.0.tgz", - "integrity": "sha512-cMD6EIhb7vyXLs4kXmaphfZZNr5SkbRxmkfsZUjUJzOV5YxyKBF73VI/8fC3GDUifzs0lVo2DruVszk5igrddg==", - "requires": { - "@codemirror/autocomplete": "^6.9.1", - "@codemirror/language": "^6.9.1", - "@codemirror/state": "^6.2.1", - "@codemirror/view": "^6.21.0", - "@lezer/common": "^1.1.2", - "lezer-feel": "^1.2.0" - } - }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "requires": { - "language-subtag-registry": "^0.3.20" - } - }, - "launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", - "dev": true, - "requires": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lezer-feel": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/lezer-feel/-/lezer-feel-1.2.6.tgz", - "integrity": "sha512-SkTqHThCVZYWhVXy6xh79ULDYPLcWMw0XNcY4ZIr+b5jXTsGDIMxNFZe7oNXNBBZizH045jG3vgfM6t/59pvcw==", - "requires": { - "@lezer/highlight": "^1.2.0", - "@lezer/lr": "^1.4.0" - } - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true - }, - "locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "requires": { - "p-locate": "^6.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "luxon": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", - "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "memfs": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.7.7.tgz", - "integrity": "sha512-x9qc6k88J/VVwnfTkJV8pRRswJ2156Rc4w5rciRqKceFDZ0y1MqsNL9pkg5sE0GOcDzZYbonreALhaHzg1siFw==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "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 - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-dash": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/min-dash/-/min-dash-4.2.1.tgz", - "integrity": "sha512-to+unsToePnm7cUeR9TrMzFlETHd/UXmU+ELTRfWZj5XGT41KF6X3L233o3E/GdEs3sk2Tbw/lOLD1avmWkg8A==" - }, - "min-dom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-5.0.0.tgz", - "integrity": "sha512-eqZlSlxmCje0Q1B4sR2RUuh5DOE8FyYLPo35xuJabHBrlzEcG/DFg09TT2tIWRVB3w/6ZgCBkVIPpcOiD66BxQ==", - "requires": { - "domify": "^2.0.0", - "min-dash": "^4.2.1" - }, - "dependencies": { - "domify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/domify/-/domify-2.0.0.tgz", - "integrity": "sha512-rmvrrmWQPD/X1A/nPBfIVg4r05792QdG9Z4Prk6oQG0F9zBMDkr0GKAdds1wjb2dq1rTz/ywc4ZxpZbgz0tttg==" - } - } - }, - "mini-css-extract-plugin": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", - "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", - "dev": true, - "requires": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - }, - "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 - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true - }, - "npm-run-all2": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.1.2.tgz", - "integrity": "sha512-WwwnS8Ft+RpXve6T2EIEVpFLSqN+ORHRvgNk3H9N62SZXjmzKoRhMFg3I17TK3oMaAEr+XFbRirWS2Fn3BCPSg==", - "dev": true, - "requires": { - "ansi-styles": "^6.2.1", - "cross-spawn": "^7.0.3", - "memorystream": "^0.3.1", - "minimatch": "^9.0.0", - "pidtree": "^0.6.0", - "read-package-json-fast": "^3.0.2", - "shell-quote": "^1.7.3" - }, - "dependencies": { - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "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" - } - } - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "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-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-refs": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-refs/-/object-refs-0.4.0.tgz", - "integrity": "sha512-6kJqKWryKZmtte6QYvouas0/EIJKPI1/MMIuRsiBlNuhIMfqYTggzX2F1AJ2+cDs288xyi9GL7FyasHINR98BQ==" - }, - "object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "requires": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "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" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/open/-/open-10.0.4.tgz", - "integrity": "sha512-oujJ/FFr7ra6/7gJuQ4ZJJ8Gf2VHM0J3J/W7IvH++zaqEzacWVxzK++NiVY5NLHTTj7u/jNH5H3Ei9biL31Lng==", - "dev": true, - "requires": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "requires": { - "p-limit": "^4.0.0" - } - }, - "p-retry": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", - "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", - "dev": true, - "requires": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true - }, - "path-intersection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-intersection/-/path-intersection-3.0.0.tgz", - "integrity": "sha512-Rdnfb33F9+qadWe3ZyzDpw3KSXQhsK1MByL44QzSDIQtMAujd0zFx9f+kt4SaQp1JOoXl5pl5K28EoEuAEgarA==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "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==", - "dev": true - }, - "path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", - "dev": true, - "requires": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true - } - } - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true - }, - "pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "requires": { - "find-up": "^6.3.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } - } - }, - "possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true - }, - "postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", - "dev": true, - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "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==", - "dev": true - }, - "preact": { - "version": "10.19.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz", - "integrity": "sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "requires": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } - } - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "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 - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - } - } - }, - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "dependencies": { - "json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", - "dev": true - } - } - }, - "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" - } - }, - "rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "requires": { - "resolve": "^1.20.0" - } - }, - "reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "requires": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true - }, - "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "reselect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", - "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", - "dev": true - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "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 - }, - "rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "requires": { - "glob": "^10.3.7" - }, - "dependencies": { - "glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" - } - }, - "minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true - }, - "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-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - } - }, - "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-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "requires": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.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" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "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 - } - } - }, - "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "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" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", - "dev": true, - "requires": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - } - }, - "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "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==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - } - } - }, - "string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "style-mod": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.0.tgz", - "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "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==", - "dev": true - }, - "tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "tiny-svg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-4.0.0.tgz", - "integrity": "sha512-r5fvsVXJ6BvLzEmAVF3gJusimBveGJJ25rtwTxW9FqgGsEP/gYgiKzEEqekmm27gkW6BEp4rfruvhz9n+3CVSw==" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "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" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - } - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "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 - }, - "w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" - }, - "watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webpack": { - "version": "5.91.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", - "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", - "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", - "dev": true, - "requires": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - } - }, - "webpack-dev-server": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", - "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", - "dev": true, - "requires": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.1.0", - "ws": "^8.16.0" - } - }, - "webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - } - }, - "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 - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "requires": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - } - }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" - } - }, - "wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "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 - }, - "ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, - "requires": {} - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true - } - } -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/package.json b/laokou-cloud/laokou-seata-saga-statemachine-designer/package.json deleted file mode 100644 index 57c902bfa5..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "seata-saga-statemachine-designer", - "version": "3.0.0", - "description": "A visual graph designer for Seata Saga StateMachine", - "scripts": { - "start": "webpack-dev-server --open --mode development", - "build": "webpack --mode production" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/apache/incubator-seata.git" - }, - "keywords": [ - "seata", - "saga", - "diagram-js" - ], - "author": { - "name": "Seata Community", - "email": "dev@seata.apache.org" - }, - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/apache/incubator-seata/issues" - }, - "homepage": "https://seata.apache.org/", - "peerDependencies": { - "react": "^16.3.0 || ^18.0.0" - }, - "dependencies": { - "@bpmn-io/properties-panel": "^3.8.0", - "bpmn-font": "^0.12.1", - "diagram-js": "^14.0.0", - "diagram-js-grid": "^1.0.0", - "inherits-browser": "^0.1.0", - "min-dash": "^4.1.1", - "min-dom": "^5.0.0", - "tiny-svg": "^4.0.0" - }, - "devDependencies": { - "@babel/core": "^7.23.0", - "@babel/eslint-parser": "^7.22.15", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-runtime": "^7.22.15", - "@babel/preset-env": "^7.22.20", - "@babel/preset-react": "^7.22.15", - "babel-loader": "^9.1.3", - "babel-plugin-module-resolver": "^5.0.0", - "copy-webpack-plugin": "^12.0.0", - "css-loader": "^7.0.0", - "eslint": "^9.0.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "html-webpack-plugin": "^5.5.3", - "mini-css-extract-plugin": "^2.7.6", - "npm-run-all2": "^6.0.0", - "webpack": "^5.1.0", - "webpack-cli": "^5.0.0", - "webpack-dev-server": "^5.0.0" - } -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/public/banner.png b/laokou-cloud/laokou-seata-saga-statemachine-designer/public/banner.png deleted file mode 100644 index c0e4590641..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/public/banner.png and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/public/favicon.ico b/laokou-cloud/laokou-seata-saga-statemachine-designer/public/favicon.ico deleted file mode 100644 index a11777cc47..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/public/favicon.ico and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/public/logo.jpeg b/laokou-cloud/laokou-seata-saga-statemachine-designer/public/logo.jpeg deleted file mode 100644 index 2cdb3f9b97..0000000000 Binary files a/laokou-cloud/laokou-seata-saga-statemachine-designer/public/logo.jpeg and /dev/null differ diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/public/robots.txt b/laokou-cloud/laokou-seata-saga-statemachine-designer/public/robots.txt deleted file mode 100644 index e9e57dc4d4..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/public/test.json b/laokou-cloud/laokou-seata-saga-statemachine-designer/public/test.json deleted file mode 100644 index e5344c938e..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/public/test.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "Name": "StateMachine", - "Comment": "This state machine is modeled by designer tools.", - "Version": "0.0.1", - "StartState": "ServiceTask-nrzlrnz", - "style": { - "bounds": { - "x": 200, - "y": 200, - "width": 36, - "height": 36 - } - }, - "edge": { - "style": { - "waypoints": [ - { - "original": { - "x": 236, - "y": 218 - }, - "x": 236, - "y": 218 - }, - { - "x": 290, - "y": 218 - }, - { - "original": { - "x": 310, - "y": 218 - }, - "x": 310, - "y": 218 - } - ], - "target": "ServiceTask-nrzlrnz" - }, - "type": "Transition" - }, - "States": { - "ServiceTask-nrzlrnz": { - "Type": "ServiceTask", - "Name": "ServiceTask-nrzlrnz", - "Input": [ - "$.[a]" - ], - "Output": { - "fooResult": "$.#root" - }, - "ServiceName": "DemoService", - "ServiceMethod": "foo", - "Next": "Succeed-pevcj3r", - "style": { - "bounds": { - "x": 310, - "y": 178, - "width": 100, - "height": 80 - } - }, - "edge": { - "Succeed-pevcj3r": { - "style": { - "waypoints": [ - { - "original": { - "x": 410, - "y": 218 - }, - "x": 410, - "y": 218 - }, - { - "x": 462, - "y": 218 - }, - { - "original": { - "x": 482, - "y": 218 - }, - "x": 482, - "y": 218 - } - ], - "source": "ServiceTask-nrzlrnz", - "target": "Succeed-pevcj3r" - }, - "type": "Transition" - } - } - }, - "Succeed-pevcj3r": { - "Type": "Succeed", - "Name": "Succeed-pevcj3r", - "style": { - "bounds": { - "x": 482, - "y": 200, - "width": 36, - "height": 36 - } - } - } - } -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/Editor.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/Editor.js deleted file mode 100644 index 2f1d153c87..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/Editor.js +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import inherits from 'inherits-browser'; -import { domify, query } from 'min-dom'; -import { innerSVG } from 'tiny-svg'; -import Diagram from 'diagram-js'; - -import AlignElementsModule from 'diagram-js/lib/features/align-elements'; -import AttachSupport from 'diagram-js/lib/features/attach-support'; -import AutoScrollModule from 'diagram-js/lib/features/auto-scroll'; -import BendpointsModule from 'diagram-js/lib/features/bendpoints'; -import ConnectModule from 'diagram-js/lib/features/connect'; -import ContextPadModule from 'diagram-js/lib/features/context-pad'; -import ConnectPreviewModule from 'diagram-js/lib/features/connection-preview'; -import CreateModule from 'diagram-js/lib/features/create'; -import EditorActionsModule from 'diagram-js/lib/features/editor-actions'; -import GridSnappingModule from 'diagram-js/lib/features/grid-snapping'; -import KeyboardModule from 'diagram-js/lib/features/keyboard'; -import KeyboardMoveModule from 'diagram-js/lib/navigation/keyboard-move'; -import KeyboardMoveSelectionModule from 'diagram-js/lib/features/keyboard-move-selection'; -import LassoToolModule from 'diagram-js/lib/features/lasso-tool'; -import MoveCanvasModule from 'diagram-js/lib/navigation/movecanvas'; -import MoveModule from 'diagram-js/lib/features/move'; -import OutlineModule from 'diagram-js/lib/features/outline'; -import PaletteModule from 'diagram-js/lib/features/palette'; -import ResizeModule from 'diagram-js/lib/features/resize'; -import RulesModule from 'diagram-js/lib/features/rules'; -import SelectionModule from 'diagram-js/lib/features/selection'; -import SnappingModule from 'diagram-js/lib/features/snapping'; -import ZoomScrollModule from 'diagram-js/lib/navigation/zoomscroll'; - -import GridModule from 'diagram-js-grid'; - -import Layout from './layout'; -import Modeling from './modeling'; -import Providers from './providers'; -import Render from './render'; - -import 'diagram-js/assets/diagram-js.css'; -import '@bpmn-io/properties-panel/assets/properties-panel.css'; -import 'bpmn-font/dist/css/bpmn.css'; -import './index.css'; - -/** - * Seata Saga Designer editor constructor - * - * @param { { container: Element, additionalModules?: Array } } options - * - * @return {Diagram} - */ -export default function Editor(options) { - this.container = this.createContainer(); - this.init(this.container, options); -} - -// Make Editor inherit from diagram-js/Diagram -inherits(Editor, Diagram); - -// Add modules for the Editor -Editor.prototype.modules = [ - // Customized modules - Layout, - Modeling, - Providers, - Render, - - // Built-in modules - AlignElementsModule, - AttachSupport, - AutoScrollModule, - BendpointsModule, - ConnectModule, - ConnectPreviewModule, - ContextPadModule, - CreateModule, - GridModule, - GridSnappingModule, - EditorActionsModule, - KeyboardModule, - KeyboardMoveModule, - KeyboardMoveSelectionModule, - LassoToolModule, - MoveCanvasModule, - MoveModule, - OutlineModule, - PaletteModule, - ResizeModule, - RulesModule, - SelectionModule, - SnappingModule, - ZoomScrollModule, -]; - -/** - * Create a container to mount - * @returns {HTMLElement} - */ -Editor.prototype.createContainer = function () { - return domify( - '
', - ); -}; - -/** - * A utility function to expose the event bus - */ -Editor.prototype.emit = function (type, event) { - return this.get('eventBus').fire(type, event); -}; - -/** - * Detach the editor from the actual container - */ -Editor.prototype.detach = function () { - const { container } = this; - const { parentNode } = container; - - if (!parentNode) { - return; - } - - this.emit('detach', {}); - - parentNode.removeChild(container); -}; - -/** - * Attach the editor to a specific container - */ -Editor.prototype.attachTo = function (parentNode) { - if (!parentNode) { - throw new Error('parentNode required'); - } - - // ensure we detach from the - // previous, old parent - this.detach(); - - parentNode.appendChild(this.container); - - this.emit('attach', {}); - - this.get('canvas').resized(); -}; - -/** - * Initialize the editor - */ -Editor.prototype.init = function (container, options) { - const { - additionalModules, - canvas, - ...additionalOptions - } = options; - - const baseModules = options.modules || this.modules; - - const modules = [ - ...baseModules, - ...(additionalModules || []), - ]; - - const diagramOptions = { - ...additionalOptions, - canvas: { - ...canvas, - container, - }, - modules, - }; - - // invoke diagram constructor - Diagram.call(this, diagramOptions); - - if (options && options.container) { - this.attachTo(options.container); - } - - this.get('eventBus').fire('editor.attached'); -}; - -/** - * Clear the editor, removing all contents. - */ -Editor.prototype.clear = function () { - Diagram.prototype.clear.call(this); -}; - -/** - * Import diagram from JSON definitions. - */ -Editor.prototype.import = function (definitions) { - this.clear(); - this.get('sagaImporter').import(definitions); -}; - -/** - * Export diagram to JSON definitions - */ -Editor.prototype.export = function () { - return this.get('sagaExporter').export(); -}; - -/** - * Export diagram to a SVG figure - */ -Editor.prototype.exportSvg = function () { - const eventBus = this.get('eventBus'); - eventBus.fire('saveSVG.start'); - - let svg; - let - err; - - try { - const canvas = this.get('canvas'); - - const contentNode = canvas.getActiveLayer(); - // eslint-disable-next-line no-underscore-dangle - const defsNode = query('defs', canvas._svg); - - const contents = innerSVG(contentNode); - const defs = defsNode ? `${innerSVG(defsNode)}` : ''; - - const bbox = contentNode.getBBox(); - - svg = '\n' - + '\n' - + '\n' - + '${ - defs}${contents - }`; - } catch (e) { - err = e; - } - - eventBus.fire('saveSVG.done', { - error: err, - svg, - }); - - if (err) { - throw err; - } - - return svg; -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/control/ExportControl.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/control/ExportControl.js deleted file mode 100644 index 25e2218665..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/control/ExportControl.js +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React from '@bpmn-io/properties-panel/preact/compat'; - -export default function ExportControl(props) { - const { editor } = props; - - function download(data, name, type) { - const a = document.createElement('a'); - - a.setAttribute( - 'href', - `data:text/${type};charset=UTF-8,${encodeURIComponent(data)}`, - ); - a.setAttribute('target', '_blank'); - a.setAttribute('dataTrack', `diagram:download-${type}`); - a.setAttribute('download', `${name}.${type}`); - - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - } - - return ( - - ); -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/control/ImportControl.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/control/ImportControl.js deleted file mode 100644 index 650b48ddae..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/control/ImportControl.js +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React from '@bpmn-io/properties-panel/preact/compat'; - -export default function ImportControl(props) { - const { editor } = props; - const inputRef = React.useRef(null); - - function onOpenFileChange(e) { - const localFile = e.target.files[0]; - if (localFile) { - const reader = new FileReader(); - let data = ''; - reader.readAsText(localFile); - reader.onload = (event) => { - data = JSON.parse(event.target.result); - editor.import(data); - }; - } - } - - return ( - - ); -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/control/index.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/control/index.js deleted file mode 100644 index 160326434a..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/control/index.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { domify } from 'min-dom'; -import React from '@bpmn-io/properties-panel/preact/compat'; -import ImportControl from './ImportControl'; -import ExportControl from './ExportControl'; - -export default function (editor) { - const container = domify('
'); - const canvas = editor.get('canvas'); - canvas._container.appendChild(container); - - React.render( -
- - -
, - container, - ); -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/index.css b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/index.css deleted file mode 100644 index d77041ef7d..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/index.css +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -body { - margin: 0 auto; -} - -.palette-icon-lasso-tool { - background: url('data:image/svg+xml,%3Csvg%0A%20%20%20%20%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20%0A%20%20%20%20%20fill%3D%22none%22%0A%20%20%20%20%20stroke%3D%22%23000%22%0A%20%20%20%20%20stroke-width%3D%221.5%22%0A%20%20%20%20%20width%3D%2246%22%0A%20%20%20%20%20height%3D%2246%22%3E%0A%20%20%3Crect%20x%3D%2210%22%20y%3D%2210%22%20width%3D%2216%22%20height%3D%2216%22%20stroke-dasharray%3D%225%2C%205%22%20%2F%3E%0A%20%20%3Cline%20x1%3D%2216%22%20y1%3D%2226%22%20x2%3D%2236%22%20y2%3D%2226%22%20stroke%3D%22black%22%20%2F%3E%0A%20%20%3Cline%20x1%3D%2226%22%20y1%3D%2216%22%20x2%3D%2226%22%20y2%3D%2236%22%20stroke%3D%22black%22%20%2F%3E%0A%3C%2Fsvg%3E'); -} - -.palette-icon-create-shape { - background: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.5%22%20width%3D%2246%22%20height%3D%2246%22%3E%3Crect%20x%3D%2210%22%20y%3D%2213%22%20width%3D%2226%22%20height%3D%2220%22%2F%3E%3C%2Fsvg%3E'); -} - -.palette-icon-create-frame { - background: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.5%22%20stroke-dasharray%3D%224%22%20width%3D%2246%22%20height%3D%2246%22%3E%3Crect%20x%3D%2210%22%20y%3D%2213%22%20width%3D%2226%22%20height%3D%2220%22%2F%3E%3C%2Fsvg%3E'); -} - -.context-pad-icon-remove { - background: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.5%22%20width%3D%2246%22%20height%3D%2246%22%3E%3Cline%20x1%3D%225%22%20y1%3D%225%22%20x2%3D%2215%22%20y2%3D%2215%22%2F%3E%3Cline%20x1%3D%2215%22%20y1%3D%225%22%20x2%3D%225%22%20y2%3D%2215%22%2F%3E%3C%2Fsvg%3E') !important; -} - -.context-pad-icon-connect { - background: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.5%22%20width%3D%2246%22%20height%3D%2246%22%3E%3Cline%20x1%3D%2215%22%20y1%3D%225%22%20x2%3D%225%22%20y2%3D%2215%22%2F%3E%3C%2Fsvg%3E') !important; -} - -.io-control { - background: #FAFAFA; - border-radius: 2px; - border: solid 1px #E0E0E0; - padding: 5px; -} - -.io-control-list { - display: inline-block; - list-style: none; - padding: 5px; - margin: 0 10px 0 0; -} - -.io-control-list li { - display: inline-block; -} - -.io-control-list li + li { - margin-left: 10px; -} - -.io-control-list button { - padding: 0; - outline: none; - cursor: pointer; - font-size: 22px; - line-height: 26px; - color: #555555; - background: none; - border: none; -} - -.io-control .vr { - height: 15px; - border-right: solid 1px #DDD; -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/index.html b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/index.html deleted file mode 100644 index c6808cdd5d..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/index.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - Seata Saga Designer - - - -
-
- -
-
-
- - - diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/index.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/index.js deleted file mode 100644 index 8bd1cefeb4..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/index.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import PropertiesPanel from './properties-panel'; -import PropertiesProvider from './properties-panel/provider'; -import Editor from './Editor'; -import control from './control'; -import { randomString } from './utils'; - -const editor = new Editor({ - container: document.querySelector('#canvas'), - keyboard: { bindTo: document }, - propertiesPanel: { parent: '#properties' }, - // Add properties panel as additional modules - additionalModules: [ - PropertiesPanel, - PropertiesProvider, - ], -}); - -control(editor); - -editor.import({ - Name: `StateMachine-${randomString()}`, - Comment: 'This state machine is modeled by designer tools.', - Version: '0.0.1', - style: { - bounds: { - x: 200, - y: 200, - width: 36, - height: 36, - }, - }, -}); diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/Layouter.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/Layouter.js deleted file mode 100644 index 1691d64086..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/Layouter.js +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import inherits from 'inherits-browser'; - -import BaseLayouter from 'diagram-js/lib/layout/BaseLayouter'; - -import { - getMid, getOrientation, -} from 'diagram-js/lib/layout/LayoutUtil'; - -import { assign } from 'min-dash'; - -const ADDITIONAL_WAYPOINT_DISTANCE = 20; - -export default function Layouter(connectionDocking) { - this.connectionDocking = connectionDocking; -} - -inherits(Layouter, BaseLayouter); - -Layouter.$inject = ['connectionDocking']; - -function getConnectionDocking(point, shape) { - return point ? (point.original || point) : getMid(shape); -} - -Layouter.prototype.layoutConnection = function (connection, hints) { - const { connectionDocking } = this; - - if (!hints) { - hints = {}; - } - - const source = hints.source || connection.source; - const target = hints.target || connection.target; - let waypoints = hints.waypoints || connection.waypoints || []; - let { connectionStart } = hints; - let { connectionEnd } = hints; - const orientation = getOrientation(source, target); - - if (!connectionStart) { - connectionStart = getConnectionDocking(waypoints[0], source); - } - - if (!connectionEnd) { - connectionEnd = getConnectionDocking(waypoints[waypoints.length - 1], target); - } - waypoints = [connectionStart, connectionEnd]; - - const croppedWaypoints = connectionDocking.getCroppedWaypoints( - assign({}, connection, { - waypoints, - }), - source, - target, - ); - - connectionEnd = croppedWaypoints.pop(); - - const additionalWaypoint = { - x: connectionEnd.x, - y: connectionEnd.y, - }; - - if (orientation.includes('bottom')) { - additionalWaypoint.y += ADDITIONAL_WAYPOINT_DISTANCE; - } else if (orientation.includes('top')) { - additionalWaypoint.y -= ADDITIONAL_WAYPOINT_DISTANCE; - } else if (orientation.includes('right')) { - additionalWaypoint.x += ADDITIONAL_WAYPOINT_DISTANCE; - } else { - additionalWaypoint.x -= ADDITIONAL_WAYPOINT_DISTANCE; - } - - waypoints = croppedWaypoints.concat([additionalWaypoint, connectionEnd]); - - return waypoints; -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/AttachCatchBehavior.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/AttachCatchBehavior.js deleted file mode 100644 index 4d28b44b22..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/AttachCatchBehavior.js +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import inherits from 'inherits-browser'; - -import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor'; -import { is } from '../../utils'; - -const LOW_PRIORITY = 500; - -function shouldUpdate(shape, host) { - return is(shape, 'Catch') && host; -} - -export default function AttachEventBehavior(injector) { - injector.invoke(CommandInterceptor, this); - this.postExecuted('element.updateAttachment', LOW_PRIORITY, ({ context }) => { - const { shape, oldHost, newHost } = context; - - if (shouldUpdate(shape, newHost)) { - delete oldHost?.businessObject.Catch; - newHost.businessObject.Catch = shape.businessObject; - } - }); -} - -inherits(AttachEventBehavior, CommandInterceptor); - -AttachEventBehavior.$inject = ['injector']; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/LayoutConnectionBehavior.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/LayoutConnectionBehavior.js deleted file mode 100644 index c792491411..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/LayoutConnectionBehavior.js +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import inherits from 'inherits-browser'; - -import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor'; - -import { - asTRBL, - getMid, - getOrientation, -} from 'diagram-js/lib/layout/LayoutUtil'; - -import { - assign, - forEach, -} from 'min-dash'; - -const LOW_PRIORITY = 500; - -// helpers ////////// - -function getConnectionHints(source, target, orientation) { - const connectionStart = getMid(source); - const connectionEnd = getMid(target); - - if (orientation.includes('bottom')) { - connectionStart.y = source.y; - connectionEnd.y = target.y + target.height; - } else if (orientation.includes('top')) { - connectionStart.y = source.y + source.height; - connectionEnd.y = target.y; - } else if (orientation.includes('right')) { - connectionStart.x = source.x; - connectionEnd.x = target.x + target.width; - } else { - connectionStart.x = source.x + source.width; - connectionEnd.x = target.x; - } - - return { - connectionStart, - connectionEnd, - }; -} - -/** - * Get connections start and end based on number of connections and - * orientation. - * - * @param {Array} connections - * @param {djs.model.Shape} target - * @param {string} orientation - * - * @returns {Array} - */ -function getConnectionsStartEnd(connections, target, orientation) { - return connections.map( - (connection, index) => { - const { source } = connection; - const sourceMid = getMid(source); - const sourceTrbl = asTRBL(source); - const targetTrbl = asTRBL(target); - - const { length } = connections; - - if (orientation.includes('bottom')) { - return { - start: { - x: sourceMid.x, - y: sourceTrbl.top, - }, - end: { - x: targetTrbl.left + (target.width / (length + 1)) * (index + 1), - y: targetTrbl.bottom, - }, - }; - } if (orientation.includes('top')) { - return { - start: { - x: sourceMid.x, - y: sourceTrbl.bottom, - }, - end: { - x: targetTrbl.left + (target.width / (length + 1)) * (index + 1), - y: targetTrbl.top, - }, - }; - } if (orientation.includes('right')) { - return { - start: { - x: sourceTrbl.left, - y: sourceMid.y, - }, - end: { - x: targetTrbl.right, - y: targetTrbl.top + (target.height / (length + 1)) * (index + 1), - }, - }; - } - return { - start: { - x: sourceTrbl.right, - y: sourceMid.y, - }, - end: { - x: targetTrbl.left, - y: targetTrbl.top + (target.height / (length + 1)) * (index + 1), - }, - }; - }, - ); -} - -/** - * Get connections by orientation. - * - * @param {djs.model.shape} target - * @param {Array} connections - * - * @returns {Object} - */ -function getConnectionByOrientation(target, connections) { - const incomingConnectionsByOrientation = {}; - - connections.forEach((incoming) => { - const orientation = getOrientation(incoming.source, target).split('-').shift(); - - if (!incomingConnectionsByOrientation[orientation]) { - incomingConnectionsByOrientation[orientation] = []; - } - - incomingConnectionsByOrientation[orientation].push(incoming); - }); - - return incomingConnectionsByOrientation; -} - -function isSameOrientation(orientationA, orientationB) { - return orientationA - && orientationB - && orientationA.split('-').shift() === orientationB.split('-').shift(); -} - -function sortConnections(connections, orientation) { - let axis; - - if (orientation.includes('top') || orientation.includes('bottom')) { - axis = 'x'; - } else { - axis = 'y'; - } - - return connections.sort((a, b) => { - return getMid(a.source)[axis] - getMid(b.source)[axis]; - }); -} - -export default function LayoutConnectionBehavior(injector, layouter, modeling) { - injector.invoke(CommandInterceptor, this); - - // specify connection start and end on connection create - this.preExecute([ - 'connection.create', - 'connection.reconnect', - ], (context) => { - const source = context.newSource || context.source; - const target = context.newTarget || context.target; - - const orientation = getOrientation(source, target); - - if (!context.hints) { - context.hints = {}; - } - - assign(context.hints, getConnectionHints(source, target, orientation)); - }, true); - - /** - * Update incoming connections. - * - * @param {djs.model.Shape} target - * @param {Array} [connection] - * @param {string} [orientation] - */ - function updateConnections(target, connection, orientation) { - // (1) get connection - if (!connection) { - connection = target.incoming; - } - - let incomingConnectionsByOrientation = {}; - - // (2) get connections per orientation - if (orientation) { - incomingConnectionsByOrientation[orientation] = connection; - } else { - incomingConnectionsByOrientation = getConnectionByOrientation(target, connection); - } - - // (3) update connections per orientation - forEach( - incomingConnectionsByOrientation, - (connections, ot) => { - // (3.1) sort connections - connections = sortConnections(connections, ot); - - // (3.2) get new connection start and end - const connectionStartEnd = getConnectionsStartEnd(connections, target, ot); - - // (3.3) update connections - connections.forEach((conn, index) => { - const connectionStart = connectionStartEnd[index].start; - const connectionEnd = connectionStartEnd[index].end; - - const waypoints = layouter.layoutConnection(conn, { - connectionStart, - connectionEnd, - }); - - modeling.updateWaypoints(conn, waypoints); - }); - }, - ); - } - - // update connections on connection create and delete - // update connections of new target on connection reconnect - this.postExecuted([ - 'connection.create', - 'connection.delete', - 'connection.reconnect', - ], (context) => { - const { connection } = context; - const source = connection.source || context.source; - const target = connection.target || context.target; - - const orientation = getOrientation(source, target); - - // update all connections with same orientation - const connections = target.incoming.filter((incoming) => { - const incomingOrientation = getOrientation(incoming.source, incoming.target); - - return isSameOrientation(incomingOrientation, orientation); - }); - - if (!connections.length) { - return; - } - - updateConnections(target, connections, orientation); - }, true); - - // update connections of old target on connection reconnect - this.preExecute('connection.reconnect', (context) => { - const { connection } = context; - const { source } = connection; - const { target } = connection; - - const orientation = getOrientation(source, target); - - // update all connections with same orientation except reconnected - const connections = target.incoming.filter((incoming) => { - const incomingOrientation = getOrientation(incoming.source, incoming.target); - - return incoming !== connection - && isSameOrientation(incomingOrientation, orientation); - }); - - if (!connections.length) { - return; - } - - updateConnections(target, connections, orientation); - }, true); - - // update connections on elements move - this.postExecuted('elements.move', LOW_PRIORITY, (context) => { - const { shapes } = context; - const { closure } = context; - const { enclosedConnections } = closure; - - shapes.forEach((shape) => { - // (1) update incoming connections - const incomingConnections = shape.incoming.filter((incoming) => { - return !enclosedConnections[incoming.id]; - }); - - if (incomingConnections.length) { - updateConnections(shape, incomingConnections); - } - - // (2) update outgoing connections - shape.outgoing.forEach((outgoing) => { - if (enclosedConnections[outgoing.id]) { - return; - } - - updateConnections(outgoing.target); - }); - }); - }, true); -} - -LayoutConnectionBehavior.$inject = [ - 'injector', - 'layouter', - 'modeling', - 'rules', -]; - -inherits(LayoutConnectionBehavior, CommandInterceptor); diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/LayoutUpdateBehavior.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/LayoutUpdateBehavior.js deleted file mode 100644 index 223decd7ca..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/LayoutUpdateBehavior.js +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { assign } from 'min-dash'; - -import inherits from 'inherits-browser'; - -import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor'; - -export default function LayoutUpdateBehavior(injector) { - injector.invoke(CommandInterceptor, this); - const self = this; - - function updateBounds(context) { - const { shape } = context; - self.updateBounds(shape); - } - - this.executed(['shape.create', 'shape.move', 'shape.resize'], updateBounds, true); - this.reverted(['shape.create', 'shape.move', 'shape.resize'], updateBounds, true); - - function updateConnectionWaypoints(context) { - self.updateConnectionWaypoints(context); - } - - this.executed([ - 'connection.create', - 'connection.layout', - 'connection.move', - 'connection.updateWaypoints', - ], updateConnectionWaypoints, true); - - this.reverted([ - 'connection.create', - 'connection.layout', - 'connection.move', - 'connection.updateWaypoints', - ], updateConnectionWaypoints, true); - - function updateConnectionSourceTarget(context) { - self.updateConnectionSourceTarget(context); - } - - this.executed(['connection.create', 'connection.reconnect'], updateConnectionSourceTarget, true); - this.reverted(['connection.create', 'connection.reconnect'], updateConnectionSourceTarget, true); -} - -inherits(LayoutUpdateBehavior, CommandInterceptor); - -LayoutUpdateBehavior.$inject = ['injector']; - -LayoutUpdateBehavior.prototype.updateBounds = function (shape) { - const { businessObject } = shape; - const { bounds } = businessObject.style; - - // update bounds - assign(bounds, { - x: shape.x, - y: shape.y, - width: shape.width, - height: shape.height, - }); -}; - -LayoutUpdateBehavior.prototype.updateConnectionWaypoints = function (context) { - const { connection } = context; - const { businessObject } = connection; - const { waypoints } = businessObject.style; - - assign(waypoints, connection.waypoints); -}; - -LayoutUpdateBehavior.prototype.updateConnectionSourceTarget = function (context) { - const { connection } = context; - const { businessObject } = connection; - const { source, newSource, target, newTarget } = context; - - businessObject.style.source = newSource || source; - businessObject.style.target = newTarget || target; -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/ReplaceConnectionBehavior.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/ReplaceConnectionBehavior.js deleted file mode 100644 index 2a6fbce50d..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/ReplaceConnectionBehavior.js +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import inherits from 'inherits-browser'; - -import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor'; - -export default function ReplaceConnectionBehavior(injector, modeling, rules) { - injector.invoke(CommandInterceptor, this); - - this.preExecute('connection.reconnect', (context) => { - const { connection } = context; - const source = context.newSource || connection.source; - const target = context.newTarget || connection.target; - const waypoints = connection.waypoints.slice(); - - const allowed = rules.allowed('connection.reconnect', { - connection, - source, - target, - }); - - if (!allowed || allowed.type === connection.type) { - return; - } - - context.connection = modeling.connect(source, target, { - type: allowed.type, - waypoints, - }); - - modeling.removeConnection(connection); - }, true); -} - -inherits(ReplaceConnectionBehavior, CommandInterceptor); - -ReplaceConnectionBehavior.$inject = [ - 'injector', - 'modeling', - 'rules', -]; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/index.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/index.js deleted file mode 100644 index 1da9796d2e..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/behavior/index.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import AttachCatchBehavior from './AttachCatchBehavior'; -import LayoutConnectionBehavior from './LayoutConnectionBehavior'; -import ReplaceConnectionBehavior from './ReplaceConnectionBehavior'; -import LayoutUpdateBehavior from './LayoutUpdateBehavior'; - -export default { - __init__: [ - 'attachCatchBehavior', - 'layoutConnectionBehavior', - 'replaceConnectionBehavior', - 'layoutUpdateBehavior', - ], - attachCatchBehavior: ['type', AttachCatchBehavior], - layoutConnectionBehavior: ['type', LayoutConnectionBehavior], - replaceConnectionBehavior: ['type', ReplaceConnectionBehavior], - layoutUpdateBehavior: ['type', LayoutUpdateBehavior], -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/index.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/index.js deleted file mode 100644 index 479e172c2f..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/layout/index.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import CroppingConnectionDocking from 'diagram-js/lib/layout/CroppingConnectionDocking'; -import Layouter from './Layouter'; -import Behavior from './behavior'; - -export default { - __depends__: [Behavior], - layouter: ['type', Layouter], - connectionDocking: ['type', CroppingConnectionDocking], -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/ElementFactory.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/ElementFactory.js deleted file mode 100644 index 584cfcaa33..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/ElementFactory.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { assign } from 'min-dash'; - -import inherits from 'inherits-browser'; - -import BaseElementFactory from 'diagram-js/lib/core/ElementFactory'; - -/** - * A drd-aware factory for diagram-js shapes - */ -export default function ElementFactory(sagaFactory) { - BaseElementFactory.call(this); - - this.sagaFactory = sagaFactory; -} - -inherits(ElementFactory, BaseElementFactory); - -ElementFactory.$inject = ['sagaFactory']; - -ElementFactory.prototype.baseCreate = BaseElementFactory.prototype.create; - -ElementFactory.prototype.create = function (elementType, attrs) { - const { sagaFactory } = this; - - attrs = attrs || {}; - - let { businessObject } = attrs; - - if (!businessObject) { - if (!attrs.type) { - throw new Error('no shape type specified'); - } - - businessObject = sagaFactory.create(attrs.type); - } - - const size = sagaFactory.getDefaultSize(businessObject); - - attrs = assign({ businessObject }, size, attrs); - - return this.baseCreate(elementType, attrs); -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/Modeling.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/Modeling.js deleted file mode 100644 index aacb0e6b67..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/Modeling.js +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import inherits from 'inherits-browser'; - -import { keys } from 'min-dash'; -import BaseModeling from 'diagram-js/lib/features/modeling/Modeling'; -import { getProperties, setProperties } from '../utils'; - -function UpdatePropertiesHandler() { -} - -/** - * @param {Object} context - * @param {djs.model.Base} context.element the element to update - * @param {Object} context.properties a list of properties to set on the element's businessObject. - * - * @return {Array} the updated element - */ -UpdatePropertiesHandler.prototype.execute = function (context) { - const { element } = context; - const changed = [element]; - - if (!element) { - throw new Error('element required'); - } - - const { businessObject } = element; - const { properties } = context; - const oldProperties = context.oldProperties || getProperties(businessObject, keys(properties)); - - const { override } = context; - // update properties - setProperties(businessObject, properties, override); - - // store old values - context.oldProperties = oldProperties; - context.changed = changed; - - // indicate changed on objects affected by the update - return changed; -}; - -/** - * @param {Object} context - * - * @return {djs.model.Base} the updated element - */ -UpdatePropertiesHandler.prototype.revert = function (context) { - const { element } = context; - const { oldProperties } = context; - const { businessObject } = element; - - // update properties - setProperties(businessObject, oldProperties); - return context.changed; -}; - -export default function Modeling( - canvas, - commandStack, - rules, - injector, -) { - this.canvas = canvas; - this.commandStack = commandStack; - this.rules = rules; - - injector.invoke(BaseModeling, this); -} - -inherits(Modeling, BaseModeling); - -Modeling.$inject = [ - 'canvas', - 'commandStack', - 'rules', - 'injector', -]; - -Modeling.prototype.connect = function (source, target, attrs, hints) { - const { rules } = this; - const rootElement = this.canvas.getRootElement(); - - if (!attrs) { - attrs = rules.canConnect(source, target); - } - - return this.createConnection(source, target, attrs, rootElement, hints); -}; - -Modeling.prototype.getHandlers = function () { - const handlers = BaseModeling.prototype.getHandlers.call(this); - - handlers['element.updateProperties'] = UpdatePropertiesHandler; - - return handlers; -}; - -Modeling.prototype.updateProperties = function (element, properties, override) { - this.commandStack.execute('element.updateProperties', { - element, - properties, - override, - }); -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/SagaExporter.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/SagaExporter.js deleted file mode 100644 index 6cd0ec838a..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/SagaExporter.js +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { assign } from 'min-dash'; -import StateMachine from '../spec/StateMachine'; -import StartState from '../spec/StartState'; -import State from '../spec/State'; -import Edge from '../spec/style/Edge'; - -export default function SagaExporter(elementRegistry) { - this.elementRegistry = elementRegistry; -} -SagaExporter.$inject = ['elementRegistry']; - -SagaExporter.prototype.parseRoot = function (definitions, root) { - const { businessObject } = root; - assign(definitions, businessObject.exportJson()); -}; - -SagaExporter.prototype.parseState = function (definitions, node) { - const { businessObject } = node; - const elementJson = businessObject.exportJson(); - - const { Name } = businessObject; - definitions.States[Name] = elementJson; -}; - -SagaExporter.prototype.parseEdge = function (definitions, edge) { - const { businessObject } = edge; - const elementJson = businessObject.exportJson(); - const { source, target } = elementJson.style; - if (!source) { - if (definitions.StartState) { - throw new Error(`Two or more start states, ${target} and ${definitions.StartState}`); - } else { - definitions.StartState = target; - if (definitions.edge === undefined) { - definitions.edge = {}; - } - assign(definitions.edge, elementJson); - } - } else { - const stateRef = definitions.States[source]; - switch (businessObject.Type) { - case 'ChoiceEntry': - if (!stateRef.Choices) { - stateRef.Choices = []; - } - stateRef.Choices.push({ - Expression: businessObject.Expression, - Next: target, - }); - if (businessObject.Default) { - stateRef.Default = target; - } - stateRef.edge = assign(stateRef.edge || {}, { [target]: elementJson }); - break; - case 'ExceptionMatch': - stateRef.Catch.push({ - Exceptions: businessObject.Exceptions, - Next: target, - }); - stateRef.catch = assign(stateRef.catch || {}, { edge: { [target]: elementJson } }); - break; - case 'Compensation': - stateRef.CompensateState = target; - stateRef.edge = assign(stateRef.edge || {}, { [target]: elementJson }); - break; - case 'Transition': - default: - stateRef.Next = target; - stateRef.edge = assign(stateRef.edge || {}, { [target]: elementJson }); - } - } -}; - -SagaExporter.prototype.export = function () { - const definitions = {}; - - const elements = this.elementRegistry.getAll(); - const root = elements.filter(({ businessObject }) => businessObject instanceof StateMachine)[0]; - const start = elements.filter(({ businessObject }) => businessObject instanceof StartState)[0]; - const states = elements.filter(({ businessObject }) => businessObject instanceof State); - const edges = elements.filter(({ businessObject }) => businessObject instanceof Edge); - - this.parseRoot(definitions, root); - this.parseRoot(definitions, start); - assign(definitions, { States: {} }); - states.forEach((state) => this.parseState(definitions, state)); - edges.forEach((edge) => this.parseEdge(definitions, edge)); - - return definitions; -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/SagaFactory.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/SagaFactory.js deleted file mode 100644 index 7db11c7cc6..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/SagaFactory.js +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Transition from '../spec/Transition'; -import StateMachine from '../spec/StateMachine'; -import ServiceTask from '../spec/ServiceTask'; -import StartState from '../spec/StartState'; -import ScriptTask from '../spec/ScriptTask'; -import Choice from '../spec/Choice'; -import ChoiceEntry from '../spec/ChoiceEntry'; -import Succeed from '../spec/Succeed'; -import Fail from '../spec/Fail'; -import Catch from '../spec/Catch'; -import ExceptionMatch from '../spec/ExceptionMatch'; -import CompensationTrigger from '../spec/CompensationTrigger'; -import SubStateMachine from '../spec/SubStateMachine'; -import Compensation from '../spec/Compensation'; - -export default function SagaFactory() { - const typeToSpec = new Map(); - typeToSpec.set('Transition', Transition); - typeToSpec.set('StartState', StartState); - typeToSpec.set('StateMachine', StateMachine); - typeToSpec.set('ServiceTask', ServiceTask); - typeToSpec.set('ScriptTask', ScriptTask); - typeToSpec.set('Choice', Choice); - typeToSpec.set('ChoiceEntry', ChoiceEntry); - typeToSpec.set('Succeed', Succeed); - typeToSpec.set('Fail', Fail); - typeToSpec.set('Catch', Catch); - typeToSpec.set('ExceptionMatch', ExceptionMatch); - typeToSpec.set('CompensationTrigger', CompensationTrigger); - typeToSpec.set('SubStateMachine', SubStateMachine); - typeToSpec.set('Compensation', Compensation); - this.typeToSpec = typeToSpec; -} - -SagaFactory.prototype.create = function (type) { - const Spec = this.typeToSpec.get(type); - return new Spec(); -}; - -SagaFactory.prototype.getDefaultSize = function (semantic) { - if (semantic.DEFAULT_SIZE) { - return semantic.DEFAULT_SIZE; - } - - return { - width: 100, - height: 80, - }; -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/SagaImporter.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/SagaImporter.js deleted file mode 100644 index 4234136edf..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/SagaImporter.js +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - assign, forEach, - map, -} from 'min-dash'; - -// helper ///// -function elementData(semantic, attrs) { - return assign({ - type: semantic.Type, - businessObject: semantic, - }, attrs); -} - -function collectWaypoints(edge) { - const { waypoints } = edge; - - if (waypoints) { - return map(waypoints, (waypoint) => { - const position = { x: waypoint.x, y: waypoint.y }; - - return assign({ original: position }, position); - }); - } - return null; -} - -export default function SagaImporter( - sagaFactory, - eventBus, - canvas, - elementFactory, - elementRegistry, - modeling, -) { - this.sagaFactory = sagaFactory; - this.eventBus = eventBus; - this.canvas = canvas; - this.elementRegistry = elementRegistry; - this.elementFactory = elementFactory; - this.modeling = modeling; -} - -SagaImporter.$inject = [ - 'sagaFactory', - 'eventBus', - 'canvas', - 'elementFactory', - 'elementRegistry', - 'modeling', -]; - -SagaImporter.prototype.import = function (definitions) { - let error = []; - const warnings = []; - - this.eventBus.fire('import.start', { definitions }); - - try { - const root = this.sagaFactory.create('StateMachine'); - root.importJson(definitions); - this.root(root); - - // Add start state - let start = this.sagaFactory.create('StartState'); - start.importJson(definitions); - start = this.add(start); - - const edges = []; - const catches = []; - forEach(definitions.States, (semantic) => { - const state = this.sagaFactory.create(semantic.Type); - state.importJson(semantic); - const host = this.add(state); - if (semantic.edge) { - edges.push(...Object.values(semantic.edge)); - } - if (semantic.catch) { - const node = this.sagaFactory.create('Catch'); - node.importJson(semantic.catch); - const source = this.add(node); - if (semantic.catch.edge) { - semantic.Catch.forEach((exceptionMatch) => { - if (semantic.catch.edge[exceptionMatch.Next]) { - semantic.catch.edge[exceptionMatch.Next].Exceptions = exceptionMatch.Exceptions; - } - }); - } - this.modeling.updateAttachment(source, host); - catches.push({ source, edges: Object.values(semantic.catch.edge) }); - } - }); - - // Add start edge - if (definitions.edge) { - const startEdge = this.sagaFactory.create('Transition'); - startEdge.importJson(definitions.edge); - this.add(startEdge, { source: start }); - } - - forEach(edges, (semantic) => { - const transition = this.sagaFactory.create(semantic.Type); - transition.importJson(semantic); - this.add(transition); - }); - - forEach(catches, (oneCatch) => { - const { source, edges: exceptionMatches } = oneCatch; - forEach(exceptionMatches, (semantic) => { - const exceptionMatch = this.sagaFactory.create(semantic.Type); - exceptionMatch.importJson(semantic); - this.add(exceptionMatch, { source }); - }); - }); - } catch (e) { - error = e; - console.error(error); - } - - this.eventBus.fire('import.done', { error, warnings }); -}; - -SagaImporter.prototype.root = function (semantic) { - const element = this.elementFactory.createRoot(elementData(semantic)); - - this.canvas.setRootElement(element); - - return element; -}; - -/** - * Add drd element (semantic) to the canvas. - */ -SagaImporter.prototype.add = function (semantic, attrs = {}) { - const { elementFactory } = this; - const { canvas } = this; - const { style } = semantic; - - let element; let waypoints; let source; let target; let elementDefinition; let - bounds; - - if (style.Type === 'Node') { - bounds = style.bounds; - - elementDefinition = elementData(semantic, { - x: Math.round(bounds.x), - y: Math.round(bounds.y), - width: Math.round(bounds.width), - height: Math.round(bounds.height), - }); - element = elementFactory.createShape(elementDefinition); - - canvas.addShape(element); - } else if (style.Type === 'Edge') { - waypoints = collectWaypoints(style); - - source = attrs.source || this.getSource(semantic); - target = this.getTarget(semantic); - semantic.style.source = source; - semantic.style.target = target; - - if (source && target) { - elementDefinition = elementData(semantic, { - source, - target, - waypoints, - }); - // console.log(elementDefinition); - - element = elementFactory.createConnection(elementDefinition); - - canvas.addConnection(element); - } - } else { - throw new Error(`unknown di for element ${semantic.id}`); - } - - return element; -}; - -SagaImporter.prototype.getSource = function (semantic) { - return this.getShape(semantic.style.source); -}; - -SagaImporter.prototype.getTarget = function (semantic) { - return this.getShape(semantic.style.target); -}; - -SagaImporter.prototype.getShape = function (name) { - return this.elementRegistry.find((element) => element.businessObject.Name === name); -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/SagaRules.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/SagaRules.js deleted file mode 100644 index 53f00a15ce..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/SagaRules.js +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import inherits from 'inherits-browser'; - -import RuleProvider from 'diagram-js/lib/features/rules/RuleProvider'; -import { getOrientation } from 'diagram-js/lib/layout/LayoutUtil'; -import { is } from '../utils'; - -export default function SagaRules(injector) { - injector.invoke(RuleProvider, this); -} - -inherits(SagaRules, RuleProvider); - -SagaRules.$inject = ['injector']; - -function canConnect(source, target) { - if (!source || !target) { - return null; - } - - if (target.parent !== source.parent || source === target) { - return false; - } - - if (is(source, 'Task') && is(target, 'Task') && target.businessObject.IsForCompensation) { - return { type: 'Compensation' }; - } - - if (is(source, 'Choice')) { - return { type: 'ChoiceEntry' }; - } - - if (is(source, 'Catch')) { - return { type: 'ExceptionMatch' }; - } - - return { type: 'Transition' }; -} - -function canCreate(shapes, target) { - let shapeList = shapes; - if (!Array.isArray(shapes)) { - shapeList = [shapes]; - } - - const invalid = shapeList.map((shape) => { - if (is(shape, 'Catch')) { - return false; - } - - if (!target) { - return true; - } - - return target.parent === shape.target; - }).filter((valid) => !valid).length; - - return !invalid; -} - -function canAttach(shapes, target, position) { - if (Array.isArray(shapes)) { - if (shapes.length > 1) { - return false; - } - } - const shape = shapes[0] || shapes; - - if (is(shape, 'Catch')) { - if (position && getOrientation(position, target, -15) === 'intersect') { - return false; - } - - if (is(target, 'Task')) { - return 'attach'; - } - } - - return false; -} - -function canMove(shapes, target, position) { - const shapeSet = new Set(shapes); - // Exclude all catches with parents included - const filtered = shapes.filter((shape) => !(is(shape, 'Catch') && shapeSet.has(shape.parent))); - return !target || canAttach(filtered, target, position) || canCreate(filtered, target); -} - -SagaRules.prototype.init = function () { - this.addRule('shape.create', (context) => { - const { target } = context; - const { shape } = context; - - return canCreate(shape, target); - }); - - this.addRule('shape.attach', (context) => { - const { shape, target, position } = context; - - return canAttach(shape, target, position); - }); - - this.addRule('elements.move', (context) => { - const { shapes, target, position } = context; - - return canMove(shapes, target, position); - }); - - this.addRule('connection.create', (context) => { - const { source } = context; - const { target } = context; - - return canConnect(source, target); - }); - - this.addRule('connection.reconnect', (context) => { - const { source } = context; - const { target } = context; - - return canConnect(source, target); - }); -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/index.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/index.js deleted file mode 100644 index f733a5ffc9..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/modeling/index.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import DiagramCommand from 'diagram-js/lib/command'; -import DiagramChangeSupport from 'diagram-js/lib/features/change-support'; -import DiagramRulesModule from 'diagram-js/lib/features/rules'; -import DiagramSelection from 'diagram-js/lib/features/selection'; - -import ElementFactory from './ElementFactory'; -import Modeling from './Modeling'; -import SagaFactory from './SagaFactory'; -import SagaRules from './SagaRules'; -import SagaExporter from './SagaExporter'; -import SagaImporter from './SagaImporter'; - -export default { - __init__: [ - 'modeling', - 'sagaImporter', - 'sagaExporter', - 'sagaFactory', - 'sagaRules', - ], - __depends__: [ - DiagramCommand, - DiagramChangeSupport, - DiagramRulesModule, - DiagramSelection, - ], - elementFactory: ['type', ElementFactory], - modeling: ['type', Modeling], - sagaImporter: ['type', SagaImporter], - sagaExporter: ['type', SagaExporter], - sagaFactory: ['type', SagaFactory], - sagaRules: ['type', SagaRules], -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PanelHeaderProvider.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PanelHeaderProvider.js deleted file mode 100644 index 8c888df452..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PanelHeaderProvider.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export default { - - getElementLabel: (element) => { - return element.name; - }, - - getElementIcon: (element) => { - // eslint-disable-next-line react/react-in-jsx-scope - return () => ; - }, - - getTypeLabel: (element) => { - return element?.type?.replace(/(\B[A-Z])/g, ' $1').replace(/(\bNon Interrupting)/g, '($1)'); - }, -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PanelPlaceholderProvider.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PanelPlaceholderProvider.js deleted file mode 100644 index eaaf2d8412..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PanelPlaceholderProvider.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export default { - - getEmpty: () => { - return { - text: 'Select an element to edit its properties.', - - icon: null, - }; - }, - - getMultiple: () => { - return { - text: 'Multiple elements are selected. Select a single element to edit its properties.', - - icon: null, - }; - }, -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PropertiesPanel.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PropertiesPanel.js deleted file mode 100644 index aaf0e578a5..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PropertiesPanel.js +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - useState, - useMemo, - useEffect, -} from '@bpmn-io/properties-panel/preact/hooks'; - -import { - find, - isArray, - reduce, -} from 'min-dash'; - -import { PropertiesPanel as BasePropertiesPanel } from '@bpmn-io/properties-panel'; - -import PropertiesPanelContext from './PropertiesPanelContext'; - -import PanelHeaderProvider from './PanelHeaderProvider'; -import PanelPlaceholderProvider from './PanelPlaceholderProvider'; - -// helpers ////////////////////////// - -function isImplicitRoot(element) { - // Backwards compatibility for diagram-js<7.4.0, see https://github.com/bpmn-io/bpmn-properties-panel/pull/102 - return element && (element.isImplicit || element.id === '__implicitroot'); -} - -function findElement(elements, element) { - return find(elements, (e) => e === element); -} - -function elementExists(element, elementRegistry) { - return element && elementRegistry.get(element.id); -} - -/** - * @param {Object} props - * @param {djs.model.Base|Array} [props.element] - * @param {Injector} props.injector - * @param { (djs.model.BaseSpec) => Array } props.getProviders - * @param {Object} props.layoutConfig - * @param {Object} props.descriptionConfig - */ -export default function PropertiesPanel(props) { - const { - element, - injector, - getProviders, - layoutConfig, - descriptionConfig, - } = props; - - const canvas = injector.get('canvas'); - const elementRegistry = injector.get('elementRegistry'); - const eventBus = injector.get('eventBus'); - - const [state, setState] = useState({ - selectedElement: element, - }); - - const { selectedElement } = state; - - /** - * @param {djs.model.Base | Array} e - */ - const update = (e) => { - if (!e) { - return; - } - - const newSelectedElement = e; - - setState({ - ...state, - selectedElement: newSelectedElement, - }); - - // notify interested parties on property panel updates - eventBus.fire('propertiesPanel.updated', { - element: newSelectedElement, - }); - }; - - // (2) react on element changes - - // (2a) selection changed - useEffect(() => { - const onSelectionChanged = (e) => { - const { newSelection = [] } = e; - - if (newSelection.length > 1) { - return update(newSelection); - } - - const newElement = newSelection[0]; - - const rootElement = canvas.getRootElement(); - - if (isImplicitRoot(rootElement)) { - // TODO - } - - update(newElement || rootElement); - return null; - }; - - eventBus.on('selection.changed', onSelectionChanged); - - return () => { - eventBus.off('selection.changed', onSelectionChanged); - }; - }, []); - - // (2b) selected element changed - useEffect(() => { - const onElementsChanged = (e) => { - const { elements } = e; - - const updatedElement = findElement(elements, selectedElement); - - if (updatedElement && elementExists(updatedElement, elementRegistry)) { - update(updatedElement); - } - }; - - eventBus.on('elements.changed', onElementsChanged); - - return () => { - eventBus.off('elements.changed', onElementsChanged); - }; - }, [selectedElement]); - - // (2c) root element changed - useEffect(() => { - const onRootAdded = (e) => { - const { element: root } = e; - - if (isImplicitRoot(root)) { - return; - } - - update(root); - }; - - eventBus.on('root.added', onRootAdded); - - return () => { - eventBus.off('root.added', onRootAdded); - }; - }, [selectedElement]); - - // (2d) provided entries changed - useEffect(() => { - const onProvidersChanged = () => { - update(selectedElement); - }; - - eventBus.on('propertiesPanel.providersChanged', onProvidersChanged); - - return () => { - eventBus.off('propertiesPanel.providersChanged', onProvidersChanged); - }; - }, [selectedElement]); - - // (3) create properties panel context - const propertiesPanelContext = useMemo(() => ({ - selectedElement, - injector, - getService(type, strict) { return injector.get(type, strict); }, - }), [selectedElement, injector]); - - // (4) retrieve groups for selected element - const providers = getProviders(selectedElement); - - const groups = useMemo(() => { - return reduce(providers, (g, provider) => { - // do not collect groups for multi element state - if (isArray(selectedElement)) { - return []; - } - const updater = provider.getGroups(selectedElement); - - return updater(g); - }, []); - }, [providers, selectedElement]); - - // (5) notify layout changes - const onLayoutChanged = (layout) => { - eventBus.fire('propertiesPanel.layoutChanged', { - layout, - }); - }; - - // (6) notify description changes - const onDescriptionLoaded = (description) => { - eventBus.fire('propertiesPanel.descriptionLoaded', { - description, - }); - }; - - return ( - - - - ); -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PropertiesPanelContext.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PropertiesPanelContext.js deleted file mode 100644 index e423b355f2..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PropertiesPanelContext.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - createContext, -} from '@bpmn-io/properties-panel/preact'; - -const PropertiesPanelContext = createContext({ - selectedElement: null, - injector: null, - getService: () => null, -}); - -export default PropertiesPanelContext; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PropertiesPanelRenderer.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PropertiesPanelRenderer.js deleted file mode 100644 index 9174e3d69f..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/PropertiesPanelRenderer.js +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - isUndo, - isRedo, -} from 'diagram-js/lib/features/keyboard/KeyboardUtil'; - -import { - render, -} from '@bpmn-io/properties-panel/preact'; - -import { - domify, - query as domQuery, - event as domEvent, -} from 'min-dom'; -import PropertiesPanel from './PropertiesPanel'; - -// helpers /////////////////////// - -function isImplicitRoot(element) { - // Backwards compatibility for diagram-js<7.4.0, see https://github.com/bpmn-io/bpmn-properties-panel/pull/102 - return element && (element.isImplicit || element.id === '__implicitroot'); -} - -/** - * Setup keyboard bindings (undo, redo) on the given container. - * - * @param {Element} container - * @param {EventBus} eventBus - * @param {CommandStack} commandStack - */ -function setupKeyboard(container, eventBus, commandStack) { - function cancel(event) { - event.preventDefault(); - event.stopPropagation(); - } - - function handleKeys(event) { - if (isUndo(event)) { - commandStack.undo(); - - return cancel(event); - } - - if (isRedo(event)) { - commandStack.redo(); - - return cancel(event); - } - - return null; - } - - eventBus.on('keyboard.bind', () => { - domEvent.bind(container, 'keydown', handleKeys); - }); - - eventBus.on('keyboard.unbind', () => { - domEvent.unbind(container, 'keydown', handleKeys); - }); -} - -const DEFAULT_PRIORITY = 1000; - -export default class PropertiesPanelRenderer { - constructor(config, injector, eventBus) { - const { - parent, - layout: layoutConfig, - description: descriptionConfig, - } = config || {}; - - this.eventBus = eventBus; - this.injector = injector; - this.layoutConfig = layoutConfig; - this.descriptionConfig = descriptionConfig; - - this.container = domify( - '
', - ); - - const commandStack = injector.get('commandStack', false); - - if (commandStack) { - setupKeyboard(this.container, eventBus, commandStack); - } - eventBus.on('diagram.destroy', () => { - this.detach(); - }); - - eventBus.on('import.done', (event) => { - const { element } = event; - - if (parent) { - this.attachTo(parent); - } - this.render(element); - }); - - eventBus.on('detach', () => { - this.detach(); - }); - } - - /** - * Attach the properties panel to a parent node. - * - * @param {HTMLElement} container - */ - attachTo(container) { - if (!container) { - throw new Error('container required'); - } - - // unwrap jQuery if provided - if (container.get && container.constructor.prototype.jquery) { - container = container.get(0); - } - - if (typeof container === 'string') { - container = domQuery(container); - } - - // (1) detach from old parent - this.detach(); - - // (2) append to parent container - container.appendChild(this.container); - - // (3) notify interested parties - this.eventBus.fire('propertiesPanel.attach'); - } - - /** - * Detach the properties panel from its parent node. - */ - detach() { - const { parentNode } = this.container; - - if (parentNode) { - parentNode.removeChild(this.container); - - this.eventBus.fire('propertiesPanel.detach'); - } - } - - /** - * Register a new properties provider to the properties panel. - * - * @param {Number} [priority] - * @param {PropertiesProvider} provider - */ - registerProvider(priority, provider) { - if (!provider) { - provider = priority; - priority = DEFAULT_PRIORITY; - } - - if (typeof provider.getGroups !== 'function') { - console.error( - 'Properties provider does not implement #getGroups(element) API', - ); - - return; - } - - this.eventBus.on('propertiesPanel.getProviders', priority, (event) => { - event.providers.push(provider); - }); - - this.eventBus.fire('propertiesPanel.providersChanged'); - } - - getProviders() { - const event = this.eventBus.createEvent({ - type: 'propertiesPanel.getProviders', - providers: [], - }); - - this.eventBus.fire(event); - - return event.providers; - } - - render(element) { - const canvas = this.injector.get('canvas'); - - if (!element) { - element = canvas.getRootElement(); - } - - if (isImplicitRoot(element)) { - return; - } - - render( - , - this.container, - ); - - this.eventBus.fire('propertiesPanel.rendered'); - } - - destroy() { - if (this.container) { - render(null, this.container); - - this.eventBus.fire('propertiesPanel.destroyed'); - } - } -} - -PropertiesPanelRenderer.$inject = ['config.propertiesPanel', 'injector', 'eventBus']; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/index.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/index.js deleted file mode 100644 index 60d9bf789a..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/index.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { DebounceInputModule, FeelPopupModule } from '@bpmn-io/properties-panel'; -import PropertiesPanelRenderer from './PropertiesPanelRenderer'; - -export default { - __depends__: [ - DebounceInputModule, - FeelPopupModule, - ], - __init__: ['propertiesPanel'], - propertiesPanel: ['type', PropertiesPanelRenderer], -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/PropertiesProvider.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/PropertiesProvider.js deleted file mode 100644 index aa0471c0b7..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/PropertiesProvider.js +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Group } from '@bpmn-io/properties-panel'; - -import NameProps from './properties/NameProps'; -import CommentProps from './properties/CommentProps'; -import VersionProps from './properties/VersionProps'; -import StateProps from './properties/StateProps'; -import StyleProps from './properties/StyleProps'; -import { is } from '../../utils'; - -function GeneralGroup(element) { - const entries = [ - ...NameProps({ element }), - ...CommentProps({ element }), - ]; - - if (is(element, 'StateMachine')) { - entries.push(...VersionProps({ element })); - } - - if (is(element, 'Connection') || is(element, 'StartState') || is(element, 'Catch')) { - return null; - } - - return { - id: 'general', - label: 'General', - entries, - component: Group, - }; -} - -function JsonGroup(element) { - const entries = [ - ...StateProps({ element }), - ...StyleProps({ element }), - ]; - - if (is(element, 'Transition') || is(element, 'Compensation') || is(element, 'StartState') || is(element, 'Catch')) { - entries.splice(0, 1); - } - - return { - id: 'json', - label: 'Json Props', - entries, - shouldOpen: true, - component: Group, - }; -} - -function getGroups(element) { - const groups = [ - GeneralGroup(element), - JsonGroup(element), - ]; - - // contract: if a group returns null, it should not be displayed at all - return groups.filter((group) => group !== null); -} - -export default class PropertiesProvider { - constructor(propertiesPanel) { - propertiesPanel.registerProvider(this); - } - - getGroups(element) { - return (groups) => { - return [ - ...groups, - ...getGroups(element), - ]; - }; - } -} - -PropertiesProvider.$inject = ['propertiesPanel']; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/index.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/index.js deleted file mode 100644 index cc1f209765..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/index.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import PropertiesProvider from './PropertiesProvider'; - -export default { - __init__: ['propertiesProvider'], - propertiesProvider: ['type', PropertiesProvider], -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/BaseText.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/BaseText.js deleted file mode 100644 index a746a77365..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/BaseText.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - TextFieldEntry, -} from '@bpmn-io/properties-panel'; - -import { useService } from '../../../utils'; - -export default function BaseText(props) { - const { - element, - id, - label, - parameterKey, - ...additionalProps - } = props; - - const debounce = useService('debounceInput'); - const modeling = useService('modeling'); - - const options = { - element, - id, - label, - ...additionalProps, - debounce, - getValue: (e) => { - if (e.businessObject) { - return e.businessObject[parameterKey]; - } - return null; - }, - setValue: (value) => { - modeling.updateProperties(element, { [parameterKey]: value }); - }, - }; - - return TextFieldEntry(options); -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/BaseTextArea.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/BaseTextArea.js deleted file mode 100644 index 57b7e3606c..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/BaseTextArea.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - TextAreaEntry, -} from '@bpmn-io/properties-panel'; - -import { useService } from '../../../utils'; - -export default function BaseTextArea(props) { - const { - element, - id, - label, - parameterKey, - ...additionalProps - } = props; - - const debounce = useService('debounceInput'); - const modeling = useService('modeling'); - - const options = { - element, - id, - label, - ...additionalProps, - debounce, - getValue: (e) => { - if (e.businessObject) { - return e.businessObject[parameterKey]; - } - return null; - }, - setValue: (value) => { - modeling.updateProperties(element, { [parameterKey]: value }); - }, - }; - - return TextAreaEntry(options); -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/CommentProps.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/CommentProps.js deleted file mode 100644 index a806aa1718..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/CommentProps.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - isTextFieldEntryEdited, -} from '@bpmn-io/properties-panel'; -import BaseTextArea from './BaseTextArea'; - -export default function CommentProps(props) { - const { - element, - } = props; - - return [ - { - id: 'comment', - label: 'Comment', - parameterKey: 'Comment', - component: BaseTextArea, - element, - isEdited: isTextFieldEntryEdited, - }, - ]; -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/NameProps.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/NameProps.js deleted file mode 100644 index 3660834f7b..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/NameProps.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - isTextFieldEntryEdited, -} from '@bpmn-io/properties-panel'; - -import BaseText from './BaseText'; - -export default function NameProps(props) { - const { - element, - } = props; - - return [ - { - id: 'name', - label: 'Name', - parameterKey: 'Name', - component: BaseText, - element, - isEdited: isTextFieldEntryEdited, - }, - ]; -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/StateProps.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/StateProps.js deleted file mode 100644 index cf09035501..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/StateProps.js +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - TextAreaEntry, - isTextFieldEntryEdited, CollapsibleEntry, -} from '@bpmn-io/properties-panel'; - -import { assign } from 'min-dash'; -import { useService } from '../../../utils'; - -function State(props) { - const { element } = props; - - const debounce = useService('debounceInput'); - const modeling = useService('modeling'); - - const options = { - component: TextAreaEntry, - element, - id: 'props', - // label: 'Props', - debounce, - autoResize: true, - getValue: (e) => { - const value = assign({}, e.businessObject); - // Exclude style - delete value.style; - // Exclude Catch for Task - delete value.Catch; - return JSON.stringify(value, null, 2); - }, - validate: (value) => { - try { - JSON.parse(value); - } catch (e) { - return e.message; - } - - return null; - }, - setValue: (value, newValidationError) => { - try { - JSON.parse(value); - } catch (e) { - newValidationError = e; - } - if (newValidationError) { - return; - } - const businessObject = JSON.parse(value); - modeling.updateProperties(element, businessObject, true); - }, - }; - - return CollapsibleEntry({ - id: 'collapsible-props', - label: 'Props', - element, - entries: [options], - open: true, - }); -} - -export default function StateProps(props) { - const { - element, - } = props; - - return [ - { - component: State, - element, - isEdited: isTextFieldEntryEdited, - }, - ]; -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/StyleProps.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/StyleProps.js deleted file mode 100644 index d6522e83d9..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/StyleProps.js +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - TextAreaEntry, - isTextFieldEntryEdited, CollapsibleEntry, -} from '@bpmn-io/properties-panel'; - -import { useService } from '../../../utils'; - -function Style(props) { - const { element } = props; - - const debounce = useService('debounceInput'); - - const options = { - component: TextAreaEntry, - element, - id: 'style', - debounce, - autoResize: true, - disabled: true, - getValue: (e) => { - return JSON.stringify(e.businessObject.style, null, 2); - }, - }; - - return CollapsibleEntry({ - id: 'collapsible-props', - label: 'Style', - element, - entries: [options], - }); -} - -export default function StateProps(props) { - const { - element, - } = props; - - return [ - { - component: Style, - element, - isEdited: isTextFieldEntryEdited, - }, - ]; -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/VersionProps.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/VersionProps.js deleted file mode 100644 index f41a870ca9..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/properties-panel/provider/properties/VersionProps.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { isTextFieldEntryEdited } from '@bpmn-io/properties-panel'; - -import BaseText from './BaseText'; - -export default function VersionProps(props) { - const { - element, - } = props; - - return [ - { - id: 'version', - label: 'Version', - parameterKey: 'Version', - component: BaseText, - element, - isEdited: isTextFieldEntryEdited, - }, - ]; -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/providers/ContextPadProvider.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/providers/ContextPadProvider.js deleted file mode 100644 index 4e8ab26afc..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/providers/ContextPadProvider.js +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - assign, -} from 'min-dash'; - -import { - hasPrimaryModifier, -} from 'diagram-js/lib/util/Mouse'; -import { is } from '../utils'; - -/** - * A provider for DMN elements context pad - */ -export default function ContextPadProvider( - eventBus, - contextPad, - modeling, - elementFactory, - connect, - create, - canvas, - config, - injector, -) { - config = config || {}; - - contextPad.registerProvider(this); - - this.contextPad = contextPad; - this.modeling = modeling; - this.elementFactory = elementFactory; - this.connect = connect; - this.canvas = canvas; - - if (config.autoPlace !== false) { - this.autoPlace = injector.get('autoPlace', false); - } - - eventBus.on('create.end', 250, (event) => { - const { shape } = event.context; - - if (!hasPrimaryModifier(event)) { - return; - } - - const entries = contextPad.getEntries(shape); - - if (entries.replace) { - entries.replace.action.click(event, shape); - } - }); -} - -ContextPadProvider.$inject = [ - 'eventBus', - 'contextPad', - 'modeling', - 'elementFactory', - 'connect', - 'create', - 'canvas', - 'config.contextPad', - 'injector', -]; - -ContextPadProvider.prototype.getContextPadEntries = function (element) { - const { modeling } = this; - const { connect } = this; - - const actions = {}; - - if (element.type === 'label') { - return actions; - } - - const { businessObject } = element; - const { type } = businessObject; - - function startConnect(event, e, autoActivate) { - connect.start(event, e, autoActivate); - } - - function removeElement() { - modeling.removeElements([element]); - } - - assign(actions, { - delete: { - group: 'edit', - className: 'bpmn-icon-trash', - title: 'Remove', - action: { - click: removeElement, - }, - }, - }); - - if (!is(type, 'Connection')) { - assign(actions, { - connect: { - group: 'edit', - className: 'bpmn-icon-connection-multi', - title: 'Connect', - action: { - click: startConnect, - dragstart: startConnect, - }, - }, - }); - } - - return actions; -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/providers/PaletteProvider.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/providers/PaletteProvider.js deleted file mode 100644 index 9558b68c93..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/providers/PaletteProvider.js +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { assign } from 'min-dash'; -import ServiceTask from '../spec/ServiceTask'; -import StartState from '../spec/StartState'; -import ScriptTask from '../spec/ScriptTask'; -import Choice from '../spec/Choice'; -import Succeed from '../spec/Succeed'; -import Fail from '../spec/Fail'; -import Catch from '../spec/Catch'; -import CompensationTrigger from '../spec/CompensationTrigger'; -import SubStateMachine from '../spec/SubStateMachine'; - -const SPEC_LIST = [StartState, ServiceTask, ScriptTask, SubStateMachine, Choice, Succeed, Fail, - Catch, CompensationTrigger]; - -/** - * A palette provider. - */ -export default function PaletteProvider(create, elementFactory, lassoTool, palette) { - this.create = create; - this.elementFactory = elementFactory; - this.lassoTool = lassoTool; - this.palette = palette; - - palette.registerProvider(this); -} - -PaletteProvider.$inject = [ - 'create', - 'elementFactory', - 'lassoTool', - 'palette', -]; - -PaletteProvider.prototype.getPaletteEntries = function () { - const { create } = this; - const { elementFactory } = this; - const { lassoTool } = this; - - function createAction(type, group, className, title, options) { - function createListener(event) { - const shape = elementFactory.createShape(assign({ type }, options)); - create.start(event, shape); - } - - return { - group, - className, - title, - action: { - dragstart: createListener, - click: createListener, - }, - }; - } - - const entries = { - 'lasso-tool': { - group: 'tools', - className: 'palette-icon-lasso-tool', - title: 'Activate Lasso Tool', - action: { - click(event) { - lassoTool.activateSelection(event); - }, - }, - }, - 'tool-separator': { - group: 'tools', - separator: true, - }, - }; - SPEC_LIST.forEach((Spec) => { - const type = Spec.prototype.Type; - entries[`create-${type}`] = createAction(type, 'state', Spec.prototype.THUMBNAIL_CLASS, `Create ${type}`); - }); - return entries; -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/providers/index.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/providers/index.js deleted file mode 100644 index eb108aee27..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/providers/index.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import ContextPadProvider from './ContextPadProvider'; -import PaletteProvider from './PaletteProvider'; - -export default { - __init__: [ - 'contextPadProvider', - 'paletteProvider', - ], - contextPadProvider: ['type', ContextPadProvider], - paletteProvider: ['type', PaletteProvider], -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/render/PathMap.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/render/PathMap.js deleted file mode 100644 index 36ab8a13c2..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/render/PathMap.js +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* eslint-disable max-len */ - -// helpers ////////////////////// - -// copied and adjusted from https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js -const tokenRegex = /\{([^{}]+)\}/g; -const objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g; // matches .xxxxx or ["xxxxx"] to run over object properties - -function replacer(all, key, obj) { - let res = obj; - key.replace(objNotationRegex, (_, name, quote, quotedName, isFunc) => { - name = name || quotedName; - if (res) { - if (name in res) { - res = res[name]; - } - if (typeof res === 'function' && isFunc) { - res = res(); - } - } - }); - res = `${res == null || res === obj ? all : res}`; - - return res; -} - -function format(str, obj) { - return String(str).replace(tokenRegex, (all, key) => { - return replacer(all, key, obj); - }); -} - -/** - * Map containing SVG paths needed by BpmnRenderer. - */ -export default function PathMap() { - /** - * Contains a map of path elements - * - *

Path definition

- * A parameterized path is defined like this: - *
-   * 'GATEWAY_PARALLEL': {
-   *   d: 'm {mx},{my} {e.x0},0 0,{e.x1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +
-          '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',
-   *   height: 17.5,
-   *   width:  17.5,
-   *   heightElements: [2.5, 7.5],
-   *   widthElements: [2.5, 7.5]
-   * }
-   * 
- *

It's important to specify a correct height and width for the path as the scaling - * is based on the ratio between the specified height and width in this object and the - * height and width that is set as scale target (Note x,y coordinates will be scaled with - * individual ratios).

- *

The 'heightElements' and 'widthElements' array must contain the values that will be scaled. - * The scaling is based on the computed ratios. - * Coordinates on the y axis should be in the heightElement's array, they will be scaled using - * the computed ratio coefficient. - * In the parameterized path the scaled values can be accessed through the 'e' object in {} brackets. - *

    - *
  • The values for the y axis can be accessed in the path string using {e.y0}, {e.y1}, ....
  • - *
  • The values for the x axis can be accessed in the path string using {e.x0}, {e.x1}, ....
  • - *
- * The numbers x0, x1 respectively y0, y1, ... map to the corresponding array index. - *

- m1,1 - l 0,55.3 - c 29.8,19.7 48.4,-4.2 67.2,-6.7 - c 12.2,-2.3 19.8,1.6 30.8,6.2 - l 0,-54.6 - z - */ - this.pathMap = { - TASK_TYPE_SERVICE: { - d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' - + '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' - + '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' - + 'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' - + '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' - + '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' - + 'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' - + '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' - + 'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' - + 'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' - + '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' - + 'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' - + 'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' - + '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' - + '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z', - }, - TASK_TYPE_SERVICE_FILL: { - d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' - + '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' - + '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z', - }, - MARKER_COMPENSATION: { - d: 'm {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z', - height: 10, - width: 21, - heightElements: [], - widthElements: [], - }, - MARKER_LOOP: { - d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' - + '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' - + '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' - + 'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902', - height: 13.9, - width: 13.7, - heightElements: [], - widthElements: [], - }, - MARKER_SUB_PROCESS: { - d: 'm{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0', - height: 10, - width: 10, - heightElements: [], - widthElements: [], - }, - TASK_TYPE_SCRIPT: { - d: 'm {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 ' - + 'c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z ' - + 'm -7,-12 l 5,0 ' - + 'm -4.5,3 l 4.5,0 ' - + 'm -3,3 l 5,0' - + 'm -4,3 l 5,0', - height: 15, - width: 12.6, - heightElements: [6, 14], - widthElements: [10.5, 21], - }, - GATEWAY_EXCLUSIVE: { - d: 'm {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} ' - + '{e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} ' - + '{e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z', - height: 17.5, - width: 17.5, - heightElements: [8.5, 6.5312, -6.5312, -8.5], - widthElements: [6.5, -6.5, 3, -3, 5, -5], - }, - EVENT_ERROR: { - d: 'm {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z', - height: 36, - width: 36, - heightElements: [0.023, 8.737, 8.151, 16.564, 10.591, 8.714], - widthElements: [0.085, 6.672, 6.97, 4.273, 5.337, 6.636], - }, - EVENT_COMPENSATION: { - d: 'm {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z', - height: 36, - width: 36, - heightElements: [6.5, 13, 0.4, 6.1], - widthElements: [9, 9.3, 8.7], - }, - }; - - this.getRawPath = function getRawPath(pathId) { - return this.pathMap[pathId].d; - }; - - /** - * Scales the path to the given height and width. - *

Use case

- *

Use case is to scale the content of elements (event, gateways) based - * on the element bounding box's size. - *

- *

Why not transform

- *

Scaling a path with transform() will also scale the stroke and IE does not support - * the option 'non-scaling-stroke' to prevent this. - * Also there are use cases where only some parts of a path should be - * scaled.

- * - * @param {string} pathId The ID of the path. - * @param {Object} param

- * Example param object scales the path to 60% size of the container (data.width, data.height). - *

-   *   {
-   *     xScaleFactor: 0.6,
-   *     yScaleFactor:0.6,
-   *     containerWidth: data.width,
-   *     containerHeight: data.height,
-   *     position: {
-   *       mx: 0.46,
-   *       my: 0.2,
-   *     }
-   *   }
-   *   
- *
    - *
  • targetpathwidth = xScaleFactor * containerWidth
  • - *
  • targetpathheight = yScaleFactor * containerHeight
  • - *
  • Position is used to set the starting coordinate of the path. M is computed: - *
      - *
    • position.x * containerWidth
    • - *
    • position.y * containerHeight
    • - *
    - * Center of the container
     position: {
    -   *       mx: 0.5,
    -   *       my: 0.5,
    -   *     }
    - * Upper left corner of the container - *
     position: {
    -   *       mx: 0.0,
    -   *       my: 0.0,
    -   *     }
    - *
  • - *
- *

- * - */ - this.getScaledPath = function getScaledPath(pathId, param) { - const rawPath = this.pathMap[pathId]; - - // positioning - // compute the start point of the path - let mx; let - my; - - if (param.abspos) { - mx = param.abspos.x; - my = param.abspos.y; - } else { - mx = param.containerWidth * param.position.mx; - my = param.containerHeight * param.position.my; - } - - const coordinates = {}; // map for the scaled coordinates - if (param.position) { - // path - const heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor; - const widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor; - - // Apply height ratio - for (let heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) { - coordinates[`y${heightIndex}`] = rawPath.heightElements[heightIndex] * heightRatio; - } - - // Apply width ratio - for (let widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) { - coordinates[`x${widthIndex}`] = rawPath.widthElements[widthIndex] * widthRatio; - } - } - - // Apply value to raw path - const path = format(rawPath.d, { - mx, - my, - e: coordinates, - }); - return path; - }; -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/render/Renderer.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/render/Renderer.js deleted file mode 100644 index fcf6884ede..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/render/Renderer.js +++ /dev/null @@ -1,697 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import inherits from 'inherits-browser'; - -import { assign, forEach, isObject } from 'min-dash'; - -import { attr as domAttr, query as domQuery } from 'min-dom'; - -import { append as svgAppend, attr as svgAttr, create as svgCreate } from 'tiny-svg'; - -import BaseRenderer from 'diagram-js/lib/draw/BaseRenderer'; - -import { createLine } from 'diagram-js/lib/util/RenderUtil'; -import { translate } from 'diagram-js/lib/util/SvgTransformUtil'; - -const BLACK = 'hsl(225, 10%, 15%)'; -const TASK_BORDER_RADIUS = 10; -const DEFAULT_FILL_OPACITY = 0.95; - -// helper functions ////////////////////// - -function getSemantic(element) { - return element.businessObject; -} - -function colorEscape(str) { - // only allow characters and numbers - return str.replace(/[^0-9a-zA-z]+/g, '_'); -} - -function getStrokeColor(element, defaultColor) { - return defaultColor; -} - -function getFillColor(element, defaultColor) { - return defaultColor; -} - -function getLabelColor(element, defaultColor, defaultStrokeColor) { - return defaultColor || getStrokeColor(element, defaultStrokeColor); -} - -export default function Renderer(config, eventBus, pathMap, styles, textRenderer, canvas) { - BaseRenderer.call(this, eventBus); - - const { computeStyle } = styles; - - const markers = {}; - - const defaultFillColor = (config && config.defaultFillColor) || 'white'; - const defaultStrokeColor = (config && config.defaultStrokeColor) || BLACK; - const defaultLabelColor = (config && config.defaultLabelColor); - - function shapeStyle(attrs) { - return styles.computeStyle(attrs, { - strokeLinecap: 'round', - strokeLinejoin: 'round', - stroke: BLACK, - strokeWidth: 2, - fill: 'white', - }); - } - - function addMarker(id, options) { - const attrs = assign({ - strokeWidth: 1, - strokeLinecap: 'round', - strokeDasharray: 'none', - }, options.attrs); - - const ref = options.ref || { x: 0, y: 0 }; - - const scale = options.scale || 1; - - // fix for safari / chrome / firefox bug not correctly - // resetting stroke dash array - if (attrs.strokeDasharray === 'none') { - attrs.strokeDasharray = [10000, 1]; - } - - const markerElement = svgCreate('marker'); - - svgAttr(options.element, attrs); - - svgAppend(markerElement, options.element); - - svgAttr(markerElement, { - id, - viewBox: '0 0 20 20', - refX: ref.x, - refY: ref.y, - markerWidth: 20 * scale, - markerHeight: 20 * scale, - orient: 'auto', - }); - - // eslint-disable-next-line no-underscore-dangle - let defs = domQuery('defs', canvas._svg); - - if (!defs) { - defs = svgCreate('defs'); - - // eslint-disable-next-line no-underscore-dangle - svgAppend(canvas._svg, defs); - } - - svgAppend(defs, markerElement); - - markers[id] = markerElement; - } - - function createMarker(id, type, fill, stroke) { - const end = svgCreate('path'); - svgAttr(end, { d: 'M 1 5 L 11 10 L 1 15 Z' }); - - if (type === 'connection-end') { - addMarker(id, { - element: end, - attrs: { - fill: stroke, - stroke: 'none', - }, - ref: { x: 11, y: 10 }, - scale: 1, - }); - } - - if (type === 'default-choice-marker') { - const defaultChoiceMarker = svgCreate('path', { - d: 'M 6 4 L 10 16', - ...shapeStyle({ - stroke, - }), - }); - - addMarker(id, { - element: defaultChoiceMarker, - ref: { x: 0, y: 10 }, - scale: 1, - }); - } - } - - function marker(type, fill, stroke) { - const id = `${type}-${colorEscape(fill) - }-${colorEscape(stroke)}`; - - if (!markers[id]) { - createMarker(id, type, fill, stroke); - } - - return `url(#${id})`; - } - - function drawCircle(parentGfx, width, height, offset, attrs) { - if (isObject(offset)) { - attrs = offset; - offset = 0; - } - - offset = offset || 0; - - attrs = shapeStyle(attrs); - - if (attrs.fill === 'none') { - delete attrs.fillOpacity; - } - - const cx = width / 2; - const cy = height / 2; - - const circle = svgCreate('circle', { - cx, - cy, - r: Math.round((width + height) / 4 - offset), - ...attrs, - }); - - svgAppend(parentGfx, circle); - - return circle; - } - - function drawRect(p, width, height, r, offset, attrs) { - if (isObject(offset)) { - attrs = offset; - offset = 0; - } - - offset = offset || 0; - - attrs = computeStyle(attrs, { - stroke: BLACK, - strokeWidth: 2, - fill: 'white', - }); - - const rect = svgCreate('rect'); - svgAttr(rect, { - x: offset, - y: offset, - width: width - offset * 2, - height: height - offset * 2, - rx: r, - ry: r, - }); - svgAttr(rect, attrs); - - svgAppend(p, rect); - - return rect; - } - - function renderLabel(p, label, options) { - const text = textRenderer.createText(label || '', options); - - domAttr(text, 'class', 'djs-label'); - - svgAppend(p, text); - - return text; - } - - function renderEmbeddedLabel(p, element, align, options) { - const { Name } = element.businessObject; - - options = assign({ - box: element, - align, - padding: 5, - style: { - fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor), - }, - }, options); - - return renderLabel(p, Name, options); - } - - function drawPath(p, d, attrs) { - attrs = computeStyle(attrs, ['no-fill'], { - strokeWidth: 2, - stroke: BLACK, - }); - - const path = svgCreate('path'); - svgAttr(path, { d }); - svgAttr(path, attrs); - - svgAppend(p, path); - - return path; - } - - function drawDiamond(parentGfx, width, height, attrs) { - const x2 = width / 2; - const y2 = height / 2; - - const points = [ - { x: x2, y: 0 }, - { x: width, y: y2 }, - { x: x2, y: height }, - { x: 0, y: y2 }, - ]; - - const pointsString = points.map((point) => { - return `${point.x},${point.y}`; - }).join(' '); - - attrs = shapeStyle(attrs); - - const polygon = svgCreate('polygon', { - ...attrs, - points: pointsString, - }); - - svgAppend(parentGfx, polygon); - - return polygon; - } - - function drawLine(p, waypoints, attrs) { - attrs = computeStyle(attrs, ['no-fill'], { - stroke: BLACK, - strokeWidth: 2, - fill: 'none', - }); - - const line = createLine(waypoints, attrs); - - svgAppend(p, line); - - return line; - } - - function drawMarker(type, parentGfx, path, attrs) { - return drawPath(parentGfx, path, assign({ 'data-marker': type }, attrs)); - } - - let handlers; - - function renderer(type) { - return handlers[type]; - } - - function attachTaskMarkers(p, element, taskMarkers) { - const obj = getSemantic(element); - - const sub = taskMarkers && taskMarkers.indexOf('SubStateMachineMarker') !== -1; - let position; - - if (sub) { - position = { - seq: -21, - parallel: -22, - compensation: -42, - loop: -18, - }; - } else { - position = { - seq: -3, - parallel: -6, - compensation: -27, - loop: 0, - }; - } - - forEach(taskMarkers, (m) => { - renderer(m)(p, element, position); - }); - - if (obj.IsForCompensation) { - renderer('CompensationMarker')(p, element, position); - } - - const { Loop } = obj; - - if (Loop) { - renderer('LoopMarker')(p, element, position); - } - } - - handlers = { - Transition(p, element) { - const fill = getFillColor(element, defaultFillColor); - const stroke = getStrokeColor(element, defaultStrokeColor); - const attrs = { - stroke, - strokeWidth: 1, - strokeLinecap: 'round', - strokeLinejoin: 'round', - markerEnd: marker('connection-end', fill, stroke), - }; - - return drawLine(p, element.waypoints, attrs); - }, - ChoiceEntry(p, element) { - const fill = getFillColor(element, defaultFillColor); - const stroke = getStrokeColor(element, defaultStrokeColor); - const attrs = { - stroke, - strokeWidth: 1, - strokeLinecap: 'round', - strokeLinejoin: 'round', - markerEnd: marker('connection-end', fill, stroke), - }; - - const path = drawLine(p, element.waypoints, attrs); - - if (getSemantic(element).Default) { - svgAttr(path, { - markerStart: marker('default-choice-marker', fill, stroke), - }); - } - - return path; - }, - ExceptionMatch(p, element) { - return renderer('Transition')(p, element); - }, - Compensation(p, element) { - const stroke = getStrokeColor(element, defaultStrokeColor); - const attrs = { - stroke, - strokeWidth: 1, - strokeLinecap: 'round', - strokeLinejoin: 'round', - strokeDasharray: '10, 11', - }; - - return drawLine(p, element.waypoints, attrs); - }, - StartState(parentGfx, element) { - return drawCircle(parentGfx, element.width, element.height, { - fill: getFillColor(element, defaultFillColor), - stroke: getStrokeColor(element, defaultStrokeColor), - }); - }, - Task(parentGfx, element, additionalMarkers) { - const attrs = { - fill: getFillColor(element, defaultFillColor), - stroke: getStrokeColor(element, defaultStrokeColor), - fillOpacity: DEFAULT_FILL_OPACITY, - }; - - const rect = drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, attrs); - - renderEmbeddedLabel(parentGfx, element, 'center-middle'); - attachTaskMarkers(parentGfx, element, additionalMarkers); - - return rect; - }, - ServiceTask(parentGfx, element) { - const task = renderer('Task')(parentGfx, element); - const pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', { - abspos: { - x: 12, - y: 18, - }, - }); - - /* service bg */ drawPath(parentGfx, pathDataBG, { - strokeWidth: 1, - fill: getFillColor(element, defaultFillColor), - stroke: getStrokeColor(element, defaultStrokeColor), - }); - - const fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', { - abspos: { - x: 17.2, - y: 18, - }, - }); - - /* service fill */ drawPath(parentGfx, fillPathData, { - strokeWidth: 0, - fill: getFillColor(element, defaultFillColor), - }); - - const pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', { - abspos: { - x: 17, - y: 22, - }, - }); - - /* service */ drawPath(parentGfx, pathData, { - strokeWidth: 1, - fill: getFillColor(element, defaultFillColor), - stroke: getStrokeColor(element, defaultStrokeColor), - }); - - return task; - }, - ScriptTask(parentGfx, element) { - const task = renderer('Task')(parentGfx, element); - const pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', { - abspos: { - x: 15, - y: 20, - }, - }); - - /* script path */ drawPath(parentGfx, pathData, { - strokeWidth: 1, - stroke: getStrokeColor(element, defaultStrokeColor), - }); - - return task; - }, - SubStateMachine(parentGfx, element) { - return renderer('Task')(parentGfx, element, ['SubStateMachineMarker']); - }, - SubStateMachineMarker(parentGfx, element) { - const markerRect = drawRect(parentGfx, 14, 14, 0, { - strokeWidth: 1, - fill: getFillColor(element, defaultFillColor), - stroke: getStrokeColor(element, defaultStrokeColor), - }); - - translate(markerRect, element.width / 2 - 7.5, element.height - 20); - - const markerPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', { - xScaleFactor: 1.5, - yScaleFactor: 1.5, - containerWidth: element.width, - containerHeight: element.height, - position: { - mx: (element.width / 2 - 7.5) / element.width, - my: (element.height - 20) / element.height, - }, - }); - - drawMarker('sub-process', parentGfx, markerPath, { - fill: getFillColor(element, defaultFillColor), - stroke: getStrokeColor(element, defaultStrokeColor), - }); - }, - LoopMarker(parentGfx, element, position) { - const markerPath = pathMap.getScaledPath('MARKER_LOOP', { - xScaleFactor: 1, - yScaleFactor: 1, - containerWidth: element.width, - containerHeight: element.height, - position: { - mx: ((element.width / 2 + position.loop) / element.width), - my: (element.height - 7) / element.height, - }, - }); - - drawMarker('loop', parentGfx, markerPath, { - strokeWidth: 1.5, - fill: getFillColor(element, defaultFillColor), - stroke: getStrokeColor(element, defaultStrokeColor), - strokeMiterlimit: 0.5, - }); - }, - CompensationMarker(parentGfx, element, position) { - const markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', { - xScaleFactor: 1, - yScaleFactor: 1, - containerWidth: element.width, - containerHeight: element.height, - position: { - mx: ((element.width / 2 + position.compensation) / element.width), - my: (element.height - 13) / element.height, - }, - }); - - drawMarker('compensation', parentGfx, markerMath, { - strokeWidth: 1, - fill: getFillColor(element, defaultFillColor), - stroke: getStrokeColor(element, defaultStrokeColor), - }); - }, - Gateway(parentGfx, element) { - return drawDiamond(parentGfx, element.width, element.height, { - fill: getFillColor(element, defaultFillColor), - fillOpacity: DEFAULT_FILL_OPACITY, - stroke: getStrokeColor(element, defaultStrokeColor), - }); - }, - Choice(parentGfx, element) { - const diamond = renderer('Gateway')(parentGfx, element); - - const pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', { - xScaleFactor: 0.4, - yScaleFactor: 0.4, - containerWidth: element.width, - containerHeight: element.height, - position: { - mx: 0.32, - my: 0.3, - }, - }); - - drawPath(parentGfx, pathData, { - strokeWidth: 1, - fill: getStrokeColor(element, defaultStrokeColor), - stroke: getStrokeColor(element, defaultStrokeColor), - }); - - return diamond; - }, - Succeed(parentGfx, element) { - return drawCircle(parentGfx, element.width, element.height, { - strokeWidth: 4, - fill: getFillColor(element, defaultFillColor), - stroke: getStrokeColor(element, defaultStrokeColor), - }); - }, - Error(parentGfx, element, fill) { - const pathData = pathMap.getScaledPath('EVENT_ERROR', { - xScaleFactor: 1.1, - yScaleFactor: 1.1, - containerWidth: element.width, - containerHeight: element.height, - position: { - mx: 0.2, - my: 0.722, - }, - }); - return drawPath(parentGfx, pathData, { - strokeWidth: 1, - fill: fill ? getStrokeColor(element, defaultStrokeColor) : 'none', - stroke: getStrokeColor(element, defaultStrokeColor), - }); - }, - Fail(parentGfx, element) { - const circle = handlers.Succeed(parentGfx, element); - renderer('Error')(parentGfx, element, true); - return circle; - }, - Event(parentGfx, element) { - const attrs = { - strokeWidth: 1.5, - fill: getFillColor(element, defaultFillColor), - stroke: getStrokeColor(element, defaultStrokeColor), - }; - - // apply fillOpacity - const outerAttrs = { - ...attrs, - fillOpacity: 1, - }; - - // apply no-fill - const innerAttrs = { - ...attrs, - fill: 'none', - }; - - const outer = drawCircle(parentGfx, element.width, element.height, outerAttrs); - drawCircle(parentGfx, element.width, element.height, 3, innerAttrs); - return outer; - }, - Catch(parentGfx, element) { - const outer = renderer('Event')(parentGfx, element); - renderer('Error')(parentGfx, element); - - return outer; - }, - CompensationTrigger(parentGfx, element) { - const outer = renderer('Event')(parentGfx, element); - const pathData = pathMap.getScaledPath('EVENT_COMPENSATION', { - xScaleFactor: 1, - yScaleFactor: 1, - containerWidth: element.width, - containerHeight: element.height, - position: { - mx: 0.22, - my: 0.5, - }, - }); - - const fill = 'none'; - - drawPath(parentGfx, pathData, { - strokeWidth: 1, - fill, - stroke: getStrokeColor(element, defaultStrokeColor), - }); - return outer; - }, - }; - function drawShape(parent, element) { - const h = handlers[element.type]; - - if (!h) { - return BaseRenderer.prototype.drawShape.apply(this, [parent, element]); - } - return h(parent, element); - } - - function drawConnection(parent, element) { - const { type } = element; - const h = handlers[type]; - - if (!h) { - return BaseRenderer.prototype.drawConnection.apply(this, [parent, element]); - } - return h(parent, element); - } - - // eslint-disable-next-line no-unused-vars - this.canRender = function (element) { - return true; - }; - - this.drawShape = drawShape; - this.drawConnection = drawConnection; -} - -inherits(Renderer, BaseRenderer); - -Renderer.$inject = [ - 'config.Renderer', - 'eventBus', - 'pathMap', - 'styles', - 'textRenderer', - 'canvas', -]; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/render/TextRenderer.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/render/TextRenderer.js deleted file mode 100644 index eec8cc3361..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/render/TextRenderer.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { assign } from 'min-dash'; - -import TextUtil from 'diagram-js/lib/util/Text'; - -const DEFAULT_FONT_SIZE = 12; -const LINE_HEIGHT_RATIO = 1.2; - -export default function TextRenderer(config) { - const defaultStyle = assign({ - fontFamily: 'Arial, sans-serif', - fontSize: DEFAULT_FONT_SIZE, - fontWeight: 'normal', - lineHeight: LINE_HEIGHT_RATIO, - }, (config && config.defaultStyle) || {}); - - const textUtil = new TextUtil({ - style: defaultStyle, - }); - - /** - * Create a layouted text element. - * - * @param {string} text - * @param {Object} [options] - * - * @return {SVGElement} rendered text - */ - this.createText = function (text, options) { - return textUtil.createText(text, options || {}); - }; - - /** - * Get default text style. - */ - this.getDefaultStyle = function () { - return defaultStyle; - }; -} - -TextRenderer.$inject = [ - 'config.textRenderer', -]; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/render/index.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/render/index.js deleted file mode 100644 index e0b3ec3f25..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/render/index.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Renderer from './Renderer'; -import TextRenderer from './TextRenderer'; -import PathMap from './PathMap'; - -export default { - __init__: ['renderer'], - renderer: ['type', Renderer], - textRenderer: ['type', TextRenderer], - pathMap: ['type', PathMap], -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/BaseSpec.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/BaseSpec.js deleted file mode 100644 index e97efe7a9e..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/BaseSpec.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export default function BaseSpec() { -} - -BaseSpec.prototype.Type = 'Base'; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Catch.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Catch.js deleted file mode 100644 index b18a33c89d..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Catch.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Node from './style/Node'; - -export default class Catch extends Node { - -} - -Catch.prototype.Type = 'Catch'; - -Catch.prototype.THUMBNAIL_CLASS = 'bpmn-icon-intermediate-event-catch-error'; - -Catch.prototype.DEFAULT_SIZE = { - width: 36, - height: 36, -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Choice.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Choice.js deleted file mode 100644 index a7758ed3aa..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Choice.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import State from './State'; - -export default class Choice extends State { - importJson(json) { - super.importJson(json); - if (json.edge) { - this.Choices.forEach((choice) => { - if (json.edge[choice.Next]) { - json.edge[choice.Next].Expression = choice.Expression; - } - }); - if (json.edge[this.Default]) { - json.edge[this.Default].Default = true; - } - } - delete this.Choices; - delete this.Default; - } -} - -Choice.prototype.Type = 'Choice'; - -Choice.prototype.THUMBNAIL_CLASS = 'bpmn-icon-gateway-xor'; - -Choice.prototype.DEFAULT_SIZE = { - width: 50, - height: 50, -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/ChoiceEntry.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/ChoiceEntry.js deleted file mode 100644 index 43161baa14..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/ChoiceEntry.js +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Transition from './Transition'; - -export default class ChoiceEntry extends Transition { - constructor() { - super(); - this.Expression = ''; - this.Default = false; - } - - importJson(json) { - super.importJson(json); - this.Expression = json.Expression; - this.Default = json.Default; - } -} - -ChoiceEntry.prototype.Type = 'ChoiceEntry'; - -ChoiceEntry.prototype.THUMBNAIL_CLASS = 'bpmn-icon-connection'; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Compensation.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Compensation.js deleted file mode 100644 index d1eb7eea62..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Compensation.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Transition from './Transition'; - -export default class Compensation extends Transition { - -} - -Compensation.prototype.Type = 'Compensation'; - -Compensation.prototype.THUMBNAIL_CLASS = 'bpmn-icon-connection-multi'; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/CompensationTrigger.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/CompensationTrigger.js deleted file mode 100644 index 416431df5f..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/CompensationTrigger.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import State from './State'; - -export default class CompensationTrigger extends State { - -} - -CompensationTrigger.prototype.Type = 'CompensationTrigger'; - -CompensationTrigger.prototype.THUMBNAIL_CLASS = 'bpmn-icon-intermediate-event-catch-compensation'; - -CompensationTrigger.prototype.DEFAULT_SIZE = { - width: 36, - height: 36, -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/ExceptionMatch.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/ExceptionMatch.js deleted file mode 100644 index d14e5b36fd..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/ExceptionMatch.js +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Transition from './Transition'; - -export default class ExceptionMatch extends Transition { - constructor() { - super(); - this.Exceptions = []; - } - - importJson(json) { - super.importJson(json); - this.Exceptions = json.Exceptions; - } - - exportJson() { - const json = super.exportJson(); - json.style.source = this.style.source.host.businessObject.Name; - return json; - } -} - -ExceptionMatch.prototype.Type = 'ExceptionMatch'; - -ExceptionMatch.prototype.THUMBNAIL_CLASS = 'bpmn-icon-connection'; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Fail.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Fail.js deleted file mode 100644 index 42e4ce1388..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Fail.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import State from './State'; - -export default class Fail extends State { - constructor() { - super(); - this.ErrorCode = ''; - this.Message = ''; - } -} - -Fail.prototype.Type = 'Fail'; - -Fail.prototype.THUMBNAIL_CLASS = 'bpmn-icon-end-event-error'; - -Fail.prototype.DEFAULT_SIZE = { - width: 36, - height: 36, -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/ScriptTask.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/ScriptTask.js deleted file mode 100644 index 4eaea829f0..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/ScriptTask.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import TaskState from './TaskState'; - -export default class ScriptTask extends TaskState { - constructor() { - super(); - this.ScriptType = 'groovy'; - this.ScriptContent = ''; - } -} - -ScriptTask.prototype.Type = 'ScriptTask'; - -ScriptTask.prototype.THUMBNAIL_CLASS = 'bpmn-icon-script-task'; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/ServiceTask.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/ServiceTask.js deleted file mode 100644 index 1dfdd27f2d..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/ServiceTask.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import TaskState from './TaskState'; - -export default class ServiceTask extends TaskState { - constructor() { - super(); - this.ServiceName = ''; - this.ServiceMethod = ''; - } -} - -ServiceTask.prototype.Type = 'ServiceTask'; - -ServiceTask.prototype.THUMBNAIL_CLASS = 'bpmn-icon-service-task'; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/StartState.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/StartState.js deleted file mode 100644 index d1531fa8d8..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/StartState.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Node from './style/Node'; - -export default class StartState extends Node { - -} - -StartState.prototype.Type = 'StartState'; - -StartState.prototype.THUMBNAIL_CLASS = 'bpmn-icon-start-event-none'; - -StartState.prototype.DEFAULT_SIZE = { - width: 36, - height: 36, -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/State.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/State.js deleted file mode 100644 index 4f8e3ba8b8..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/State.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { assign } from 'min-dash'; -import { randomString } from '../utils'; -import Node from './style/Node'; - -export default class State extends Node { - constructor() { - super(); - this.Name = `${this.Type}-${randomString()}`; - } - - importJson(json) { - super.importJson(json); - const { style, edge, Type, Next, ...props } = json; - assign(this, props); - } - - exportJson() { - const json = super.exportJson(); - const { style, ...props } = this; - return assign(json, props, { Type: this.Type }); - } -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/StateMachine.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/StateMachine.js deleted file mode 100644 index 689f9a9a6d..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/StateMachine.js +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { assign } from 'min-dash'; -import { randomString } from '../utils'; -import BaseSpec from './BaseSpec'; - -export default class StateMachine extends BaseSpec { - constructor() { - super(); - this.Name = `${this.Type}-${randomString()}`; - } - - importJson(json) { - const { style, edge, StartState, States, ...props } = json; - assign(this, props); - } - - exportJson() { - return assign({}, this); - } -} - -StateMachine.prototype.THUMBNAIL_CLASS = 'bpmn-icon-transaction'; - -StateMachine.prototype.Type = 'StateMachine'; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/SubStateMachine.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/SubStateMachine.js deleted file mode 100644 index 79a2a41e86..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/SubStateMachine.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import TaskState from './TaskState'; - -export default class SubStateMachine extends TaskState { - constructor() { - super(); - this.StateMachineName = ''; - } -} - -SubStateMachine.prototype.Type = 'SubStateMachine'; - -SubStateMachine.prototype.THUMBNAIL_CLASS = 'bpmn-icon-subprocess-collapsed'; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Succeed.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Succeed.js deleted file mode 100644 index ad53a7b923..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Succeed.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import State from './State'; - -export default class Succeed extends State { -} - -Succeed.prototype.Type = 'Succeed'; - -Succeed.prototype.THUMBNAIL_CLASS = 'bpmn-icon-end-event-none'; - -Succeed.prototype.DEFAULT_SIZE = { - width: 36, - height: 36, -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/TaskState.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/TaskState.js deleted file mode 100644 index 566ab67e77..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/TaskState.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import State from './State'; - -export default class TaskState extends State { - constructor() { - super(); - this.IsForCompensation = false; - this.Input = [{}]; - this.Output = {}; - this.Status = {}; - this.Retry = []; - } - - importJson(json) { - super.importJson(json); - delete this.catch; - } - - exportJson() { - const json = super.exportJson(); - const { Catch } = json; - if (Catch) { - json.catch = json.Catch.exportJson(); - json.Catch = []; - } - - if (this.CompensateState) { - json.CompensateState = this.CompensateState.Name; - } - return json; - } -} - -TaskState.prototype.DEFAULT_SIZE = { - width: 100, - height: 80, -}; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Transition.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Transition.js deleted file mode 100644 index 2a16482792..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/Transition.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Edge from './style/Edge'; - -export default class Transition extends Edge { - exportJson() { - const json = super.exportJson(); - json.Type = this.Type; - return json; - } -} - -Transition.prototype.THUMBNAIL_CLASS = 'bpmn-icon-connection'; - -Transition.prototype.Type = 'Transition'; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/style/Edge.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/style/Edge.js deleted file mode 100644 index 7ff1391ba8..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/style/Edge.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { assign } from 'min-dash'; -import BaseSpec from '../BaseSpec'; -import EdgeStyle from './EdgeStyle'; - -export default class Edge extends BaseSpec { - style = new EdgeStyle(); - - importJson(json) { - this.style.source = json.style.source; - this.style.target = json.style.target; - assign(this.style.waypoints, json.style.waypoints); - } - - exportJson() { - const json = assign({ style: new EdgeStyle() }, { style: { waypoints: this.style.waypoints } }); - json.style.source = this.style.source.businessObject.Name; - json.style.target = this.style.target.businessObject.Name; - return json; - } -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/style/EdgeStyle.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/style/EdgeStyle.js deleted file mode 100644 index 4538a94a90..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/style/EdgeStyle.js +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import BaseSpec from '../BaseSpec'; - -export default class EdgeStyle extends BaseSpec { - /** - * @type {djs.model.Base} - */ - source; - - /** - * @type {djs.model.Base} - */ - target; - - /** - * @typedef {{original: WayPoint, x: number, y: number}} WayPoint - */ - /** - * @type {[WayPoint]} - */ - waypoints = []; -} - -EdgeStyle.prototype.Type = 'Edge'; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/style/Node.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/style/Node.js deleted file mode 100644 index dc06861bb1..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/style/Node.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { assign } from 'min-dash'; -import BaseSpec from '../BaseSpec'; -import NodeStyle from './NodeStyle'; -// import THUMBNAIL from '../icons/bpmn-icon-service-task.svg'; - -export default class Node extends BaseSpec { - style = new NodeStyle(); - - importJson(json) { - assign(this.style.bounds, json.style.bounds); - } - - exportJson() { - return assign({}, { style: this.style }); - } -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/style/NodeStyle.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/style/NodeStyle.js deleted file mode 100644 index c26d2867bb..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/spec/style/NodeStyle.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import BaseSpec from '../BaseSpec'; - -export default class NodeStyle extends BaseSpec { - /** - * @typedef {{x: number, y: number, width: number, height: number}} Bounds - * @type {Bounds} - */ - bounds = {}; -} - -NodeStyle.prototype.Type = 'Node'; diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/utils/index.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/src/utils/index.js deleted file mode 100644 index 72054ca1c5..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/src/utils/index.js +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { forEach, reduce } from 'min-dash'; -import { useContext } from '@bpmn-io/properties-panel/preact/hooks'; -import PropertiesPanelContext from '../properties-panel/PropertiesPanelContext'; - -/** - * Returns a random generated string for initial decision definition id. - * @returns {string} - */ -export function randomString() { - // noinspection SpellCheckingInspection - const chars = 'abcdefghijklmnopqrstuvwxyz1234567890'; - const maxPos = chars.length; - let str = ''; - for (let i = 0; i < 7; i++) { - str += chars.charAt(Math.floor(Math.random() * maxPos)); - } - return str; -} - -export function useService(type, strict) { - const { getService } = useContext(PropertiesPanelContext); - - return getService(type, strict); -} - -export function getProperties(businessObject, propertyNames) { - return reduce(propertyNames, (result, key) => { - result[key] = businessObject[key]; - return result; - }, {}); -} - -export function setProperties(businessObject, properties, override) { - if (override) { - Object.keys(businessObject) - .filter((key) => key !== 'style') - .forEach((key) => delete businessObject[key]); - } - forEach(properties, (value, key) => { - businessObject[key] = value; - }); -} - -export function is(element, target) { - const type = element?.businessObject?.Type || element?.Type || element; - - if (target === 'Task') { - return type === 'ServiceTask' || type === 'ScriptTask' || type === 'SubStateMachine'; - } - - if (target === 'Connection') { - return type === 'Transition' || type === 'ChoiceEntry' || type === 'ExceptionMatch' || type === 'Compensation'; - } - - return type === target; -} diff --git a/laokou-cloud/laokou-seata-saga-statemachine-designer/webpack.config.js b/laokou-cloud/laokou-seata-saga-statemachine-designer/webpack.config.js deleted file mode 100644 index 04369f9497..0000000000 --- a/laokou-cloud/laokou-seata-saga-statemachine-designer/webpack.config.js +++ /dev/null @@ -1,46 +0,0 @@ -const CopyPlugin = require('copy-webpack-plugin'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); - -module.exports = (env, options) => { - return { - entry: { - bundle: './src/index.js', - }, - output: { - path: `${__dirname}/dist`, - filename: '[name].js', - }, - plugins: [ - new CopyPlugin({ - patterns: [ - { from: 'public' }, - ], - }), - new MiniCssExtractPlugin(), - new HtmlWebpackPlugin({ - template: 'src/index.html', - filename: 'index.html', - }), - ], - module: { - rules: [ - { - test: /\.m?js$/, - exclude: /(node_modules|bower_components)/, - use: { - loader: 'babel-loader', - options: { - babelrc: true, - }, - }, - }, - { - test: /\.css$/, - use: [MiniCssExtractPlugin.loader, 'css-loader'], - }, - ], - }, - devtool: options.mode === 'production' ? 'nosources-source-map' : 'source-map', - }; -}; diff --git a/laokou-cloud/laokou-seata/Dockerfile b/laokou-cloud/laokou-seata/Dockerfile deleted file mode 100644 index b34bc2eb66..0000000000 --- a/laokou-cloud/laokou-seata/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -# /** -# * Copyright (c) 2022-2024 KCloud-Platform-IoT Author or Authors. All Rights Reserved. -# *

-# * Licensed under the Apache License, Version 2.0 (the "License"); -# * you may not use this file except in compliance with the License. -# * You may obtain a copy of the License at -# *

-# * http://www.apache.org/licenses/LICENSE-2.0 -# *

-# * Unless required by applicable law or agreed to in writing, software -# * distributed under the License is distributed on an "AS IS" BASIS, -# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# * See the License for the specific language governing permissions and -# * limitations under the License. -# */ -# 基础镜像 -FROM docker.io/tabatad/jdk21 -# 信息 -LABEL maintainer="laokou" -LABEL description="laokou-seata" -# 复制文件 -COPY target/laokou-seata.jar app.jar -# 暴露端口 -EXPOSE 7091 -CMD java $JVM_OPTS -jar app.jar >/dev/null 2>&1 diff --git a/laokou-cloud/laokou-seata/pom.xml b/laokou-cloud/laokou-seata/pom.xml deleted file mode 100644 index 46038ecee3..0000000000 --- a/laokou-cloud/laokou-seata/pom.xml +++ /dev/null @@ -1,234 +0,0 @@ - - - - laokou-cloud - org.laokou - 3.3.2 - - 4.0.0 - laokou-seata - - - - 2.0.0 - - 2.7.18 - - 0.2.0-RC2 - - 3.10.0 - - 2.0.52 - - 7.4 - - 1.2.23 - - 1.82 - - 1.3.14 - - 4.1.112.Final - - - - - org.projectlombok - lombok - - - org.springframework.boot - spring-boot-starter-web - - - log4j-to-slf4j - org.apache.logging.log4j - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - io.seata - seata-spring-autoconfigure-server - ${seata.version} - - - io.seata - seata-core - ${seata.version} - - - io.seata - seata-config-all - ${seata.version} - - - log4j - log4j - - - io.netty - netty-codec-http - - - - - io.netty - netty-all - ${netty.version} - - - io.seata - seata-discovery-all - ${seata.version} - - - io.seata - seata-serializer-all - ${seata.version} - - - io.seata - seata-compressor-all - ${seata.version} - - - io.seata - seata-metrics-all - ${seata.version} - - - io.seata - seata-console - ${seata.version} - - - com.alibaba - druid - ${druid.version} - - - org.apache.commons - commons-dbcp2 - - - com.zaxxer - HikariCP - - - com.github.ulisesbocchio - jasypt-spring-boot-starter - - - com.beust - jcommander - ${jcommander.version} - - - com.google.guava - guava - - - redis.clients - jedis - ${jedis.version} - - - com.alibaba - fastjson - ${fastjson.version} - - - net.logstash.logback - logstash-logback-encoder - ${logstash-logback-encoder.version} - - - com.github.danielwegener - logback-kafka-appender - ${kafka-appender.version} - - - com.alipay.sofa - jraft-core - ${jraft-core.version} - - - org.codehaus.janino - janino - - - org.springframework.boot - spring-boot-starter-undertow - provided - - - - - - - - org.springframework.boot - spring-boot-starter-parent - ${spring-boot.version} - pom - import - - - - - - ${project.artifactId} - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 21 - 21 - UTF-8 - - -Xlint:deprecation - -parameters - - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot-maven-plugin.version} - - ${project.artifactId} - - io.seata.server.SeataApp - - - - - repackage - - - - - - io.fabric8 - docker-maven-plugin - ${docker-maven-plugin.version} - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${maven-checkstyle-plugin.version} - - true - - - - - - diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/AbstractTCInboundHandler.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/AbstractTCInboundHandler.java deleted file mode 100644 index ecc15cf263..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/AbstractTCInboundHandler.java +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server; - -import io.seata.common.exception.StoreException; -import io.seata.core.exception.AbstractExceptionHandler; -import io.seata.core.exception.TransactionException; -import io.seata.core.exception.TransactionExceptionCode; -import io.seata.core.model.GlobalStatus; -import io.seata.core.protocol.transaction.AbstractGlobalEndRequest; -import io.seata.core.protocol.transaction.AbstractGlobalEndResponse; -import io.seata.core.protocol.transaction.BranchRegisterRequest; -import io.seata.core.protocol.transaction.BranchRegisterResponse; -import io.seata.core.protocol.transaction.BranchReportRequest; -import io.seata.core.protocol.transaction.BranchReportResponse; -import io.seata.core.protocol.transaction.GlobalBeginRequest; -import io.seata.core.protocol.transaction.GlobalBeginResponse; -import io.seata.core.protocol.transaction.GlobalCommitRequest; -import io.seata.core.protocol.transaction.GlobalCommitResponse; -import io.seata.core.protocol.transaction.GlobalLockQueryRequest; -import io.seata.core.protocol.transaction.GlobalLockQueryResponse; -import io.seata.core.protocol.transaction.GlobalReportRequest; -import io.seata.core.protocol.transaction.GlobalReportResponse; -import io.seata.core.protocol.transaction.GlobalRollbackRequest; -import io.seata.core.protocol.transaction.GlobalRollbackResponse; -import io.seata.core.protocol.transaction.GlobalStatusRequest; -import io.seata.core.protocol.transaction.GlobalStatusResponse; -import io.seata.core.protocol.transaction.TCInboundHandler; -import io.seata.core.rpc.RpcContext; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHolder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * The type Abstract tc inbound handler. - * - * @author sharajava - */ -public abstract class AbstractTCInboundHandler extends AbstractExceptionHandler implements TCInboundHandler { - - private static final Logger LOGGER = LoggerFactory.getLogger(AbstractTCInboundHandler.class); - - @Override - public GlobalBeginResponse handle(GlobalBeginRequest request, final RpcContext rpcContext) { - GlobalBeginResponse response = new GlobalBeginResponse(); - exceptionHandleTemplate(new AbstractCallback() { - @Override - public void execute(GlobalBeginRequest request, GlobalBeginResponse response) throws TransactionException { - try { - doGlobalBegin(request, response, rpcContext); - } - catch (StoreException e) { - throw new TransactionException(TransactionExceptionCode.FailedStore, String - .format("begin global request failed. xid=%s, msg=%s", response.getXid(), e.getMessage()), e); - } - } - }, request, response); - return response; - } - - /** - * Do global begin. - * @param request the request - * @param response the response - * @param rpcContext the rpc context - * @throws TransactionException the transaction exception - */ - protected abstract void doGlobalBegin(GlobalBeginRequest request, GlobalBeginResponse response, - RpcContext rpcContext) throws TransactionException; - - @Override - public GlobalCommitResponse handle(GlobalCommitRequest request, final RpcContext rpcContext) { - GlobalCommitResponse response = new GlobalCommitResponse(); - response.setGlobalStatus(GlobalStatus.Committing); - exceptionHandleTemplate(new AbstractCallback() { - @Override - public void execute(GlobalCommitRequest request, GlobalCommitResponse response) - throws TransactionException { - try { - doGlobalCommit(request, response, rpcContext); - } - catch (StoreException e) { - throw new TransactionException(TransactionExceptionCode.FailedStore, String - .format("global commit request failed. xid=%s, msg=%s", request.getXid(), e.getMessage()), e); - } - } - - @Override - public void onTransactionException(GlobalCommitRequest request, GlobalCommitResponse response, - TransactionException tex) { - super.onTransactionException(request, response, tex); - checkTransactionStatus(request, response); - } - - @Override - public void onException(GlobalCommitRequest request, GlobalCommitResponse response, Exception rex) { - super.onException(request, response, rex); - checkTransactionStatus(request, response); - } - - }, request, response); - return response; - } - - /** - * Do global commit. - * @param request the request - * @param response the response - * @param rpcContext the rpc context - * @throws TransactionException the transaction exception - */ - protected abstract void doGlobalCommit(GlobalCommitRequest request, GlobalCommitResponse response, - RpcContext rpcContext) throws TransactionException; - - @Override - public GlobalRollbackResponse handle(GlobalRollbackRequest request, final RpcContext rpcContext) { - GlobalRollbackResponse response = new GlobalRollbackResponse(); - response.setGlobalStatus(GlobalStatus.Rollbacking); - exceptionHandleTemplate(new AbstractCallback() { - @Override - public void execute(GlobalRollbackRequest request, GlobalRollbackResponse response) - throws TransactionException { - try { - doGlobalRollback(request, response, rpcContext); - } - catch (StoreException e) { - throw new TransactionException(TransactionExceptionCode.FailedStore, String - .format("global rollback request failed. xid=%s, msg=%s", request.getXid(), e.getMessage()), e); - } - } - - @Override - public void onTransactionException(GlobalRollbackRequest request, GlobalRollbackResponse response, - TransactionException tex) { - super.onTransactionException(request, response, tex); - // may be appears StoreException outer layer method catch - checkTransactionStatus(request, response); - } - - @Override - public void onException(GlobalRollbackRequest request, GlobalRollbackResponse response, Exception rex) { - super.onException(request, response, rex); - // may be appears StoreException outer layer method catch - checkTransactionStatus(request, response); - } - }, request, response); - return response; - } - - /** - * Do global rollback. - * @param request the request - * @param response the response - * @param rpcContext the rpc context - * @throws TransactionException the transaction exception - */ - protected abstract void doGlobalRollback(GlobalRollbackRequest request, GlobalRollbackResponse response, - RpcContext rpcContext) throws TransactionException; - - @Override - public BranchRegisterResponse handle(BranchRegisterRequest request, final RpcContext rpcContext) { - BranchRegisterResponse response = new BranchRegisterResponse(); - exceptionHandleTemplate(new AbstractCallback() { - @Override - public void execute(BranchRegisterRequest request, BranchRegisterResponse response) - throws TransactionException { - try { - doBranchRegister(request, response, rpcContext); - } - catch (StoreException e) { - throw new TransactionException(TransactionExceptionCode.FailedStore, String - .format("branch register request failed. xid=%s, msg=%s", request.getXid(), e.getMessage()), e); - } - } - }, request, response); - return response; - } - - /** - * Do branch register. - * @param request the request - * @param response the response - * @param rpcContext the rpc context - * @throws TransactionException the transaction exception - */ - protected abstract void doBranchRegister(BranchRegisterRequest request, BranchRegisterResponse response, - RpcContext rpcContext) throws TransactionException; - - @Override - public BranchReportResponse handle(BranchReportRequest request, final RpcContext rpcContext) { - BranchReportResponse response = new BranchReportResponse(); - exceptionHandleTemplate(new AbstractCallback() { - @Override - public void execute(BranchReportRequest request, BranchReportResponse response) - throws TransactionException { - try { - doBranchReport(request, response, rpcContext); - } - catch (StoreException e) { - throw new TransactionException(TransactionExceptionCode.FailedStore, - String.format("branch report request failed. xid=%s, branchId=%s, msg=%s", request.getXid(), - request.getBranchId(), e.getMessage()), - e); - } - } - }, request, response); - return response; - } - - /** - * Do branch report. - * @param request the request - * @param rpcContext the rpc context - * @throws TransactionException the transaction exception - */ - protected abstract void doBranchReport(BranchReportRequest request, BranchReportResponse response, - RpcContext rpcContext) throws TransactionException; - - @Override - public GlobalLockQueryResponse handle(GlobalLockQueryRequest request, final RpcContext rpcContext) { - GlobalLockQueryResponse response = new GlobalLockQueryResponse(); - exceptionHandleTemplate(new AbstractCallback() { - @Override - public void execute(GlobalLockQueryRequest request, GlobalLockQueryResponse response) - throws TransactionException { - try { - doLockCheck(request, response, rpcContext); - } - catch (StoreException e) { - throw new TransactionException(TransactionExceptionCode.FailedStore, String.format( - "global lock query request failed. xid=%s, msg=%s", request.getXid(), e.getMessage()), e); - } - } - }, request, response); - return response; - } - - /** - * Do lock check. - * @param request the request - * @param response the response - * @param rpcContext the rpc context - * @throws TransactionException the transaction exception - */ - protected abstract void doLockCheck(GlobalLockQueryRequest request, GlobalLockQueryResponse response, - RpcContext rpcContext) throws TransactionException; - - @Override - public GlobalStatusResponse handle(GlobalStatusRequest request, final RpcContext rpcContext) { - GlobalStatusResponse response = new GlobalStatusResponse(); - response.setGlobalStatus(GlobalStatus.UnKnown); - exceptionHandleTemplate(new AbstractCallback() { - @Override - public void execute(GlobalStatusRequest request, GlobalStatusResponse response) - throws TransactionException { - try { - doGlobalStatus(request, response, rpcContext); - } - catch (StoreException e) { - throw new TransactionException(TransactionExceptionCode.FailedStore, String - .format("global status request failed. xid=%s, msg=%s", request.getXid(), e.getMessage()), e); - } - } - - @Override - public void onTransactionException(GlobalStatusRequest request, GlobalStatusResponse response, - TransactionException tex) { - super.onTransactionException(request, response, tex); - checkTransactionStatus(request, response); - } - - @Override - public void onException(GlobalStatusRequest request, GlobalStatusResponse response, Exception rex) { - super.onException(request, response, rex); - checkTransactionStatus(request, response); - } - }, request, response); - return response; - } - - /** - * Do global status. - * @param request the request - * @param response the response - * @param rpcContext the rpc context - * @throws TransactionException the transaction exception - */ - protected abstract void doGlobalStatus(GlobalStatusRequest request, GlobalStatusResponse response, - RpcContext rpcContext) throws TransactionException; - - @Override - public GlobalReportResponse handle(GlobalReportRequest request, final RpcContext rpcContext) { - GlobalReportResponse response = new GlobalReportResponse(); - response.setGlobalStatus(request.getGlobalStatus()); - exceptionHandleTemplate(new AbstractCallback() { - @Override - public void execute(GlobalReportRequest request, GlobalReportResponse response) - throws TransactionException { - doGlobalReport(request, response, rpcContext); - } - }, request, response); - return response; - } - - /** - * Do global report. - * @param request the request - * @param response the response - * @param rpcContext the rpc context - * @throws TransactionException the transaction exception - */ - protected abstract void doGlobalReport(GlobalReportRequest request, GlobalReportResponse response, - RpcContext rpcContext) throws TransactionException; - - private void checkTransactionStatus(AbstractGlobalEndRequest request, AbstractGlobalEndResponse response) { - try { - GlobalSession globalSession = SessionHolder.findGlobalSession(request.getXid(), false); - if (globalSession != null) { - response.setGlobalStatus(globalSession.getStatus()); - } - else { - response.setGlobalStatus(GlobalStatus.Finished); - } - } - catch (Exception exx) { - LOGGER.error("check transaction status error,{}]", exx.getMessage()); - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/ParameterParser.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/ParameterParser.java deleted file mode 100644 index 32c0d4e6b5..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/ParameterParser.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server; - -import com.beust.jcommander.JCommander; -import com.beust.jcommander.Parameter; -import com.beust.jcommander.ParameterException; -import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.server.env.ContainerHelper; -import io.seata.server.store.StoreConfig; - -import static io.seata.config.ConfigurationFactory.ENV_PROPERTY_KEY; - -/** - * The type Parameter parser. - * - * @author xingfudeshi @gmail.com - */ -public class ParameterParser { - - private static final String PROGRAM_NAME = "sh seata-server.sh(for linux and mac) or cmd seata-server.bat(for windows)"; - - private static final Configuration CONFIG = ConfigurationFactory.getInstance(); - - @Parameter(names = "--help", help = true) - private boolean help; - - @Parameter(names = { "--host", "-h" }, description = "The ip to register to registry center.", order = 1) - private String host; - - @Parameter(names = { "--port", "-p" }, description = "The port to listen.", order = 2) - private int port; - - @Parameter(names = { "--storeMode", "-m" }, description = "log store mode : file, db, redis", order = 3) - private String storeMode; - - @Parameter(names = { "--serverNode", "-n" }, - description = "server node id, such as 1, 2, 3.it will be generated according to the snowflake by default", - order = 4) - private Long serverNode; - - @Parameter(names = { "--seataEnv", "-e" }, description = "The name used for multi-configuration isolation.", - order = 5) - private String seataEnv; - - @Parameter(names = { "--sessionStoreMode", "-ssm" }, description = "session log store mode : file, db, redis", - order = 6) - private String sessionStoreMode; - - @Parameter(names = { "--lockStoreMode", "-lsm" }, description = "lock log store mode : file, db, redis", order = 7) - private String lockStoreMode; - - /** - * Instantiates a new Parameter parser. - * @param args the args - */ - public ParameterParser(String... args) { - this.init(args); - } - - /** - * startup args > docker env. - * @param args 参数 - */ - private void init(String[] args) { - try { - getCommandParameters(args); - getEnvParameters(); - if (StringUtils.isNotBlank(seataEnv)) { - System.setProperty(ENV_PROPERTY_KEY, seataEnv); - } - StoreConfig.setStartupParameter(storeMode, sessionStoreMode, lockStoreMode); - } - catch (ParameterException e) { - printError(e); - } - - } - - private void getCommandParameters(String[] args) { - JCommander jCommander = JCommander.newBuilder().addObject(this).build(); - jCommander.parse(args); - if (help) { - jCommander.setProgramName(PROGRAM_NAME); - jCommander.usage(); - System.exit(0); - } - } - - private void getEnvParameters() { - if (StringUtils.isBlank(seataEnv)) { - seataEnv = ContainerHelper.getEnv(); - } - if (StringUtils.isBlank(host)) { - host = ContainerHelper.getHost(); - } - if (port == 0) { - port = ContainerHelper.getPort(); - } - if (serverNode == null) { - serverNode = ContainerHelper.getServerNode(); - } - } - - private void printError(ParameterException e) { - System.err.println("Option error " + e.getMessage()); - e.getJCommander().setProgramName(PROGRAM_NAME); - e.usage(); - System.exit(0); - } - - /** - * Gets host. - * @return the host - */ - public String getHost() { - return host; - } - - /** - * Gets port. - * @return the port - */ - public int getPort() { - return port; - } - - /** - * Gets store mode. - * @return the store mode - */ - public String getStoreMode() { - return storeMode; - } - - /** - * Gets lock store mode. - * @return the store mode - */ - public String getLockStoreMode() { - return lockStoreMode; - } - - /** - * Gets session store mode. - * @return the store mode - */ - public String getSessionStoreMode() { - return sessionStoreMode; - } - - /** - * Is help boolean. - * @return the boolean - */ - public boolean isHelp() { - return help; - } - - /** - * Gets server node. - * @return the server node - */ - public Long getServerNode() { - return serverNode; - } - - /** - * Gets seata env。 - * @return the name used for multi-configuration isolation. - */ - public String getSeataEnv() { - return seataEnv; - } - - /** - * Clean up. - */ - public void cleanUp() { - if (null != System.getProperty(ENV_PROPERTY_KEY)) { - System.clearProperty(ENV_PROPERTY_KEY); - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/SeataApp.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/SeataApp.java deleted file mode 100644 index 955fc39c2d..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/SeataApp.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server; - -import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * @author spilledyear@outlook.com - */ -@SpringBootApplication(scanBasePackages = { "io.seata" }) -@EnableEncryptableProperties -public class SeataApp { - - /** - * 启动项目. - */ - public static void main(String[] args) { - // @formatter:off - // -Dtls.enable=true -Dtls.client.authServer=true -Dtls.client.trustCertPath=d:\\nacos.crt - // @formatter:on - SpringApplication.run(SeataApp.class, args); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/Server.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/Server.java deleted file mode 100644 index d6c5e85f89..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/Server.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import io.seata.common.XID; -import io.seata.common.holder.ObjectHolder; -import io.seata.common.thread.NamedThreadFactory; -import io.seata.common.util.NetUtil; -import io.seata.common.util.StringUtils; -import io.seata.config.ConfigurationFactory; -import io.seata.core.rpc.netty.NettyRemotingServer; -import io.seata.core.rpc.netty.NettyServerConfig; -import io.seata.server.coordinator.DefaultCoordinator; -import io.seata.server.lock.LockerManagerFactory; -import io.seata.server.metrics.MetricsManager; -import io.seata.server.session.SessionHolder; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.context.ApplicationListener; -import org.springframework.web.context.support.GenericWebApplicationContext; - -import static io.seata.common.Constants.OBJECT_KEY_SPRING_APPLICATION_CONTEXT; -import static io.seata.spring.boot.autoconfigure.StarterConstants.REGEX_SPLIT_CHAR; -import static io.seata.spring.boot.autoconfigure.StarterConstants.REGISTRY_PREFERED_NETWORKS; - -/** - * The type Server. - * - * @author slievrly - */ -public class Server { - - /** - * The entry point of application. - * @param args the input arguments - */ - public static void start(String[] args) { - // initialize the parameter parser - // Note that the parameter parser should always be the first line to execute. - // Because, here we need to parse the parameters needed for startup. - ParameterParser parameterParser = new ParameterParser(args); - - // initialize the metrics - MetricsManager.get().init(); - - ThreadPoolExecutor workingThreads = new ThreadPoolExecutor(NettyServerConfig.getMinServerPoolSize(), - NettyServerConfig.getMaxServerPoolSize(), NettyServerConfig.getKeepAliveTime(), TimeUnit.SECONDS, - new LinkedBlockingQueue<>(NettyServerConfig.getMaxTaskQueueSize()), - new NamedThreadFactory("ServerHandlerThread", NettyServerConfig.getMaxServerPoolSize()), - new ThreadPoolExecutor.CallerRunsPolicy()); - - // 127.0.0.1 and 0.0.0.0 are not valid here. - if (NetUtil.isValidIp(parameterParser.getHost(), false)) { - XID.setIpAddress(parameterParser.getHost()); - } - else { - String preferredNetworks = ConfigurationFactory.getInstance().getConfig(REGISTRY_PREFERED_NETWORKS); - if (StringUtils.isNotBlank(preferredNetworks)) { - XID.setIpAddress(NetUtil.getLocalIp(preferredNetworks.split(REGEX_SPLIT_CHAR))); - } - else { - XID.setIpAddress(NetUtil.getLocalIp()); - } - } - NettyRemotingServer nettyRemotingServer = new NettyRemotingServer(workingThreads); - XID.setPort(nettyRemotingServer.getListenPort()); - UUIDGenerator.init(parameterParser.getServerNode()); - ConfigurableListableBeanFactory beanFactory = ((GenericWebApplicationContext) ObjectHolder.INSTANCE - .getObject(OBJECT_KEY_SPRING_APPLICATION_CONTEXT)).getBeanFactory(); - DefaultCoordinator coordinator = DefaultCoordinator.getInstance(nettyRemotingServer); - if (coordinator instanceof ApplicationListener) { - beanFactory.registerSingleton(NettyRemotingServer.class.getName(), nettyRemotingServer); - beanFactory.registerSingleton(DefaultCoordinator.class.getName(), coordinator); - ((GenericWebApplicationContext) ObjectHolder.INSTANCE.getObject(OBJECT_KEY_SPRING_APPLICATION_CONTEXT)) - .addApplicationListener((ApplicationListener) coordinator); - } - // log store mode : file, db, redis - SessionHolder.init(); - LockerManagerFactory.init(); - coordinator.init(); - nettyRemotingServer.setHandler(coordinator); - - // let ServerRunner do destroy instead ShutdownHook, see - // https://github.com/seata/seata/issues/4028 - ServerRunner.addDisposable(coordinator); - - nettyRemotingServer.init(); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/ServerRunner.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/ServerRunner.java deleted file mode 100644 index e9a4b74712..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/ServerRunner.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.seata.server; - -import io.micrometer.core.lang.NonNullApi; -import io.seata.core.rpc.Disposable; -import lombok.RequiredArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.core.Ordered; -import org.springframework.stereotype.Component; - -import java.net.InetAddress; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -/** - * @author spilledyear@outlook.com - */ -@Component -@NonNullApi -@RequiredArgsConstructor -public class ServerRunner implements CommandLineRunner, DisposableBean, Ordered { - - private final ServerProperties serverProperties; - - private static final Logger LOGGER = LoggerFactory.getLogger(ServerRunner.class); - - private boolean started = Boolean.FALSE; - - @Value("${logging.file.path}") - private String logPath; - - private static final List DISPOSABLE_LIST = new CopyOnWriteArrayList<>(); - - public static void addDisposable(Disposable disposable) { - DISPOSABLE_LIST.add(disposable); - } - - @Override - public void run(String... args) { - try { - long start = System.currentTimeMillis(); - Server.start(args); - started = true; - long cost = System.currentTimeMillis() - start; - String url = (serverProperties.getSsl().isEnabled() ? "https://" : "http://") - + InetAddress.getLocalHost().getHostAddress() + ":" + serverProperties.getPort(); - LOGGER.info("\n\nseata访问地址:{},日志路径: {}\n", url, this.logPath); - LOGGER.info("seata server started in {} millSeconds", cost); - } - catch (Throwable e) { - started = Boolean.FALSE; - LOGGER.error("seata server start error: {} ", e.getMessage(), e); - System.exit(-1); - } - } - - public boolean started() { - return started; - } - - @Override - public void destroy() throws Exception { - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("destoryAll starting"); - } - - for (Disposable disposable : DISPOSABLE_LIST) { - disposable.destroy(); - } - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("destoryAll finish"); - } - } - - @Override - public int getOrder() { - return Ordered.LOWEST_PRECEDENCE; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/UUIDGenerator.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/UUIDGenerator.java deleted file mode 100644 index c2f0f1a539..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/UUIDGenerator.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server; - -import io.seata.common.util.IdWorker; - -/** - * The type Uuid generator. - * - * @author sharajava - */ -public class UUIDGenerator { - - private static volatile IdWorker idWorker; - - /** - * generate UUID using snowflake algorithm. - * @return UUID - */ - public static long generateUUID() { - if (idWorker == null) { - synchronized (UUIDGenerator.class) { - if (idWorker == null) { - init(null); - } - } - } - return idWorker.nextId(); - } - - /** - * init IdWorker. - * @param serverNode the server node id, consider as machine id in snowflake - */ - public static void init(Long serverNode) { - idWorker = new IdWorker(serverNode); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/auth/AbstractCheckAuthHandler.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/auth/AbstractCheckAuthHandler.java deleted file mode 100644 index 16800e7a8b..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/auth/AbstractCheckAuthHandler.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.auth; - -import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; -import io.seata.core.protocol.RegisterRMRequest; -import io.seata.core.protocol.RegisterTMRequest; -import io.seata.core.rpc.RegisterCheckAuthHandler; - -import static io.seata.common.DefaultValues.DEFAULT_SERVER_ENABLE_CHECK_AUTH; - -/** - * @author slievrly - */ -public abstract class AbstractCheckAuthHandler implements RegisterCheckAuthHandler { - - private static final Boolean ENABLE_CHECK_AUTH = ConfigurationFactory.getInstance() - .getBoolean(ConfigurationKeys.SERVER_ENABLE_CHECK_AUTH, DEFAULT_SERVER_ENABLE_CHECK_AUTH); - - @Override - public boolean regTransactionManagerCheckAuth(RegisterTMRequest request) { - if (!ENABLE_CHECK_AUTH) { - return true; - } - return doRegTransactionManagerCheck(request); - } - - public abstract boolean doRegTransactionManagerCheck(RegisterTMRequest request); - - @Override - public boolean regResourceManagerCheckAuth(RegisterRMRequest request) { - if (!ENABLE_CHECK_AUTH) { - return true; - } - return doRegResourceManagerCheck(request); - } - - public abstract boolean doRegResourceManagerCheck(RegisterRMRequest request); - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/auth/DefaultCheckAuthHandler.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/auth/DefaultCheckAuthHandler.java deleted file mode 100644 index 8fe75e8988..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/auth/DefaultCheckAuthHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.auth; - -import io.seata.common.loader.LoadLevel; -import io.seata.core.protocol.RegisterRMRequest; -import io.seata.core.protocol.RegisterTMRequest; - -/** - * @author slievrly - */ -@LoadLevel(name = "defaultCheckAuthHandler", order = 100) -public class DefaultCheckAuthHandler extends AbstractCheckAuthHandler { - - @Override - public boolean doRegTransactionManagerCheck(RegisterTMRequest request) { - return true; - } - - @Override - public boolean doRegResourceManagerCheck(RegisterRMRequest request) { - return true; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/listener/ClusterChangeEvent.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/listener/ClusterChangeEvent.java deleted file mode 100644 index 638cee1282..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/listener/ClusterChangeEvent.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.listener; - -import java.time.Clock; -import org.springframework.context.ApplicationEvent; - -/** - * @author funkye - */ -public class ClusterChangeEvent extends ApplicationEvent { - - private String group; - - private boolean leader; - - private long term; - - public ClusterChangeEvent(Object source, String group, long term, boolean leader) { - super(source); - this.group = group; - this.term = term; - this.leader = leader; - } - - public ClusterChangeEvent(Object source, String group) { - super(source); - this.group = group; - } - - public ClusterChangeEvent(Object source, Clock clock) { - super(source, clock); - } - - public String getGroup() { - return group; - } - - public void setGroup(String group) { - this.group = group; - } - - public long getTerm() { - return term; - } - - public void setTerm(long term) { - this.term = term; - } - - public boolean isLeader() { - return leader; - } - - public void setLeader(boolean leader) { - this.leader = leader; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/listener/ClusterChangeListener.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/listener/ClusterChangeListener.java deleted file mode 100644 index b6e5850f26..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/listener/ClusterChangeListener.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.listener; - -/** - * @author funkye - */ -public interface ClusterChangeListener { - - /** - * cluster change event. - * @param event event - */ - void onChangeEvent(ClusterChangeEvent event); - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/manager/ClusterWatcherManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/manager/ClusterWatcherManager.java deleted file mode 100644 index d892791cae..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/manager/ClusterWatcherManager.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.manager; - -import java.util.Map; -import java.util.Optional; -import java.util.Queue; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import javax.annotation.PostConstruct; -import javax.servlet.AsyncContext; -import javax.servlet.http.HttpServletResponse; -import io.seata.common.thread.NamedThreadFactory; -import io.seata.server.cluster.listener.ClusterChangeEvent; -import io.seata.server.cluster.listener.ClusterChangeListener; -import io.seata.server.cluster.watch.Watcher; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -/** - * @author funkye - */ -@Component -public class ClusterWatcherManager implements ClusterChangeListener { - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - private static final Map>> WATCHERS = new ConcurrentHashMap<>(); - - private static final Map GROUP_UPDATE_TIME = new ConcurrentHashMap<>(); - - private final ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1, - new NamedThreadFactory("long-polling", 1)); - - @PostConstruct - public void init() { - // Responds to monitors that time out - scheduledThreadPoolExecutor.scheduleAtFixedRate(() -> { - for (String group : WATCHERS.keySet()) { - Optional.ofNullable(WATCHERS.remove(group)) - .ifPresent(watchers -> watchers.parallelStream().forEach(watcher -> { - if (System.currentTimeMillis() >= watcher.getTimeout()) { - HttpServletResponse httpServletResponse = (HttpServletResponse) ((AsyncContext) watcher - .getAsyncContext()).getResponse(); - watcher.setDone(true); - httpServletResponse.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - ((AsyncContext) watcher.getAsyncContext()).complete(); - } - if (!watcher.isDone()) { - // Re-register - registryWatcher(watcher); - } - })); - } - }, 1, 1, TimeUnit.SECONDS); - } - - @Override - @EventListener - @Async - public void onChangeEvent(ClusterChangeEvent event) { - if (event.getTerm() > 0) { - GROUP_UPDATE_TIME.put(event.getGroup(), event.getTerm()); - // Notifications are made of changes in cluster information - Optional.ofNullable(WATCHERS.remove(event.getGroup())) - .ifPresent(watchers -> watchers.parallelStream().forEach(this::notify)); - } - } - - private void notify(Watcher watcher) { - AsyncContext asyncContext = (AsyncContext) watcher.getAsyncContext(); - HttpServletResponse httpServletResponse = (HttpServletResponse) asyncContext.getResponse(); - watcher.setDone(true); - if (logger.isDebugEnabled()) { - logger.debug("notify cluster change event to: {}", asyncContext.getRequest().getRemoteAddr()); - } - httpServletResponse.setStatus(HttpServletResponse.SC_OK); - asyncContext.complete(); - } - - public void registryWatcher(Watcher watcher) { - String group = watcher.getGroup(); - Long term = GROUP_UPDATE_TIME.get(group); - if (term == null || watcher.getTerm() >= term) { - WATCHERS.computeIfAbsent(group, value -> new ConcurrentLinkedQueue<>()).add(watcher); - } - else { - notify(watcher); - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/RaftServer.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/RaftServer.java deleted file mode 100644 index fe77a2f10c..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/RaftServer.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft; - -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.util.Optional; -import java.util.concurrent.TimeUnit; -import com.alipay.sofa.jraft.Node; -import com.alipay.sofa.jraft.RaftGroupService; -import com.alipay.sofa.jraft.RouteTable; -import com.alipay.sofa.jraft.entity.PeerId; -import com.alipay.sofa.jraft.option.NodeOptions; -import com.alipay.sofa.jraft.rpc.RpcServer; -import com.codahale.metrics.Slf4jReporter; -import io.seata.config.ConfigurationFactory; -import io.seata.core.rpc.Disposable; -import org.apache.commons.io.FileUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static io.seata.common.ConfigurationKeys.SERVER_RAFT_REPORTER_ENABLED; -import static io.seata.common.ConfigurationKeys.SERVER_RAFT_REPORTER_INITIAL_DELAY; - -/** - * @author funkye - */ -public class RaftServer implements Disposable, Closeable { - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - private final RaftStateMachine raftStateMachine; - - private final String groupId; - - private final String groupPath; - - private final NodeOptions nodeOptions; - - private final PeerId serverId; - - private final RpcServer rpcServer; - - private RaftGroupService raftGroupService; - - private Node node; - - public RaftServer(final String dataPath, final String groupId, final PeerId serverId, final NodeOptions nodeOptions, - final RpcServer rpcServer) throws IOException { - this.groupId = groupId; - this.groupPath = dataPath + File.separator + groupId; - // Initialize the state machine - this.raftStateMachine = new RaftStateMachine(groupId); - this.nodeOptions = nodeOptions; - this.serverId = serverId; - this.rpcServer = rpcServer; - } - - public void start() throws IOException { - // Initialization path - FileUtils.forceMkdir(new File(groupPath)); - // Set the state machine to startup parameters - nodeOptions.setFsm(this.raftStateMachine); - // Set the storage path - // Log, must - nodeOptions.setLogUri(groupPath + File.separator + "log"); - // Meta information, must - nodeOptions.setRaftMetaUri(groupPath + File.separator + "raft_meta"); - // Snapshot, optional, is generally recommended - nodeOptions.setSnapshotUri(groupPath + File.separator + "snapshot"); - boolean reporterEnabled = ConfigurationFactory.getInstance().getBoolean(SERVER_RAFT_REPORTER_ENABLED, false); - nodeOptions.setEnableMetrics(reporterEnabled); - // Initialize the raft Group service framework - this.raftGroupService = new RaftGroupService(groupId, serverId, nodeOptions, rpcServer, true); - this.node = this.raftGroupService.start(false); - RouteTable.getInstance().updateConfiguration(groupId, node.getOptions().getInitialConf()); - if (reporterEnabled) { - final Slf4jReporter reporter = Slf4jReporter.forRegistry(node.getNodeMetrics().getMetricRegistry()) - .outputTo(logger) - .convertRatesTo(TimeUnit.SECONDS) - .convertDurationsTo(TimeUnit.MILLISECONDS) - .build(); - reporter.start(ConfigurationFactory.getInstance().getInt(SERVER_RAFT_REPORTER_INITIAL_DELAY, 60), - TimeUnit.MINUTES); - } - } - - public Node getNode() { - return this.node; - } - - public RaftStateMachine getRaftStateMachine() { - return raftStateMachine; - } - - @Override - public void close() { - destroy(); - } - - @Override - public void destroy() { - Optional.ofNullable(raftGroupService).ifPresent(r -> { - r.shutdown(); - try { - r.join(); - } - catch (InterruptedException e) { - logger.warn("Interrupted when RaftServer destroying", e); - } - }); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/RaftServerFactory.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/RaftServerFactory.java deleted file mode 100644 index 1c8d37c20a..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/RaftServerFactory.java +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft; - -import java.io.Closeable; -import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; -import com.alipay.sofa.jraft.CliService; -import com.alipay.sofa.jraft.RaftServiceFactory; -import com.alipay.sofa.jraft.conf.Configuration; -import com.alipay.sofa.jraft.entity.PeerId; -import com.alipay.sofa.jraft.option.CliOptions; -import com.alipay.sofa.jraft.option.NodeOptions; -import com.alipay.sofa.jraft.option.RaftOptions; -import com.alipay.sofa.jraft.rpc.CliClientService; -import com.alipay.sofa.jraft.rpc.RaftRpcServerFactory; -import com.alipay.sofa.jraft.rpc.RpcServer; -import com.alipay.sofa.jraft.rpc.impl.cli.CliClientServiceImpl; -import io.seata.common.ConfigurationKeys; -import io.seata.common.XID; -import io.seata.common.util.StringUtils; -import io.seata.config.ConfigurationFactory; -import io.seata.core.rpc.Disposable; -import io.seata.discovery.registry.FileRegistryServiceImpl; -import io.seata.discovery.registry.MultiRegistryFactory; -import io.seata.discovery.registry.RegistryService; -import io.seata.server.store.StoreConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static io.seata.common.ConfigurationKeys.SERVER_RAFT_PORT_CAMEL; -import static io.seata.common.ConfigurationKeys.SERVER_RAFT_SYNC; -import static io.seata.common.DefaultValues.DEFAULT_SERVER_RAFT_ELECTION_TIMEOUT_MS; -import static io.seata.common.DefaultValues.DEFAULT_SESSION_STORE_FILE_DIR; -import static io.seata.common.DefaultValues.DEFAULT_SEATA_GROUP; -import static io.seata.common.ConfigurationKeys.SERVER_RAFT_APPLY_BATCH; -import static io.seata.common.ConfigurationKeys.SERVER_RAFT_DISRUPTOR_BUFFER_SIZE; -import static io.seata.common.ConfigurationKeys.SERVER_RAFT_ELECTION_TIMEOUT_MS; -import static io.seata.common.ConfigurationKeys.SERVER_RAFT_MAX_APPEND_BUFFER_SIZE; -import static io.seata.common.ConfigurationKeys.SERVER_RAFT_MAX_REPLICATOR_INFLIGHT_MSGS; -import static io.seata.common.ConfigurationKeys.SERVER_RAFT_SNAPSHOT_INTERVAL; -import static java.io.File.separator; - -/** - * @author funkye - */ -public class RaftServerFactory implements Disposable, Closeable { - - private static final Logger LOGGER = LoggerFactory.getLogger(RaftServerFactory.class); - - private static final Map RAFT_SERVER_MAP = new HashMap<>(); - - private Boolean raftMode = false; - - private RpcServer rpcServer; - - private static final io.seata.config.Configuration CONFIG = ConfigurationFactory.getInstance(); - - public static RaftServerFactory getInstance() { - return SingletonHandler.INSTANCE; - } - - public static CliService getCliServiceInstance() { - return SingletonHandler.CLI_SERVICE; - } - - public static CliClientService getCliClientServiceInstance() { - return SingletonHandler.CLI_CLIENT_SERVICE; - } - - public void init() { - String initConfStr = CONFIG.getConfig(ConfigurationKeys.SERVER_RAFT_SERVER_ADDR); - StoreConfig.SessionMode storeMode = StoreConfig.getSessionMode(); - raftMode = storeMode.equals(StoreConfig.SessionMode.RAFT); - if (StringUtils.isBlank(initConfStr)) { - if (raftMode) { - throw new IllegalArgumentException( - "Raft store mode must config: " + ConfigurationKeys.SERVER_RAFT_SERVER_ADDR); - } - return; - } - else { - if (raftMode) { - for (RegistryService instance : MultiRegistryFactory.getInstances()) { - if (!(instance instanceof FileRegistryServiceImpl)) { - throw new IllegalArgumentException("Raft store mode not support other Registration Center"); - } - } - } - LOGGER.warn("raft mode and raft cluster is an experimental feature"); - } - final Configuration initConf = new Configuration(); - if (!initConf.parse(initConfStr)) { - throw new IllegalArgumentException("fail to parse initConf:" + initConfStr); - } - int port = Integer.parseInt(System.getProperty(SERVER_RAFT_PORT_CAMEL, "0")); - PeerId serverId = null; - String host = XID.getIpAddress(); - if (port <= 0) { - // Highly available deployments require different nodes - for (PeerId peer : initConf.getPeers()) { - if (StringUtils.equals(peer.getIp(), host)) { - if (serverId != null) { - throw new IllegalArgumentException( - "server.raft.cluster has duplicate ip, For local debugging, use -Dserver.raftPort to specify the raft port"); - } - serverId = peer; - } - } - } - else { - // Local debugging use - serverId = new PeerId(host, port); - } - final String dataPath = CONFIG.getConfig(ConfigurationKeys.STORE_FILE_DIR, DEFAULT_SESSION_STORE_FILE_DIR) - + separator + "raft" + separator + serverId.getPort(); - String group = CONFIG.getConfig(ConfigurationKeys.SERVER_RAFT_GROUP, DEFAULT_SEATA_GROUP); - try { - // Here you have raft RPC and business RPC using the same RPC server, and you - // can usually do this separately - this.rpcServer = RaftRpcServerFactory.createRaftRpcServer(serverId.getEndpoint()); - RaftServer raftServer = new RaftServer(dataPath, group, serverId, initNodeOptions(initConf), - this.rpcServer); - // as the foundation for multi raft group in the future - RAFT_SERVER_MAP.put(group, raftServer); - } - catch (IOException e) { - throw new IllegalArgumentException("fail init raft cluster:" + e.getMessage(), e); - } - } - - public void start() { - RAFT_SERVER_MAP.forEach((group, raftServer) -> { - try { - raftServer.start(); - } - catch (IOException e) { - LOGGER.error("start seata server raft cluster error, group: {} ", group, e); - throw new RuntimeException(e); - } - LOGGER.info("started seata server raft cluster, group: {} ", group); - }); - if (!this.rpcServer.init(null)) { - throw new RuntimeException("start raft node fail!"); - } - } - - @Override - public void destroy() { - this.close(); - rpcServer = null; - raftMode = false; - } - - @Override - public void close() { - RAFT_SERVER_MAP.forEach((group, raftServer) -> { - raftServer.close(); - LOGGER.info("closed seata server raft cluster, group: {} ", group); - }); - Optional.ofNullable(rpcServer).ifPresent(RpcServer::shutdown); - RAFT_SERVER_MAP.clear(); - } - - public RaftServer getRaftServer(String group) { - return RAFT_SERVER_MAP.get(group); - } - - public Collection getRaftServers() { - return RAFT_SERVER_MAP.values(); - } - - public Boolean isLeader(String group) { - AtomicReference stateMachine = new AtomicReference<>(); - Optional.ofNullable(RAFT_SERVER_MAP.get(group)).ifPresent(raftServer -> { - stateMachine.set(raftServer.getRaftStateMachine()); - }); - RaftStateMachine raftStateMachine = stateMachine.get(); - return !isRaftMode() && RAFT_SERVER_MAP.isEmpty() || (raftStateMachine != null && raftStateMachine.isLeader()); - } - - public Boolean isRaftMode() { - return raftMode; - } - - private RaftOptions initRaftOptions() { - RaftOptions raftOptions = new RaftOptions(); - raftOptions.setApplyBatch(CONFIG.getInt(SERVER_RAFT_APPLY_BATCH, raftOptions.getApplyBatch())); - raftOptions.setMaxAppendBufferSize( - CONFIG.getInt(SERVER_RAFT_MAX_APPEND_BUFFER_SIZE, raftOptions.getMaxAppendBufferSize())); - raftOptions.setDisruptorBufferSize( - CONFIG.getInt(SERVER_RAFT_DISRUPTOR_BUFFER_SIZE, raftOptions.getDisruptorBufferSize())); - raftOptions.setMaxReplicatorInflightMsgs( - CONFIG.getInt(SERVER_RAFT_MAX_REPLICATOR_INFLIGHT_MSGS, raftOptions.getMaxReplicatorInflightMsgs())); - raftOptions.setSync(CONFIG.getBoolean(SERVER_RAFT_SYNC, raftOptions.isSync())); - return raftOptions; - } - - private NodeOptions initNodeOptions(Configuration initConf) { - NodeOptions nodeOptions = new NodeOptions(); - // enable the CLI service. - nodeOptions.setDisableCli(false); - // snapshot should be made every 600 seconds - int snapshotInterval = CONFIG.getInt(SERVER_RAFT_SNAPSHOT_INTERVAL, 60 * 10); - nodeOptions.setSnapshotIntervalSecs(snapshotInterval); - nodeOptions.setRaftOptions(initRaftOptions()); - // set the election timeout to 1 second - nodeOptions.setElectionTimeoutMs( - CONFIG.getInt(SERVER_RAFT_ELECTION_TIMEOUT_MS, DEFAULT_SERVER_RAFT_ELECTION_TIMEOUT_MS)); - // set up the initial cluster configuration - nodeOptions.setInitialConf(initConf); - return nodeOptions; - } - - public static Set groups() { - return RAFT_SERVER_MAP.keySet(); - } - - private static class SingletonHandler { - - private static final RaftServerFactory INSTANCE = new RaftServerFactory(); - - private static final CliService CLI_SERVICE = RaftServiceFactory.createAndInitCliService(new CliOptions()); - - private static final CliClientService CLI_CLIENT_SERVICE = new CliClientServiceImpl(); - static { - CLI_CLIENT_SERVICE.init(new CliOptions()); - } - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/RaftStateMachine.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/RaftStateMachine.java deleted file mode 100644 index f44e0bae73..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/RaftStateMachine.java +++ /dev/null @@ -1,321 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft; - -import com.alipay.sofa.jraft.Closure; -import com.alipay.sofa.jraft.Iterator; -import com.alipay.sofa.jraft.RouteTable; -import com.alipay.sofa.jraft.Status; -import com.alipay.sofa.jraft.conf.Configuration; -import com.alipay.sofa.jraft.core.StateMachineAdapter; -import com.alipay.sofa.jraft.entity.LeaderChangeContext; -import com.alipay.sofa.jraft.storage.snapshot.SnapshotReader; -import com.alipay.sofa.jraft.storage.snapshot.SnapshotWriter; -import io.seata.common.XID; -import io.seata.common.holder.ObjectHolder; -import io.seata.common.metadata.ClusterRole; -import io.seata.common.metadata.Node; -import io.seata.common.store.StoreMode; -import io.seata.common.util.StringUtils; -import io.seata.server.cluster.listener.ClusterChangeEvent; -import io.seata.server.cluster.raft.context.SeataClusterContext; -import io.seata.server.cluster.raft.execute.RaftMsgExecute; -import io.seata.server.cluster.raft.execute.branch.AddBranchSessionExecute; -import io.seata.server.cluster.raft.execute.branch.RemoveBranchSessionExecute; -import io.seata.server.cluster.raft.execute.branch.UpdateBranchSessionExecute; -import io.seata.server.cluster.raft.execute.global.AddGlobalSessionExecute; -import io.seata.server.cluster.raft.execute.global.RemoveGlobalSessionExecute; -import io.seata.server.cluster.raft.execute.global.UpdateGlobalSessionExecute; -import io.seata.server.cluster.raft.execute.lock.BranchReleaseLockExecute; -import io.seata.server.cluster.raft.execute.lock.GlobalReleaseLockExecute; -import io.seata.server.cluster.raft.snapshot.StoreSnapshotFile; -import io.seata.server.cluster.raft.snapshot.metadata.LeaderMetadataSnapshotFile; -import io.seata.server.cluster.raft.snapshot.session.SessionSnapshotFile; -import io.seata.server.cluster.raft.sync.RaftSyncMessageSerializer; -import io.seata.server.cluster.raft.sync.msg.RaftBaseMsg; -import io.seata.server.cluster.raft.sync.msg.RaftClusterMetadataMsg; -import io.seata.server.cluster.raft.sync.msg.RaftSyncMsgType; -import io.seata.server.cluster.raft.sync.msg.dto.RaftClusterMetadata; -import io.seata.server.cluster.raft.util.RaftTaskUtil; -import io.seata.server.session.SessionHolder; -import io.seata.server.store.StoreConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.core.env.Environment; - -import java.nio.ByteBuffer; -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicLong; -import java.util.stream.Collectors; - -import static io.seata.common.Constants.OBJECT_KEY_SPRING_APPLICATION_CONTEXT; -import static io.seata.common.Constants.OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT; -import static io.seata.common.DefaultValues.SERVICE_OFFSET_SPRING_BOOT; -import static io.seata.server.cluster.raft.sync.msg.RaftSyncMsgType.*; - -/** - * @author funkye - */ -public class RaftStateMachine extends StateMachineAdapter { - - private static final Logger LOGGER = LoggerFactory.getLogger(RaftStateMachine.class); - - private final String mode; - - private final String group; - - private final List snapshotFiles = new ArrayList<>(); - - private static final Map> EXECUTES = new HashMap<>(); - - private volatile RaftClusterMetadata raftClusterMetadata; - - /** - * Leader term. - */ - private final AtomicLong leaderTerm = new AtomicLong(-1); - - /** - * current term. - */ - private final AtomicLong currentTerm = new AtomicLong(-1); - - public boolean isLeader() { - return this.leaderTerm.get() > 0; - } - - public RaftStateMachine(String group) { - this.group = group; - mode = StoreConfig.getSessionMode().getName(); - EXECUTES.put(REFRESH_CLUSTER_METADATA, syncMsg -> { - refreshClusterMetadata(syncMsg); - return null; - }); - registryStoreSnapshotFile(new LeaderMetadataSnapshotFile(group)); - if (StoreMode.RAFT.getName().equalsIgnoreCase(mode)) { - registryStoreSnapshotFile(new SessionSnapshotFile(group)); - EXECUTES.put(ADD_GLOBAL_SESSION, new AddGlobalSessionExecute()); - EXECUTES.put(ADD_BRANCH_SESSION, new AddBranchSessionExecute()); - EXECUTES.put(REMOVE_BRANCH_SESSION, new RemoveBranchSessionExecute()); - EXECUTES.put(UPDATE_GLOBAL_SESSION_STATUS, new UpdateGlobalSessionExecute()); - EXECUTES.put(RELEASE_GLOBAL_SESSION_LOCK, new GlobalReleaseLockExecute()); - EXECUTES.put(REMOVE_GLOBAL_SESSION, new RemoveGlobalSessionExecute()); - EXECUTES.put(UPDATE_BRANCH_SESSION_STATUS, new UpdateBranchSessionExecute()); - EXECUTES.put(RELEASE_BRANCH_SESSION_LOCK, new BranchReleaseLockExecute()); - } - } - - @Override - public void onApply(Iterator iterator) { - while (iterator.hasNext()) { - Closure done = iterator.done(); - if (done != null) { - // leader does not need to be serialized, just execute the task directly - done.run(Status.OK()); - } - else { - ByteBuffer byteBuffer = iterator.getData(); - // if data is empty, it is only a heartbeat event and can be ignored - if (byteBuffer != null && byteBuffer.hasRemaining()) { - RaftBaseMsg msg = (RaftBaseMsg) RaftSyncMessageSerializer.decode(byteBuffer.array()).getBody(); - // follower executes the corresponding task - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("sync msg: {}", msg); - } - onExecuteRaft(msg); - } - } - iterator.next(); - } - } - - @Override - public void onSnapshotSave(final SnapshotWriter writer, final Closure done) { - if (!StringUtils.equals(StoreConfig.SessionMode.RAFT.getName(), mode)) { - done.run(Status.OK()); - return; - } - long current = System.currentTimeMillis(); - for (StoreSnapshotFile snapshotFile : snapshotFiles) { - Status status = snapshotFile.save(writer); - if (!status.isOk()) { - done.run(status); - return; - } - } - LOGGER.info("groupId: {}, onSnapshotSave cost: {} ms.", group, System.currentTimeMillis() - current); - done.run(Status.OK()); - } - - @Override - public boolean onSnapshotLoad(final SnapshotReader reader) { - if (!StringUtils.equals(StoreConfig.SessionMode.RAFT.getName(), mode)) { - return true; - } - if (isLeader()) { - if (LOGGER.isWarnEnabled()) { - LOGGER.warn("Leader is not supposed to load snapshot"); - } - return false; - } - long current = System.currentTimeMillis(); - for (StoreSnapshotFile snapshotFile : snapshotFiles) { - if (!snapshotFile.load(reader)) { - return false; - } - } - LOGGER.info("groupId: {}, onSnapshotLoad cost: {} ms.", group, System.currentTimeMillis() - current); - return true; - } - - @Override - public void onLeaderStart(final long term) { - boolean leader = isLeader(); - this.leaderTerm.set(term); - LOGGER.info("groupId: {}, onLeaderStart: term={}.", group, term); - this.currentTerm.set(term); - SeataClusterContext.bindGroup(group); - syncMetadata(); - if (!leader && RaftServerFactory.getInstance().isRaftMode()) { - CompletableFuture.runAsync(() -> { - LOGGER.info("reload session, groupId: {}, session map size: {} ", group, - SessionHolder.getRootSessionManager().allSessions().size()); - SeataClusterContext.bindGroup(group); - try { - // become the leader again,reloading global session - SessionHolder.reload(SessionHolder.getRootSessionManager().allSessions(), - StoreConfig.SessionMode.RAFT, false); - } - finally { - SeataClusterContext.unbindGroup(); - } - }); - } - } - - @Override - public void onLeaderStop(final Status status) { - this.leaderTerm.set(-1); - LOGGER.info("groupId: {}, onLeaderStop: status={}.", group, status); - } - - @Override - public void onStopFollowing(final LeaderChangeContext ctx) { - LOGGER.info("groupId: {}, onStopFollowing: {}.", group, ctx); - } - - @Override - public void onStartFollowing(final LeaderChangeContext ctx) { - LOGGER.info("groupId: {}, onStartFollowing: {}.", group, ctx); - this.currentTerm.set(ctx.getTerm()); - } - - @Override - public void onConfigurationCommitted(Configuration conf) { - LOGGER.info("groupId: {}, onConfigurationCommitted: {}.", group, conf); - syncMetadata(); - RouteTable.getInstance().updateConfiguration(group, conf); - } - - private void syncMetadata() { - if (isLeader()) { - SeataClusterContext.bindGroup(group); - try { - RaftClusterMetadataMsg raftClusterMetadataMsg = new RaftClusterMetadataMsg( - createNewRaftClusterMetadata()); - RaftTaskUtil.createTask(status -> refreshClusterMetadata(raftClusterMetadataMsg), - raftClusterMetadataMsg, null); - } - catch (Exception e) { - LOGGER.error(e.getMessage(), e); - } - finally { - SeataClusterContext.unbindGroup(); - } - } - } - - private void onExecuteRaft(RaftBaseMsg msg) { - RaftMsgExecute execute = EXECUTES.get(msg.getMsgType()); - if (execute == null) { - throw new RuntimeException( - "the state machine does not allow events that cannot be executed, please feedback the information to the Seata community !!! msg: " - + msg); - } - try { - execute.execute(msg); - } - catch (Throwable e) { - LOGGER.error("Message synchronization failure: {}, msgType: {}", e.getMessage(), msg.getMsgType(), e); - throw new RuntimeException(e); - } - } - - public AtomicLong getCurrentTerm() { - return currentTerm; - } - - public void registryStoreSnapshotFile(StoreSnapshotFile storeSnapshotFile) { - snapshotFiles.add(storeSnapshotFile); - } - - public RaftClusterMetadata getRaftLeaderMetadata() { - return raftClusterMetadata; - } - - public void setRaftLeaderMetadata(RaftClusterMetadata raftClusterMetadata) { - this.raftClusterMetadata = raftClusterMetadata; - } - - public RaftClusterMetadata createNewRaftClusterMetadata() { - RaftClusterMetadata metadata = new RaftClusterMetadata(this.currentTerm.get()); - Node leader = metadata.createNode(XID.getIpAddress(), XID.getPort(), - Integer.parseInt( - ((Environment) ObjectHolder.INSTANCE.getObject(OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT)) - .getProperty("server.port", String.valueOf(8088))), - group, Collections.emptyMap()); - leader.setRole(ClusterRole.LEADER); - metadata.setLeader(leader); - Configuration configuration = RouteTable.getInstance().getConfiguration(this.group); - List learners = configuration.getLearners().stream().map(learner -> { - int nettyPort = learner.getPort() - SERVICE_OFFSET_SPRING_BOOT; - Node learnerNode = metadata.createNode(learner.getIp(), nettyPort, nettyPort - SERVICE_OFFSET_SPRING_BOOT, - this.group, Collections.emptyMap()); - learnerNode.setRole(ClusterRole.LEARNER); - return learnerNode; - }).collect(Collectors.toList()); - metadata.setLearner(learners); - List followers = configuration.getPeers().stream().map(follower -> { - int nettyPort = follower.getPort() - SERVICE_OFFSET_SPRING_BOOT; - Node followerNode = metadata.createNode(follower.getIp(), nettyPort, nettyPort - SERVICE_OFFSET_SPRING_BOOT, - this.group, Collections.emptyMap()); - followerNode.setRole(ClusterRole.FOLLOWER); - return followerNode; - }).collect(Collectors.toList()); - metadata.setFollowers(followers); - return metadata; - } - - public void refreshClusterMetadata(RaftBaseMsg syncMsg) { - raftClusterMetadata = ((RaftClusterMetadataMsg) syncMsg).getRaftClusterMetadata(); - ((ApplicationEventPublisher) ObjectHolder.INSTANCE.getObject(OBJECT_KEY_SPRING_APPLICATION_CONTEXT)) - .publishEvent(new ClusterChangeEvent(this, group, raftClusterMetadata.getTerm(), this.isLeader())); - LOGGER.info("groupId: {}, refresh cluster metadata: {}", group, raftClusterMetadata); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/context/SeataClusterContext.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/context/SeataClusterContext.java deleted file mode 100644 index cee3477648..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/context/SeataClusterContext.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.context; - -import io.seata.common.ConfigurationKeys; -import io.seata.config.ConfigurationFactory; -import io.seata.core.context.ContextCore; -import io.seata.core.context.ContextCoreLoader; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import static io.seata.common.DefaultValues.DEFAULT_SEATA_GROUP; - -/** - * @author funkye - */ -public final class SeataClusterContext { - - private static final String GROUP = ConfigurationFactory.getInstance() - .getConfig(ConfigurationKeys.SERVER_RAFT_GROUP, DEFAULT_SEATA_GROUP); - - private SeataClusterContext() { - } - - /** - * The constant KEY_GROUP. - */ - public static final String KEY_GROUP = "TX_GROUP"; - - private static ContextCore CONTEXT_HOLDER = ContextCoreLoader.load(); - - /** - * Bind group. - * @param group the group - */ - public static void bindGroup(@Nonnull String group) { - CONTEXT_HOLDER.put(KEY_GROUP, group); - } - - /** - * Bind group. - * - */ - public static String bindGroup() { - CONTEXT_HOLDER.put(KEY_GROUP, GROUP); - return GROUP; - } - - /** - * Unbind group. - */ - public static void unbindGroup() { - CONTEXT_HOLDER.remove(KEY_GROUP); - } - - @Nullable - public static String getGroup() { - return (String) CONTEXT_HOLDER.get(KEY_GROUP); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/AbstractRaftMsgExecute.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/AbstractRaftMsgExecute.java deleted file mode 100644 index 22cd7007ed..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/AbstractRaftMsgExecute.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.execute; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import io.seata.server.lock.LockerManagerFactory; -import io.seata.server.storage.raft.lock.RaftLockManager; - -/** - * @author jianbin.chen - */ -public abstract class AbstractRaftMsgExecute implements RaftMsgExecute { - - protected final Logger logger = LoggerFactory.getLogger(getClass()); - - protected RaftLockManager raftLockManager = (RaftLockManager) LockerManagerFactory.getLockManager(); - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/RaftMsgExecute.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/RaftMsgExecute.java deleted file mode 100644 index 22e7785443..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/RaftMsgExecute.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.execute; - -import io.seata.server.cluster.raft.sync.msg.RaftBaseMsg; - -/** - * @author jianbin.chen - */ -public interface RaftMsgExecute { - - /** - * Execute t. - * @param syncMsg the sessionSyncMsg - * @return the t - * @throws Throwable the throwable - */ - T execute(RaftBaseMsg syncMsg) throws Throwable; - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/branch/AddBranchSessionExecute.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/branch/AddBranchSessionExecute.java deleted file mode 100644 index d6a90762e9..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/branch/AddBranchSessionExecute.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.execute.branch; - -import io.seata.server.cluster.raft.execute.AbstractRaftMsgExecute; -import io.seata.server.cluster.raft.sync.msg.RaftBaseMsg; -import io.seata.server.cluster.raft.sync.msg.RaftBranchSessionSyncMsg; -import io.seata.server.cluster.raft.sync.msg.dto.BranchTransactionDTO; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHolder; -import io.seata.server.storage.SessionConverter; -import io.seata.server.storage.raft.session.RaftSessionManager; - -/** - * @author jianbin.chen - */ -public class AddBranchSessionExecute extends AbstractRaftMsgExecute { - - @Override - public Boolean execute(RaftBaseMsg syncMsg) throws Throwable { - RaftBranchSessionSyncMsg sessionSyncMsg = (RaftBranchSessionSyncMsg) syncMsg; - RaftSessionManager raftSessionManager = (RaftSessionManager) SessionHolder - .getRootSessionManager(sessionSyncMsg.getGroup()); - BranchTransactionDTO branchTransactionDTO = sessionSyncMsg.getBranchSession(); - GlobalSession globalSession = raftSessionManager.findGlobalSession(branchTransactionDTO.getXid()); - BranchSession branchSession = SessionConverter.convertBranchSession(branchTransactionDTO); - branchSession.lock(); - globalSession.add(branchSession); - if (logger.isDebugEnabled()) { - logger.debug("addBranch xid: {},branchId: {}", branchTransactionDTO.getXid(), - branchTransactionDTO.getBranchId()); - } - return true; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/branch/RemoveBranchSessionExecute.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/branch/RemoveBranchSessionExecute.java deleted file mode 100644 index 4cce6167c7..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/branch/RemoveBranchSessionExecute.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.execute.branch; - -import io.seata.server.cluster.raft.execute.AbstractRaftMsgExecute; -import io.seata.server.cluster.raft.sync.msg.RaftBaseMsg; -import io.seata.server.cluster.raft.sync.msg.RaftBranchSessionSyncMsg; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHolder; -import io.seata.server.storage.raft.session.RaftSessionManager; - -/** - * @author jianbin.chen - */ -public class RemoveBranchSessionExecute extends AbstractRaftMsgExecute { - - @Override - public Boolean execute(RaftBaseMsg syncMsg) throws Throwable { - RaftBranchSessionSyncMsg sessionSyncMsg = (RaftBranchSessionSyncMsg) syncMsg; - RaftSessionManager raftSessionManager = (RaftSessionManager) SessionHolder - .getRootSessionManager(sessionSyncMsg.getGroup()); - GlobalSession globalSession = raftSessionManager.findGlobalSession(sessionSyncMsg.getBranchSession().getXid()); - if (globalSession != null) { - BranchSession branchSession = globalSession.getBranch(sessionSyncMsg.getBranchSession().getBranchId()); - if (branchSession != null) { - raftLockManager.localReleaseLock(branchSession); - globalSession.remove(branchSession); - } - if (logger.isDebugEnabled()) { - logger.debug("removeBranch xid: {},branchId: {}", globalSession.getXid(), - sessionSyncMsg.getBranchSession().getBranchId()); - } - } - return true; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/branch/UpdateBranchSessionExecute.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/branch/UpdateBranchSessionExecute.java deleted file mode 100644 index 50f68c46a6..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/branch/UpdateBranchSessionExecute.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.execute.branch; - -import io.seata.core.model.BranchStatus; -import io.seata.server.cluster.raft.execute.AbstractRaftMsgExecute; -import io.seata.server.cluster.raft.sync.msg.RaftBaseMsg; -import io.seata.server.cluster.raft.sync.msg.RaftBranchSessionSyncMsg; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHolder; -import io.seata.server.storage.raft.session.RaftSessionManager; - -/** - * @author jianbin.chen - */ -public class UpdateBranchSessionExecute extends AbstractRaftMsgExecute { - - @Override - public Boolean execute(RaftBaseMsg syncMsg) throws Throwable { - RaftBranchSessionSyncMsg sessionSyncMsg = (RaftBranchSessionSyncMsg) syncMsg; - RaftSessionManager raftSessionManager = (RaftSessionManager) SessionHolder - .getRootSessionManager(sessionSyncMsg.getGroup()); - GlobalSession globalSession = raftSessionManager.findGlobalSession(sessionSyncMsg.getBranchSession().getXid()); - BranchSession branchSession = globalSession.getBranch(sessionSyncMsg.getBranchSession().getBranchId()); - BranchStatus status = BranchStatus.get(sessionSyncMsg.getBranchSession().getStatus()); - branchSession.setStatus(status); - if (logger.isDebugEnabled()) { - logger.debug("update branch: {} , status: {}", branchSession.getBranchId(), branchSession.getStatus()); - } - return true; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/global/AddGlobalSessionExecute.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/global/AddGlobalSessionExecute.java deleted file mode 100644 index 21a51a25e0..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/global/AddGlobalSessionExecute.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.execute.global; - -import io.seata.server.cluster.raft.execute.AbstractRaftMsgExecute; -import io.seata.server.cluster.raft.sync.msg.RaftBaseMsg; -import io.seata.server.cluster.raft.sync.msg.RaftGlobalSessionSyncMsg; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHolder; -import io.seata.server.storage.SessionConverter; -import io.seata.server.storage.raft.session.RaftSessionManager; - -/** - * @author jianbin.chen - */ -public class AddGlobalSessionExecute extends AbstractRaftMsgExecute { - - @Override - public Boolean execute(RaftBaseMsg syncMsg) throws Throwable { - RaftGlobalSessionSyncMsg sessionSyncMsg = (RaftGlobalSessionSyncMsg) syncMsg; - RaftSessionManager raftSessionManager = (RaftSessionManager) SessionHolder - .getRootSessionManager(sessionSyncMsg.getGroup()); - GlobalSession globalSession = SessionConverter.convertGlobalSession(sessionSyncMsg.getGlobalSession()); - raftSessionManager.addGlobalSession(globalSession); - if (logger.isDebugEnabled()) { - logger.debug("add session xid: {}", globalSession.getXid()); - } - return true; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/global/RemoveGlobalSessionExecute.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/global/RemoveGlobalSessionExecute.java deleted file mode 100644 index 4a87d918de..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/global/RemoveGlobalSessionExecute.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.execute.global; - -import java.util.Optional; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import io.seata.common.thread.NamedThreadFactory; -import io.seata.core.exception.TransactionException; -import io.seata.server.cluster.raft.execute.AbstractRaftMsgExecute; -import io.seata.server.cluster.raft.sync.msg.RaftBaseMsg; -import io.seata.server.cluster.raft.sync.msg.RaftGlobalSessionSyncMsg; -import io.seata.server.session.SessionHolder; -import io.seata.server.storage.raft.session.RaftSessionManager; - -/** - * @author jianbin.chen - */ -public class RemoveGlobalSessionExecute extends AbstractRaftMsgExecute { - - private static final ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(1, 1, Integer.MAX_VALUE, - TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(2048), - new NamedThreadFactory("RemoveGlobalSessionExecute", 1), new ThreadPoolExecutor.CallerRunsPolicy()); - - @Override - public Boolean execute(RaftBaseMsg syncMsg) throws Throwable { - RaftGlobalSessionSyncMsg sessionSyncMsg = (RaftGlobalSessionSyncMsg) syncMsg; - // when the global transaction needs to be deleted, it does not affect any - // consistency issues, and can be - // deleted in an asynchronous thread to improve the throughput of the state - // machine - RaftSessionManager raftSessionManager = (RaftSessionManager) SessionHolder - .getRootSessionManager(sessionSyncMsg.getGroup()); - Optional.ofNullable(raftSessionManager.findGlobalSession(sessionSyncMsg.getGlobalSession().getXid())) - .ifPresent(globalSession -> { - try { - raftLockManager.localReleaseGlobalSessionLock(globalSession); - EXECUTOR.execute(() -> { - try { - raftSessionManager.removeGlobalSession(globalSession); - if (logger.isDebugEnabled()) { - logger.debug("remove session xid: {}", globalSession.getXid()); - } - } - catch (TransactionException e) { - logger.error("remove global fail error:{}", e.getMessage()); - } - }); - } - catch (TransactionException e) { - logger.error(e.getMessage(), e); - } - }); - return true; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/global/UpdateGlobalSessionExecute.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/global/UpdateGlobalSessionExecute.java deleted file mode 100644 index a6095c2ed5..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/global/UpdateGlobalSessionExecute.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.execute.global; - -import io.seata.core.model.GlobalStatus; -import io.seata.core.model.LockStatus; -import io.seata.server.cluster.raft.execute.AbstractRaftMsgExecute; -import io.seata.server.cluster.raft.sync.msg.RaftBaseMsg; -import io.seata.server.cluster.raft.sync.msg.RaftGlobalSessionSyncMsg; -import io.seata.server.cluster.raft.sync.msg.dto.GlobalTransactionDTO; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHolder; -import io.seata.server.storage.raft.session.RaftSessionManager; - -/** - * @author jianbin.chen - */ -public class UpdateGlobalSessionExecute extends AbstractRaftMsgExecute { - - @Override - public Boolean execute(RaftBaseMsg syncMsg) throws Throwable { - RaftGlobalSessionSyncMsg sessionSyncMsg = (RaftGlobalSessionSyncMsg) syncMsg; - RaftSessionManager raftSessionManager = (RaftSessionManager) SessionHolder - .getRootSessionManager(sessionSyncMsg.getGroup()); - GlobalTransactionDTO globalTransactionDTO = sessionSyncMsg.getGlobalSession(); - GlobalSession globalSession = raftSessionManager.findGlobalSession(globalTransactionDTO.getXid()); - if (globalSession != null) { - globalSession.setStatus(GlobalStatus.get(globalTransactionDTO.getStatus())); - if (GlobalStatus.RollbackRetrying.equals(globalSession.getStatus()) - || GlobalStatus.Rollbacking.equals(globalSession.getStatus()) - || GlobalStatus.TimeoutRollbacking.equals(globalSession.getStatus())) { - globalSession.getBranchSessions() - .parallelStream() - .forEach(branchSession -> branchSession.setLockStatus(LockStatus.Rollbacking)); - } - if (logger.isDebugEnabled()) { - logger.debug("xid: {}, change status: {}", globalSession.getXid(), globalSession.getStatus()); - } - } - return true; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/lock/BranchReleaseLockExecute.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/lock/BranchReleaseLockExecute.java deleted file mode 100644 index 5bc6cc25ad..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/lock/BranchReleaseLockExecute.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.execute.lock; - -import io.seata.server.cluster.raft.execute.AbstractRaftMsgExecute; -import io.seata.server.cluster.raft.sync.msg.RaftBaseMsg; -import io.seata.server.cluster.raft.sync.msg.RaftBranchSessionSyncMsg; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHolder; - -/** - * @author jianbin.chen - */ -public class BranchReleaseLockExecute extends AbstractRaftMsgExecute { - - @Override - public Boolean execute(RaftBaseMsg syncMsg) throws Throwable { - RaftBranchSessionSyncMsg sessionSyncMsg = (RaftBranchSessionSyncMsg) syncMsg; - GlobalSession globalSession = SessionHolder.getRootSessionManager() - .findGlobalSession(sessionSyncMsg.getBranchSession().getXid()); - BranchSession branchSession = globalSession.getBranch(sessionSyncMsg.getBranchSession().getBranchId()); - if (branchSession != null) { - if (logger.isDebugEnabled()) { - logger.debug("releaseBranchSessionLock xid: {}", globalSession.getXid()); - } - return raftLockManager.localReleaseLock(branchSession); - } - return false; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/lock/GlobalReleaseLockExecute.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/lock/GlobalReleaseLockExecute.java deleted file mode 100644 index c5c35cb109..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/execute/lock/GlobalReleaseLockExecute.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.execute.lock; - -import io.seata.server.cluster.raft.execute.AbstractRaftMsgExecute; -import io.seata.server.cluster.raft.sync.msg.RaftBaseMsg; -import io.seata.server.cluster.raft.sync.msg.RaftGlobalSessionSyncMsg; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHolder; - -/** - * @author jianbin.chen - */ -public class GlobalReleaseLockExecute extends AbstractRaftMsgExecute { - - @Override - public Boolean execute(RaftBaseMsg syncMsg) throws Throwable { - RaftGlobalSessionSyncMsg sessionSyncMsg = (RaftGlobalSessionSyncMsg) syncMsg; - GlobalSession globalSession = SessionHolder.getRootSessionManager() - .findGlobalSession(sessionSyncMsg.getGlobalSession().getXid()); - if (globalSession != null) { - if (logger.isDebugEnabled()) { - logger.debug("releaseGlobalSessionLock xid: {}", globalSession.getXid()); - } - globalSession.setActive(false); - return raftLockManager.localReleaseGlobalSessionLock(globalSession); - } - return false; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/serializer/JacksonSerializer.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/serializer/JacksonSerializer.java deleted file mode 100644 index 4183c2ea14..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/serializer/JacksonSerializer.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.serializer; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.seata.common.loader.LoadLevel; -import io.seata.core.serializer.Serializer; - -import java.io.IOException; - -/** - * @author jianbin.chen - */ -@LoadLevel(name = "JACKSON") -public class JacksonSerializer implements Serializer { - - private final ObjectMapper objectMapper = new ObjectMapper(); - - @Override - public byte[] serialize(T t) { - try { - JsonInfo jsonInfo = new JsonInfo(objectMapper.writeValueAsBytes(t), t.getClass()); - return objectMapper.writeValueAsBytes(jsonInfo); - } - catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - @Override - public T deserialize(byte[] bytes) { - try { - JsonInfo jsonInfo = objectMapper.readValue(bytes, JsonInfo.class); - return (T) objectMapper.readValue(jsonInfo.getObj(), jsonInfo.getClz()); - } - catch (IOException e) { - throw new RuntimeException(e); - } - } - - static class JsonInfo { - - byte[] obj; - - Class clz; - - JsonInfo() { - } - - JsonInfo(byte[] obj, Class clz) { - this.obj = obj; - this.clz = clz; - } - - public byte[] getObj() { - return obj; - } - - public void setObj(byte[] obj) { - this.obj = obj; - } - - public Class getClz() { - return clz; - } - - public void setClz(Class clz) { - this.clz = clz; - } - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/RaftSnapshot.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/RaftSnapshot.java deleted file mode 100644 index 10ebfafe96..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/RaftSnapshot.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.snapshot; - -import io.seata.common.util.StringUtils; -import io.seata.config.ConfigurationFactory; -import io.seata.core.compressor.CompressorType; -import io.seata.core.protocol.Version; -import io.seata.core.serializer.SerializerType; - -import java.io.Serializable; - -import static io.seata.common.ConfigurationKeys.SERVER_RAFT_COMPRESSOR; -import static io.seata.common.DefaultValues.DEFAULT_RAFT_COMPRESSOR; -import static io.seata.common.DefaultValues.DEFAULT_RAFT_SERIALIZATION; - -/** - * @author funkye - */ -public class RaftSnapshot implements Serializable { - - private byte codec = SerializerType.getByName(DEFAULT_RAFT_SERIALIZATION).getCode(); - - private byte compressor = CompressorType - .getByName(ConfigurationFactory.getInstance().getConfig(SERVER_RAFT_COMPRESSOR, DEFAULT_RAFT_COMPRESSOR)) - .getCode(); - - private Object body; - - private String version = Version.getCurrent(); - - private SnapshotType type; - - /** - * Gets body. - * @return the body - */ - public Object getBody() { - return body; - } - - /** - * Sets body. - * @param body the body - */ - public void setBody(Object body) { - this.body = body; - } - - /** - * Gets codec. - * @return the codec - */ - public byte getCodec() { - return codec; - } - - /** - * Sets codec. - * @param codec the codec - * @return the codec - */ - public RaftSnapshot setCodec(byte codec) { - this.codec = codec; - return this; - } - - /** - * Gets compressor. - * @return the compressor - */ - public byte getCompressor() { - return compressor; - } - - /** - * Sets compressor. - * @param compressor the compressor - * @return the compressor - */ - public RaftSnapshot setCompressor(byte compressor) { - this.compressor = compressor; - return this; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public SnapshotType getType() { - return type; - } - - public void setType(SnapshotType type) { - this.type = type; - } - - @Override - public String toString() { - return StringUtils.toString(this); - } - - public enum SnapshotType { - - /** - * session snapshot. - */ - session("session"), - /** - * leader metadata snapshot. - */ - leader_metadata("leader_metadata"); - - final String type; - - SnapshotType(String type) { - this.type = type; - } - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/RaftSnapshotSerializer.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/RaftSnapshotSerializer.java deleted file mode 100644 index 3758da803f..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/RaftSnapshotSerializer.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.snapshot; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.Optional; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.core.compressor.CompressorFactory; -import io.seata.core.serializer.Serializer; -import io.seata.core.serializer.SerializerType; - -/** - * @author funkye - */ -public class RaftSnapshotSerializer { - - private static final Logger LOGGER = LoggerFactory.getLogger(RaftSnapshotSerializer.class); - - public static byte[] encode(RaftSnapshot raftSnapshot) throws IOException { - try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos)) { - Serializer serializer = EnhancedServiceLoader.load(Serializer.class, - SerializerType.getByCode(raftSnapshot.getCodec()).name()); - Optional.ofNullable(raftSnapshot.getBody()) - .ifPresent(value -> raftSnapshot.setBody(CompressorFactory.getCompressor(raftSnapshot.getCompressor()) - .compress(serializer.serialize(value)))); - oos.writeObject(raftSnapshot); - return bos.toByteArray(); - } - } - - public static RaftSnapshot decode(byte[] raftSnapshotByte) throws IOException { - try (ByteArrayInputStream bin = new ByteArrayInputStream(raftSnapshotByte); - ObjectInputStream ois = new ObjectInputStream(bin)) { - RaftSnapshot raftSnapshot = (RaftSnapshot) ois.readObject(); - Serializer serializer = EnhancedServiceLoader.load(Serializer.class, - SerializerType.getByCode(raftSnapshot.getCodec()).name()); - Optional.ofNullable(raftSnapshot.getBody()) - .ifPresent(value -> raftSnapshot - .setBody(serializer.deserialize(CompressorFactory.getCompressor(raftSnapshot.getCompressor()) - .decompress((byte[]) raftSnapshot.getBody())))); - return raftSnapshot; - } - catch (ClassNotFoundException e) { - LOGGER.info("Failed to read raft snapshot: {}", e.getMessage(), e); - throw new IOException(e); - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/StoreSnapshotFile.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/StoreSnapshotFile.java deleted file mode 100644 index 8714618f70..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/StoreSnapshotFile.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.snapshot; - -import com.alipay.sofa.jraft.Status; -import com.alipay.sofa.jraft.storage.snapshot.SnapshotReader; -import com.alipay.sofa.jraft.storage.snapshot.SnapshotWriter; -import org.apache.commons.io.FileUtils; - -import java.io.File; -import java.io.IOException; - -/** - * @author funkye - */ -public interface StoreSnapshotFile { - - /** - * Save a snapshot . - * @param writer snapshot writer - * @return true if save succeed - */ - Status save(SnapshotWriter writer); - - /** - * Load snapshot for the specified region. - * @param reader snapshot reader - * @return true if load succeed - */ - boolean load(SnapshotReader reader); - - default boolean save(final RaftSnapshot value, String path) throws IOException { - FileUtils.writeByteArrayToFile(new File(path), RaftSnapshotSerializer.encode(value)); - return true; - } - - /** - * Save value to snapshot file. - */ - default Object load(String path) throws IOException { - RaftSnapshot raftSnapshot = RaftSnapshotSerializer.decode(FileUtils.readFileToByteArray(new File(path))); - return raftSnapshot.getBody(); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/metadata/LeaderMetadataSnapshotFile.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/metadata/LeaderMetadataSnapshotFile.java deleted file mode 100644 index 94341c1eac..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/metadata/LeaderMetadataSnapshotFile.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.snapshot.metadata; - -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import com.alipay.sofa.jraft.Status; -import com.alipay.sofa.jraft.error.RaftError; -import com.alipay.sofa.jraft.storage.snapshot.SnapshotReader; -import com.alipay.sofa.jraft.storage.snapshot.SnapshotWriter; -import io.seata.server.cluster.raft.RaftServerFactory; -import io.seata.server.cluster.raft.snapshot.RaftSnapshot; -import io.seata.server.cluster.raft.snapshot.StoreSnapshotFile; -import io.seata.server.cluster.raft.sync.msg.dto.RaftClusterMetadata; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author jianbin.chen - */ -public class LeaderMetadataSnapshotFile implements Serializable, StoreSnapshotFile { - - private static final long serialVersionUID = 78637164618855724L; - - private static final Logger LOGGER = LoggerFactory.getLogger(LeaderMetadataSnapshotFile.class); - - private final String group; - - private final String fileName = "leader_metadata"; - - public LeaderMetadataSnapshotFile(String group) { - this.group = group; - } - - @Override - public Status save(SnapshotWriter writer) { - RaftSnapshot raftSnapshot = new RaftSnapshot(); - RaftClusterMetadata raftClusterMetadata = RaftServerFactory.getInstance() - .getRaftServer(group) - .getRaftStateMachine() - .getRaftLeaderMetadata(); - raftSnapshot.setBody(raftClusterMetadata); - raftSnapshot.setType(RaftSnapshot.SnapshotType.leader_metadata); - String path = new StringBuilder(writer.getPath()).append(File.separator).append(fileName).toString(); - try { - if (save(raftSnapshot, path)) { - if (writer.addFile(fileName)) { - return Status.OK(); - } - else { - return new Status(RaftError.EIO, "Fail to add file to writer"); - } - } - } - catch (IOException e) { - LOGGER.error("Fail to save groupId: {} snapshot {}", group, path, e); - } - return new Status(RaftError.EIO, "Fail to save groupId: " + group + " snapshot %s", path); - } - - @Override - public boolean load(SnapshotReader reader) { - if (reader.getFileMeta(fileName) == null) { - LOGGER.error("Fail to find data file in {}", reader.getPath()); - return false; - } - String path = new StringBuilder(reader.getPath()).append(File.separator).append(fileName).toString(); - try { - RaftClusterMetadata raftClusterMetadata = (RaftClusterMetadata) load(path); - RaftServerFactory.getInstance() - .getRaftServer(group) - .getRaftStateMachine() - .setRaftLeaderMetadata(raftClusterMetadata); - return true; - } - catch (final Exception e) { - LOGGER.error("fail to load snapshot from {}", path, e); - return false; - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/session/RaftSessionSnapshot.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/session/RaftSessionSnapshot.java deleted file mode 100644 index a097fae939..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/session/RaftSessionSnapshot.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.snapshot.session; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; -import io.seata.common.util.CollectionUtils; -import io.seata.core.exception.TransactionException; -import io.seata.core.model.GlobalStatus; -import io.seata.core.model.LockStatus; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class RaftSessionSnapshot implements java.io.Serializable { - - private static final Logger LOGGER = LoggerFactory.getLogger(RaftSessionSnapshot.class); - - private static final long serialVersionUID = -2257327786007900291L; - - private Map/* branch sessions */> globalsessions = new ConcurrentHashMap<>(); - - public Map> getGlobalsessions() { - return globalsessions; - } - - public void setGlobalsessions(Map> globalsessions) { - this.globalsessions = globalsessions; - } - - public Map convert2GlobalSession() { - Map sessionMap = new HashMap<>(); - globalsessions.forEach((globalSessionByte, branchSessionBytes) -> { - GlobalSession globalSession = new GlobalSession(); - globalSession.decode(globalSessionByte); - branchSessionBytes.forEach(branch -> { - BranchSession branchSession = new BranchSession(); - branchSession.decode(branch); - if (globalSession.isActive()) { - try { - branchSession.lock(); - } - catch (TransactionException e) { - LOGGER.error(e.getMessage()); - } - } - globalSession.add(branchSession); - }); - if (GlobalStatus.Rollbacking.equals(globalSession.getStatus()) - || GlobalStatus.TimeoutRollbacking.equals(globalSession.getStatus())) { - globalSession.getBranchSessions() - .parallelStream() - .forEach(branchSession -> branchSession.setLockStatus(LockStatus.Rollbacking)); - } - sessionMap.put(globalSession.getXid(), globalSession); - }); - return sessionMap; - } - - public void convert2GlobalSessionByte(GlobalSession globalSession) { - byte[] globalSessionByte = globalSession.encode(); - if (CollectionUtils.isEmpty(globalSession.getBranchSessions())) { - globalsessions.put(globalSessionByte, Collections.emptyList()); - } - else { - globalsessions.put(globalSessionByte, - globalSession.getBranchSessions() - .parallelStream() - .map(branch -> branch.encode()) - .collect(Collectors.toList())); - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/session/SessionSnapshotFile.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/session/SessionSnapshotFile.java deleted file mode 100644 index b0be52493e..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/snapshot/session/SessionSnapshotFile.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.snapshot.session; - -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import java.util.Map; -import com.alipay.sofa.jraft.Status; -import com.alipay.sofa.jraft.error.RaftError; -import com.alipay.sofa.jraft.storage.snapshot.SnapshotReader; -import com.alipay.sofa.jraft.storage.snapshot.SnapshotWriter; -import io.seata.server.cluster.raft.snapshot.RaftSnapshot; -import io.seata.server.cluster.raft.snapshot.StoreSnapshotFile; -import io.seata.server.lock.LockerManagerFactory; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHolder; -import io.seata.server.storage.raft.session.RaftSessionManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author funkye - */ -public class SessionSnapshotFile implements Serializable, StoreSnapshotFile { - - private static final Logger LOGGER = LoggerFactory.getLogger(SessionSnapshotFile.class); - - private static final long serialVersionUID = 7942307427240595916L; - - String group; - - String fileName = "session"; - - public SessionSnapshotFile(String group) { - this.group = group; - } - - @Override - public Status save(SnapshotWriter writer) { - RaftSessionManager raftSessionManager = (RaftSessionManager) SessionHolder.getRootSessionManager(group); - Map sessionMap = raftSessionManager.getSessionMap(); - RaftSessionSnapshot sessionSnapshot = new RaftSessionSnapshot(); - sessionMap.forEach((xid, session) -> sessionSnapshot.convert2GlobalSessionByte(session)); - RaftSnapshot raftSnapshot = new RaftSnapshot(); - raftSnapshot.setBody(sessionSnapshot); - raftSnapshot.setType(RaftSnapshot.SnapshotType.session); - LOGGER.info("groupId: {}, global session size: {}", group, sessionSnapshot.getGlobalsessions().size()); - String path = new StringBuilder(writer.getPath()).append(File.separator).append(fileName).toString(); - try { - if (save(raftSnapshot, path)) { - if (writer.addFile(fileName)) { - return Status.OK(); - } - else { - return new Status(RaftError.EIO, "Fail to add file to writer"); - } - } - } - catch (IOException e) { - LOGGER.error("Fail to save groupId: {} snapshot {}", group, path, e); - } - return new Status(RaftError.EIO, "Fail to save groupId: " + group + " snapshot %s", path); - } - - @Override - public boolean load(SnapshotReader reader) { - if (reader.getFileMeta(fileName) == null) { - LOGGER.error("Fail to find data file in {}", reader.getPath()); - return false; - } - String path = new StringBuilder(reader.getPath()).append(File.separator).append(fileName).toString(); - try { - LOGGER.info("on snapshot load start index: {}", reader.load().getLastIncludedIndex()); - RaftSessionSnapshot sessionSnapshot = (RaftSessionSnapshot) load(path); - RaftSessionManager raftSessionManager = (RaftSessionManager) SessionHolder.getRootSessionManager(group); - Map rootSessionMap = raftSessionManager.getSessionMap(); - // be sure to clear the data before loading it, because this is a full - // overwrite update - LockerManagerFactory.getLockManager().cleanAllLocks(); - rootSessionMap.clear(); - rootSessionMap.putAll(sessionSnapshot.convert2GlobalSession()); - if (LOGGER.isInfoEnabled()) { - LOGGER.info("on snapshot load end index: {}", reader.load().getLastIncludedIndex()); - } - return true; - } - catch (final Exception e) { - LOGGER.error("fail to load snapshot from {}", path, e); - return false; - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/RaftSyncMessageSerializer.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/RaftSyncMessageSerializer.java deleted file mode 100644 index d89cf3cf5a..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/RaftSyncMessageSerializer.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.sync; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.Optional; -import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.core.compressor.CompressorFactory; -import io.seata.core.serializer.Serializer; -import io.seata.core.serializer.SerializerType; -import io.seata.server.cluster.raft.sync.msg.RaftSyncMessage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author funkye - */ -public class RaftSyncMessageSerializer { - - private static final Logger LOGGER = LoggerFactory.getLogger(RaftSyncMessageSerializer.class); - - public static byte[] encode(RaftSyncMessage raftSyncMessage) throws IOException { - try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos)) { - Serializer serializer = EnhancedServiceLoader.load(Serializer.class, - SerializerType.getByCode(raftSyncMessage.getCodec()).name()); - Optional.ofNullable(raftSyncMessage.getBody()) - .ifPresent(value -> raftSyncMessage - .setBody(CompressorFactory.getCompressor(raftSyncMessage.getCompressor()) - .compress(serializer.serialize(value)))); - oos.writeObject(raftSyncMessage); - return bos.toByteArray(); - } - } - - public static RaftSyncMessage decode(byte[] raftSyncMsgByte) { - try (ByteArrayInputStream bin = new ByteArrayInputStream(raftSyncMsgByte); - ObjectInputStream ois = new ObjectInputStream(bin)) { - RaftSyncMessage raftSyncMessage = (RaftSyncMessage) ois.readObject(); - Serializer serializer = EnhancedServiceLoader.load(Serializer.class, - SerializerType.getByCode(raftSyncMessage.getCodec()).name()); - Optional.ofNullable(raftSyncMessage.getBody()) - .ifPresent(value -> raftSyncMessage - .setBody(serializer.deserialize(CompressorFactory.getCompressor(raftSyncMessage.getCompressor()) - .decompress((byte[]) raftSyncMessage.getBody())))); - return raftSyncMessage; - } - catch (ClassNotFoundException | IOException e) { - LOGGER.info("Failed to read raft synchronization log: {}", e.getMessage(), e); - throw new RuntimeException(e); - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftBaseMsg.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftBaseMsg.java deleted file mode 100644 index f92f8d7839..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftBaseMsg.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.sync.msg; - -import static io.seata.common.DefaultValues.DEFAULT_SEATA_GROUP; - -/** - * @author jianbin.chen - */ -public class RaftBaseMsg implements java.io.Serializable { - - private static final long serialVersionUID = -1439073440621259777L; - - protected RaftSyncMsgType msgType; - - protected String group = DEFAULT_SEATA_GROUP; - - public RaftSyncMsgType getMsgType() { - return msgType; - } - - public void setMsgType(RaftSyncMsgType msgType) { - this.msgType = msgType; - } - - public String getGroup() { - return group; - } - - public void setGroup(String group) { - this.group = group; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftBranchSessionSyncMsg.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftBranchSessionSyncMsg.java deleted file mode 100644 index 8b32cc9d8b..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftBranchSessionSyncMsg.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.sync.msg; - -import static io.seata.common.DefaultValues.DEFAULT_SEATA_GROUP; - -import io.seata.common.util.StringUtils; -import io.seata.server.cluster.raft.sync.msg.dto.BranchTransactionDTO; - -/** - * @author funkye - */ -public class RaftBranchSessionSyncMsg extends RaftBaseMsg { - - private static final long serialVersionUID = -8577994371969898054L; - - private BranchTransactionDTO branchSession; - - private String group = DEFAULT_SEATA_GROUP; - - public RaftBranchSessionSyncMsg(RaftSyncMsgType msgType, BranchTransactionDTO branchSession) { - this.msgType = msgType; - this.branchSession = branchSession; - } - - public RaftBranchSessionSyncMsg() { - } - - public BranchTransactionDTO getBranchSession() { - return branchSession; - } - - public void setBranchSession(BranchTransactionDTO branchSession) { - this.branchSession = branchSession; - } - - public String getGroup() { - return group; - } - - public void setGroup(String group) { - this.group = group; - } - - @Override - public String toString() { - return StringUtils.toString(this); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftClusterMetadataMsg.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftClusterMetadataMsg.java deleted file mode 100644 index 7e7847c1cf..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftClusterMetadataMsg.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.sync.msg; - -import io.seata.common.util.StringUtils; -import io.seata.server.cluster.raft.sync.msg.dto.RaftClusterMetadata; - -/** - * @author jianbin.chen - */ -public class RaftClusterMetadataMsg extends RaftBaseMsg { - - private static final long serialVersionUID = 6208583637662412658L; - - private RaftClusterMetadata raftClusterMetadata; - - public RaftClusterMetadataMsg(RaftClusterMetadata raftClusterMetadata) { - this.msgType = RaftSyncMsgType.REFRESH_CLUSTER_METADATA; - this.raftClusterMetadata = raftClusterMetadata; - } - - public RaftClusterMetadataMsg() { - } - - public RaftClusterMetadata getRaftClusterMetadata() { - return raftClusterMetadata; - } - - public void setRaftClusterMetadata(RaftClusterMetadata raftClusterMetadata) { - this.raftClusterMetadata = raftClusterMetadata; - } - - @Override - public String toString() { - return StringUtils.toString(this); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftGlobalSessionSyncMsg.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftGlobalSessionSyncMsg.java deleted file mode 100644 index 8a3e35b935..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftGlobalSessionSyncMsg.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.sync.msg; - -import io.seata.common.util.StringUtils; -import io.seata.server.cluster.raft.sync.msg.dto.GlobalTransactionDTO; - -/** - * @author funkye - */ -public class RaftGlobalSessionSyncMsg extends RaftBaseMsg { - - private static final long serialVersionUID = -8577994371969898054L; - - private GlobalTransactionDTO globalSession; - - public RaftGlobalSessionSyncMsg(RaftSyncMsgType msgType, GlobalTransactionDTO globalSession) { - this.msgType = msgType; - this.globalSession = globalSession; - } - - public RaftGlobalSessionSyncMsg() { - } - - public GlobalTransactionDTO getGlobalSession() { - return globalSession; - } - - public void setGlobalSession(GlobalTransactionDTO globalSession) { - this.globalSession = globalSession; - } - - @Override - public String toString() { - return StringUtils.toString(this); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftSyncMessage.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftSyncMessage.java deleted file mode 100644 index f58694c93b..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftSyncMessage.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.sync.msg; - -import io.seata.common.util.StringUtils; -import io.seata.config.ConfigurationFactory; -import io.seata.core.compressor.CompressorType; -import io.seata.core.protocol.Version; -import io.seata.core.serializer.SerializerType; - -import static io.seata.common.DefaultValues.DEFAULT_RAFT_COMPRESSOR; -import static io.seata.common.DefaultValues.DEFAULT_RAFT_SERIALIZATION; -import static io.seata.core.constants.ConfigurationKeys.SERVER_RAFT_COMPRESSOR; - -/** - * @author funkye - */ -public class RaftSyncMessage implements java.io.Serializable { - - private static final long serialVersionUID = 8225279734319945365L; - - private byte codec = SerializerType.getByName(DEFAULT_RAFT_SERIALIZATION).getCode(); - - private byte compressor = CompressorType - .getByName(ConfigurationFactory.getInstance().getConfig(SERVER_RAFT_COMPRESSOR, DEFAULT_RAFT_COMPRESSOR)) - .getCode(); - - private Object body; - - private String version = Version.getCurrent(); - - /** - * Gets body. - * @return the body - */ - public Object getBody() { - return body; - } - - /** - * Sets body. - * @param body the body - */ - public void setBody(Object body) { - this.body = body; - } - - /** - * Gets codec. - * @return the codec - */ - public byte getCodec() { - return codec; - } - - /** - * Sets codec. - * @param codec the codec - * @return the codec - */ - public RaftSyncMessage setCodec(byte codec) { - this.codec = codec; - return this; - } - - /** - * Gets compressor. - * @return the compressor - */ - public byte getCompressor() { - return compressor; - } - - /** - * Sets compressor. - * @param compressor the compressor - * @return the compressor - */ - public RaftSyncMessage setCompressor(byte compressor) { - this.compressor = compressor; - return this; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - @Override - public String toString() { - return StringUtils.toString(this); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftSyncMsgType.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftSyncMsgType.java deleted file mode 100644 index 4a0c337ab8..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/RaftSyncMsgType.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.sync.msg; - -/** - * @author jianbin.chen - */ -public enum RaftSyncMsgType { - - /** - * addGlobalSession. - */ - ADD_GLOBAL_SESSION, - /** - * removeGlobalSession. - */ - REMOVE_GLOBAL_SESSION, - /** - * - */ - ADD_BRANCH_SESSION, - /** - * addBranchSession. - */ - REMOVE_BRANCH_SESSION, - /** - * updateGlobalSessionStatus. - */ - UPDATE_GLOBAL_SESSION_STATUS, - /** - * updateBranchSessionStatus. - */ - UPDATE_BRANCH_SESSION_STATUS, - /** - * releaseGlobalSessionLock. - */ - RELEASE_GLOBAL_SESSION_LOCK, - /** - * releaseBranchSessionLock. - */ - RELEASE_BRANCH_SESSION_LOCK, - /** - * refresh cluster metadata. - */ - REFRESH_CLUSTER_METADATA; - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/dto/BranchTransactionDTO.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/dto/BranchTransactionDTO.java deleted file mode 100644 index 245b9d7f97..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/dto/BranchTransactionDTO.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.sync.msg.dto; - -import io.seata.core.store.BranchTransactionDO; - -/** - * @author jianbin.chen - */ -public class BranchTransactionDTO extends BranchTransactionDO { - - private static final long serialVersionUID = 4550610938263777969L; - - private String lockKey; - - public BranchTransactionDTO(String xid, long branchId) { - super(xid, branchId); - } - - public BranchTransactionDTO() { - super(); - } - - public String getLockKey() { - return lockKey; - } - - public void setLockKey(String lockKey) { - this.lockKey = lockKey; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/dto/GlobalTransactionDTO.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/dto/GlobalTransactionDTO.java deleted file mode 100644 index e43a01c957..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/dto/GlobalTransactionDTO.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.sync.msg.dto; - -import io.seata.core.store.GlobalTransactionDO; - -/** - * @author jianbin.chen - */ -public class GlobalTransactionDTO extends GlobalTransactionDO { - - private static final long serialVersionUID = 8402806824435215696L; - - public GlobalTransactionDTO(String xid) { - super(xid); - } - - public GlobalTransactionDTO() { - super(); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/dto/RaftClusterMetadata.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/dto/RaftClusterMetadata.java deleted file mode 100644 index 40ac2787bd..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/sync/msg/dto/RaftClusterMetadata.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.sync.msg.dto; - -import java.io.Serializable; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import io.seata.common.metadata.Node; -import io.seata.common.util.StringUtils; - -/** - * @author jianbin.chen - */ -public class RaftClusterMetadata implements Serializable { - - private static final long serialVersionUID = 6208583637662412658L; - - private Node leader; - - private List followers; - - private List learner; - - private long term; - - public RaftClusterMetadata() { - } - - public RaftClusterMetadata(long term) { - this.term = term; - } - - public Node createNode(String host, int txPort, int controlPort, String group, Map metadata) { - Node node = new Node(); - node.setTransaction(node.createEndpoint(host, txPort, "seata")); - node.setControl(node.createEndpoint(host, controlPort, "http")); - node.setGroup(group); - Optional.ofNullable(metadata).ifPresent(node::setMetadata); - return node; - } - - public Node getLeader() { - return leader; - } - - public void setLeader(Node leader) { - this.leader = leader; - } - - public long getTerm() { - return term; - } - - public List getFollowers() { - return followers; - } - - public void setFollowers(List followers) { - this.followers = followers; - } - - public List getLearner() { - return learner; - } - - public void setLearner(List learner) { - this.learner = learner; - } - - public void setTerm(long term) { - this.term = term; - } - - @Override - public String toString() { - return StringUtils.toString(this); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/util/RaftTaskUtil.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/util/RaftTaskUtil.java deleted file mode 100644 index edc0eca2ed..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/raft/util/RaftTaskUtil.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.raft.util; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import com.alipay.sofa.jraft.Closure; -import com.alipay.sofa.jraft.entity.Task; -import io.seata.core.exception.GlobalTransactionException; -import io.seata.core.exception.TransactionException; -import io.seata.core.exception.TransactionExceptionCode; -import io.seata.server.cluster.raft.RaftServerFactory; -import io.seata.server.cluster.raft.context.SeataClusterContext; -import io.seata.server.cluster.raft.sync.RaftSyncMessageSerializer; -import io.seata.server.cluster.raft.sync.msg.RaftSyncMessage; - -/** - * @author funkye - */ -public class RaftTaskUtil { - - public static boolean createTask(Closure done, Object data, CompletableFuture completableFuture) - throws TransactionException { - final Task task = new Task(); - if (data != null) { - RaftSyncMessage raftSyncMessage = new RaftSyncMessage(); - raftSyncMessage.setBody(data); - try { - task.setData(ByteBuffer.wrap(RaftSyncMessageSerializer.encode(raftSyncMessage))); - } - catch (IOException e) { - throw new TransactionException(e); - } - } - task.setDone(done == null ? status -> { - } : done); - RaftServerFactory.getInstance().getRaftServer(SeataClusterContext.getGroup()).getNode().apply(task); - if (completableFuture != null) { - return futureGet(completableFuture); - } - return true; - } - - public static boolean createTask(Closure done, CompletableFuture completableFuture) - throws TransactionException { - return createTask(done, null, completableFuture); - } - - public static boolean futureGet(CompletableFuture completableFuture) throws TransactionException { - try { - return completableFuture.get(); - } - catch (InterruptedException e) { - throw new GlobalTransactionException(TransactionExceptionCode.FailedWriteSession, - "Fail to store global session: " + e.getMessage()); - } - catch (ExecutionException e) { - if (e.getCause() instanceof TransactionException) { - throw (TransactionException) e.getCause(); - } - else { - throw new GlobalTransactionException(TransactionExceptionCode.FailedWriteSession, - "Fail to store global session: " + e.getMessage()); - } - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/watch/Watcher.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/watch/Watcher.java deleted file mode 100644 index 14f1944701..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/cluster/watch/Watcher.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.cluster.watch; - -import static io.seata.server.cluster.watch.Watcher.Protocol.HTTP; - -/** - * @author funkye - */ -public class Watcher { - - private String group; - - private volatile boolean done = false; - - private T asyncContext; - - private long timeout; - - private long term; - - private String protocol = HTTP; - - public Watcher(String group, T asyncContext, int timeout, long term) { - this.group = group; - this.asyncContext = asyncContext; - this.timeout = System.currentTimeMillis() + timeout; - this.term = term; - } - - public String getGroup() { - return group; - } - - public void setGroup(String group) { - this.group = group; - } - - public boolean isDone() { - return done; - } - - public void setDone(boolean done) { - this.done = done; - } - - public T getAsyncContext() { - return asyncContext; - } - - public void setAsyncContext(T asyncContext) { - this.asyncContext = asyncContext; - } - - public long getTimeout() { - return timeout; - } - - public void setTimeout(long timeout) { - this.timeout = timeout; - } - - public String getProtocol() { - return protocol; - } - - public void setProtocol(String protocol) { - this.protocol = protocol; - } - - public long getTerm() { - return term; - } - - public void setTerm(long term) { - this.term = term; - } - - public interface Protocol { - - /** - * grpc协议. - */ - String GRPC = "grpc"; - - /** - * http协议. - */ - String HTTP = "http"; - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/controller/BranchSessionController.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/controller/BranchSessionController.java deleted file mode 100644 index eec862e4cc..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/controller/BranchSessionController.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.controller; - -import io.seata.server.console.service.BranchSessionService; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -/** - * Branch Session Controller. - * - * @author zhongxiang.wang - */ -@RestController -@RequestMapping("console/branchSession") -public class BranchSessionController { - - @Resource(type = BranchSessionService.class) - private BranchSessionService branchSessionService; - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/controller/GlobalLockController.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/controller/GlobalLockController.java deleted file mode 100644 index 64ad87789d..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/controller/GlobalLockController.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.controller; - -import io.seata.console.result.PageResult; -import io.seata.server.console.param.GlobalLockParam; -import io.seata.server.console.service.GlobalLockService; -import io.seata.server.console.vo.GlobalLockVO; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -/** - * Global Lock Controller. - * - * @author zhongxiang.wang - */ -@RestController -@RequestMapping("/api/v1/console/globalLock") -public class GlobalLockController { - - @Resource(type = GlobalLockService.class) - private GlobalLockService globalLockService; - - /** - * Query locks by param. - * @param param the param - * @return the list of GlobalLockVO - */ - @GetMapping("query") - public PageResult query(@ModelAttribute GlobalLockParam param) { - return globalLockService.query(param); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/controller/GlobalSessionController.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/controller/GlobalSessionController.java deleted file mode 100644 index 196e657fda..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/controller/GlobalSessionController.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.controller; - -import io.seata.console.result.PageResult; -import io.seata.server.console.param.GlobalSessionParam; -import io.seata.server.console.service.GlobalSessionService; -import io.seata.server.console.vo.GlobalSessionVO; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -/** - * Global Session Controller. - * - * @author zhongxiang.wang - */ -@RestController -@RequestMapping("/api/v1/console/globalSession") -public class GlobalSessionController { - - @Resource(type = GlobalSessionService.class) - private GlobalSessionService globalSessionService; - - /** - * Query all globalSession. - * @param param param for query globalSession - * @return the list of GlobalSessionVO - */ - @GetMapping("query") - public PageResult query(@ModelAttribute GlobalSessionParam param) { - return globalSessionService.query(param); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/db/BranchSessionDBServiceImpl.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/db/BranchSessionDBServiceImpl.java deleted file mode 100644 index 3a15ddd985..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/db/BranchSessionDBServiceImpl.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.impl.db; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - -import javax.sql.DataSource; - -import io.seata.common.ConfigurationKeys; -import io.seata.common.exception.StoreException; -import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.common.util.IOUtil; -import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.console.result.PageResult; -import io.seata.core.store.db.DataSourceProvider; -import io.seata.core.store.db.sql.log.LogStoreSqlsFactory; -import io.seata.server.console.service.BranchSessionService; -import io.seata.server.console.vo.BranchSessionVO; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; - -import static io.seata.common.DefaultValues.DEFAULT_STORE_DB_BRANCH_TABLE; - -/** - * Branch Session DataBase ServiceImpl. - * - * @author zhongxiang.wang - * @author lvekee 734843455@qq.com - */ -@Component -@org.springframework.context.annotation.Configuration -@ConditionalOnExpression("#{'db'.equals('${sessionMode}')}") -public class BranchSessionDBServiceImpl implements BranchSessionService { - - private String branchTable; - - private String dbType; - - private DataSource dataSource; - - public BranchSessionDBServiceImpl() { - Configuration configuration = ConfigurationFactory.getInstance(); - branchTable = configuration.getConfig(ConfigurationKeys.STORE_DB_BRANCH_TABLE, DEFAULT_STORE_DB_BRANCH_TABLE); - dbType = configuration.getConfig(ConfigurationKeys.STORE_DB_TYPE); - if (StringUtils.isBlank(dbType)) { - throw new IllegalArgumentException(ConfigurationKeys.STORE_DB_TYPE + " should not be blank"); - } - String dbDataSource = configuration.getConfig(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE); - if (StringUtils.isBlank(dbDataSource)) { - throw new IllegalArgumentException(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE + " should not be blank"); - } - dataSource = EnhancedServiceLoader.load(DataSourceProvider.class, dbDataSource).provide(); - } - - @Override - public PageResult queryByXid(String xid) { - if (StringUtils.isBlank(xid)) { - throw new IllegalArgumentException("xid should not be blank"); - } - - String whereCondition = " where xid = ? "; - String branchSessionSQL = LogStoreSqlsFactory.getLogStoreSqls(dbType) - .getAllBranchSessionSQL(branchTable, whereCondition); - - List list = new ArrayList<>(); - ResultSet rs = null; - - try (Connection conn = dataSource.getConnection(); - PreparedStatement ps = conn.prepareStatement(branchSessionSQL)) { - ps.setObject(1, xid); - rs = ps.executeQuery(); - while (rs.next()) { - list.add(BranchSessionVO.convert(rs)); - } - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(rs); - } - return PageResult.success(list, list.size(), 0, 0, 0); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/db/GlobalLockDBServiceImpl.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/db/GlobalLockDBServiceImpl.java deleted file mode 100644 index b6fa2f4eb0..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/db/GlobalLockDBServiceImpl.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.impl.db; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - -import javax.sql.DataSource; - -import io.seata.common.ConfigurationKeys; -import io.seata.common.exception.StoreException; -import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.common.util.IOUtil; -import io.seata.common.util.PageUtil; -import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.console.result.PageResult; -import io.seata.core.store.db.DataSourceProvider; -import io.seata.core.store.db.sql.lock.LockStoreSqlFactory; -import io.seata.server.console.param.GlobalLockParam; -import io.seata.server.console.service.GlobalLockService; -import io.seata.server.console.vo.GlobalLockVO; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; - -import static io.seata.common.DefaultValues.DEFAULT_LOCK_DB_TABLE; - -/** - * Global Lock DB ServiceImpl. - * - * @author zhongxiang.wang - * @author lvekee 734843455@qq.com - */ -@Component -@org.springframework.context.annotation.Configuration -@ConditionalOnExpression("#{'db'.equals('${lockMode}')}") -public class GlobalLockDBServiceImpl implements GlobalLockService { - - private String lockTable; - - private String dbType; - - private DataSource dataSource; - - public GlobalLockDBServiceImpl() { - Configuration configuration = ConfigurationFactory.getInstance(); - lockTable = configuration.getConfig(ConfigurationKeys.LOCK_DB_TABLE, DEFAULT_LOCK_DB_TABLE); - dbType = configuration.getConfig(ConfigurationKeys.STORE_DB_TYPE); - if (StringUtils.isBlank(dbType)) { - throw new IllegalArgumentException(ConfigurationKeys.STORE_DB_TYPE + " should not be blank"); - } - String dbDataSource = configuration.getConfig(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE); - if (StringUtils.isBlank(dbDataSource)) { - throw new IllegalArgumentException(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE + " should not be blank"); - } - dataSource = EnhancedServiceLoader.load(DataSourceProvider.class, dbDataSource).provide(); - } - - @Override - public PageResult query(GlobalLockParam param) { - PageUtil.checkParam(param.getPageNum(), param.getPageSize()); - - List sqlParamList = new ArrayList<>(); - String whereCondition = this.getWhereConditionByParam(param, sqlParamList); - - String sourceSql = LockStoreSqlFactory.getLogStoreSql(dbType).getAllLockSql(lockTable, whereCondition); - String queryLockSql = PageUtil.pageSql(sourceSql, dbType, param.getPageNum(), param.getPageSize()); - String lockCountSql = PageUtil.countSql(sourceSql, dbType); - - List list = new ArrayList<>(); - int count = 0; - - ResultSet rs = null; - ResultSet countRs = null; - - try (Connection conn = dataSource.getConnection(); - PreparedStatement ps = conn.prepareStatement(queryLockSql); - PreparedStatement countPs = conn.prepareStatement(lockCountSql)) { - PageUtil.setObject(ps, sqlParamList); - rs = ps.executeQuery(); - while (rs.next()) { - list.add(GlobalLockVO.convert(rs)); - } - PageUtil.setObject(countPs, sqlParamList); - countRs = countPs.executeQuery(); - if (countRs.next()) { - count = countRs.getInt(1); - } - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(rs, countRs); - } - return PageResult.success(list, count, param.getPageNum(), param.getPageSize()); - } - - private String getWhereConditionByParam(GlobalLockParam param, List sqlParamList) { - StringBuilder whereConditionBuilder = new StringBuilder(); - if (StringUtils.isNotBlank(param.getXid())) { - whereConditionBuilder.append(" and xid = ? "); - sqlParamList.add(param.getXid()); - } - if (StringUtils.isNotBlank(param.getTableName())) { - whereConditionBuilder.append(" and table_name = ? "); - sqlParamList.add(param.getTableName()); - } - if (StringUtils.isNotBlank(param.getTransactionId())) { - whereConditionBuilder.append(" and transaction_id = ? "); - sqlParamList.add(param.getTransactionId()); - } - if (StringUtils.isNotBlank(param.getBranchId())) { - whereConditionBuilder.append(" and branch_id = ? "); - sqlParamList.add(param.getBranchId()); - } - if (param.getTimeStart() != null) { - whereConditionBuilder.append(" and gmt_create >= ? "); - sqlParamList.add(param.getTimeStart()); - } - if (param.getTimeEnd() != null) { - whereConditionBuilder.append(" and gmt_create <= ? "); - sqlParamList.add(param.getTimeEnd()); - } - String whereCondition = whereConditionBuilder.toString(); - return whereCondition.replaceFirst("and", "where"); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java deleted file mode 100644 index d97a26607f..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.impl.db; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.List; - -import javax.annotation.Resource; -import javax.sql.DataSource; - -import io.seata.common.ConfigurationKeys; -import io.seata.common.exception.StoreException; -import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.common.util.IOUtil; -import io.seata.common.util.PageUtil; -import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.console.result.PageResult; -import io.seata.core.store.db.DataSourceProvider; -import io.seata.core.store.db.sql.log.LogStoreSqlsFactory; -import io.seata.server.console.param.GlobalSessionParam; -import io.seata.server.console.service.BranchSessionService; -import io.seata.server.console.service.GlobalSessionService; -import io.seata.server.console.vo.BranchSessionVO; -import io.seata.server.console.vo.GlobalSessionVO; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; - -import static io.seata.common.DefaultValues.DEFAULT_STORE_DB_GLOBAL_TABLE; - -/** - * Global Session DataBase ServiceImpl. - * - * @author zhongxiang.wang - * @author lvekee 734843455@qq.com - */ -@Component -@org.springframework.context.annotation.Configuration -@ConditionalOnExpression("#{'db'.equals('${sessionMode}')}") -public class GlobalSessionDBServiceImpl implements GlobalSessionService { - - private String globalTable; - - private String dbType; - - private DataSource dataSource; - - @Resource(type = BranchSessionService.class) - private BranchSessionService branchSessionService; - - public GlobalSessionDBServiceImpl() { - Configuration configuration = ConfigurationFactory.getInstance(); - globalTable = configuration.getConfig(ConfigurationKeys.STORE_DB_GLOBAL_TABLE, DEFAULT_STORE_DB_GLOBAL_TABLE); - dbType = configuration.getConfig(ConfigurationKeys.STORE_DB_TYPE); - if (StringUtils.isBlank(dbType)) { - throw new IllegalArgumentException(ConfigurationKeys.STORE_DB_TYPE + " should not be blank"); - } - String dbDataSource = configuration.getConfig(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE); - if (StringUtils.isBlank(dbDataSource)) { - throw new IllegalArgumentException(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE + " should not be blank"); - } - dataSource = EnhancedServiceLoader.load(DataSourceProvider.class, dbDataSource).provide(); - } - - @Override - public PageResult query(GlobalSessionParam param) { - PageUtil.checkParam(param.getPageNum(), param.getPageSize()); - - List sqlParamList = new ArrayList<>(); - String whereCondition = getWhereConditionByParam(param, sqlParamList); - - String sourceSql = LogStoreSqlsFactory.getLogStoreSqls(dbType) - .getAllGlobalSessionSql(globalTable, whereCondition); - String querySessionSql = PageUtil.pageSql(sourceSql, dbType, param.getPageNum(), param.getPageSize()); - String sessionCountSql = PageUtil.countSql(sourceSql, dbType); - - List list = new ArrayList<>(); - int count = 0; - - ResultSet rs = null; - ResultSet countRs = null; - - try (Connection conn = dataSource.getConnection(); - PreparedStatement ps = conn.prepareStatement(querySessionSql); - PreparedStatement countPs = conn.prepareStatement(sessionCountSql)) { - PageUtil.setObject(ps, sqlParamList); - rs = ps.executeQuery(); - while (rs.next()) { - list.add(GlobalSessionVO.convert(rs)); - } - - PageUtil.setObject(countPs, sqlParamList); - countRs = countPs.executeQuery(); - if (countRs.next()) { - count = countRs.getInt(1); - } - if (param.isWithBranch()) { - for (GlobalSessionVO globalSessionVO : list) { - PageResult pageResp = branchSessionService.queryByXid(globalSessionVO.getXid()); - globalSessionVO.setBranchSessionVOs(new HashSet<>(pageResp.getData())); - } - } - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(rs, countRs); - } - return PageResult.success(list, count, param.getPageNum(), param.getPageSize()); - } - - private String getWhereConditionByParam(GlobalSessionParam param, List sqlParamList) { - StringBuilder whereConditionBuilder = new StringBuilder(); - if (StringUtils.isNotBlank(param.getXid())) { - whereConditionBuilder.append(" and xid = ? "); - sqlParamList.add(param.getXid()); - } - if (StringUtils.isNotBlank(param.getApplicationId())) { - whereConditionBuilder.append(" and application_id = ? "); - sqlParamList.add(param.getApplicationId()); - } - if (param.getStatus() != null) { - whereConditionBuilder.append(" and status = ? "); - sqlParamList.add(param.getStatus()); - } - if (StringUtils.isNotBlank(param.getTransactionName())) { - whereConditionBuilder.append(" and transaction_name = ? "); - sqlParamList.add(param.getTransactionName()); - } - if (param.getTimeStart() != null) { - whereConditionBuilder.append(" and gmt_create >= ? "); - sqlParamList.add(new Date(param.getTimeStart())); - } - if (param.getTimeEnd() != null) { - whereConditionBuilder.append(" and gmt_create <= ? "); - sqlParamList.add(new Date(param.getTimeEnd())); - } - String whereCondition = whereConditionBuilder.toString(); - return whereCondition.replaceFirst("and", "where"); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/file/BranchSessionFileServiceImpl.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/file/BranchSessionFileServiceImpl.java deleted file mode 100644 index 8acb84aab3..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/file/BranchSessionFileServiceImpl.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.impl.file; - -import io.seata.common.exception.NotSupportYetException; -import io.seata.server.console.vo.BranchSessionVO; -import io.seata.console.result.PageResult; -import io.seata.server.console.service.BranchSessionService; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; - -/** - * Branch Session File ServiceImpl. - * - * @author zhongxiang.wang - */ -@Component -@org.springframework.context.annotation.Configuration -@ConditionalOnExpression("#{'file'.equals('${sessionMode}')}") -public class BranchSessionFileServiceImpl implements BranchSessionService { - - @Override - public PageResult queryByXid(String xid) { - throw new NotSupportYetException(); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/file/GlobalLockFileServiceImpl.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/file/GlobalLockFileServiceImpl.java deleted file mode 100644 index f16d455666..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/file/GlobalLockFileServiceImpl.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.impl.file; - -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.StringUtils; -import io.seata.console.result.PageResult; -import io.seata.core.lock.RowLock; -import io.seata.server.console.param.GlobalLockParam; -import io.seata.server.console.service.GlobalLockService; -import io.seata.server.console.vo.GlobalLockVO; -import io.seata.server.lock.LockerManagerFactory; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHolder; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; - -import java.util.Collection; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static io.seata.common.util.StringUtils.isBlank; -import static io.seata.server.console.vo.GlobalLockVO.convert; -import static java.util.Objects.isNull; - -/** - * Global Lock File ServiceImpl. - * - * @author zhongxiang.wang - * @author miaoxueyu - */ -@Component -@org.springframework.context.annotation.Configuration -@ConditionalOnExpression("#{'file'.equals('${lockMode}')}") -public class GlobalLockFileServiceImpl implements GlobalLockService { - - @Override - public PageResult query(GlobalLockParam param) { - checkParam(param); - - final Collection allSessions = SessionHolder.getRootSessionManager().allSessions(); - - final AtomicInteger total = new AtomicInteger(); - List result = allSessions.parallelStream() - .filter(obtainGlobalSessionPredicate(param)) - .flatMap(globalSession -> globalSession.getBranchSessions().stream()) - .filter(obtainBranchSessionPredicate(param)) - .flatMap(branchSession -> filterAndMap(param, branchSession)) - .peek(globalSession -> total.incrementAndGet()) - .collect(Collectors.toList()); - - return PageResult.build(convert(result), param.getPageNum(), param.getPageSize()); - - } - - /** - * filter with tableName and generate RowLock. - * @param param the query param - * @param branchSession the branch session - * @return the RowLock list - */ - private Stream filterAndMap(GlobalLockParam param, BranchSession branchSession) { - if (CollectionUtils.isEmpty(branchSession.getLockHolder())) { - return Stream.empty(); - } - - final String tableName = param.getTableName(); - - // get rowLock from branchSession - final List rowLocks = LockerManagerFactory.getLockManager().collectRowLocks(branchSession); - - if (StringUtils.isNotBlank(tableName)) { - return rowLocks.parallelStream().filter(rowLock -> rowLock.getTableName().contains(param.getTableName())); - } - - return rowLocks.stream(); - } - - /** - * check the param. - * @param param the param - */ - private void checkParam(GlobalLockParam param) { - if (param.getPageSize() <= 0 || param.getPageNum() <= 0) { - throw new IllegalArgumentException("wrong pageSize or pageNum"); - } - - // verification data type - try { - Long.parseLong(param.getTransactionId()); - } - catch (NumberFormatException e) { - param.setTransactionId(null); - } - try { - Long.parseLong(param.getBranchId()); - } - catch (NumberFormatException e) { - param.setBranchId(null); - } - - } - - /** - * obtain the branch session condition. - * @param param condition for query branch session - * @return the filter condition - */ - private Predicate obtainBranchSessionPredicate(GlobalLockParam param) { - return branchSession -> { - // transactionId - return (isBlank(param.getTransactionId()) - || String.valueOf(branchSession.getTransactionId()).contains(param.getTransactionId())) - - && - // branch id - (isBlank(param.getBranchId()) - || String.valueOf(branchSession.getBranchId()).contains(param.getBranchId())); - }; - } - - /** - * obtain the global session condition. - * @param param condition for query global session - * @return the filter condition - */ - private Predicate obtainGlobalSessionPredicate(GlobalLockParam param) { - - return globalSession -> { - // first, there must be withBranchSession - return CollectionUtils.isNotEmpty(globalSession.getBranchSessions()) - - && - // The second is other conditions - // xid - (isBlank(param.getXid()) || globalSession.getXid().contains(param.getXid())) - - && - // timeStart - (isNull(param.getTimeStart()) || param.getTimeStart() <= globalSession.getBeginTime()) - - && - // timeEnd - (isNull(param.getTimeEnd()) || param.getTimeEnd() >= globalSession.getBeginTime()); - }; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java deleted file mode 100644 index bfa3f6e223..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.impl.file; - -import io.seata.console.result.PageResult; -import io.seata.server.console.param.GlobalSessionParam; -import io.seata.server.console.service.GlobalSessionService; -import io.seata.server.console.vo.GlobalSessionVO; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHolder; -import io.seata.server.storage.SessionConverter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; - -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import static io.seata.common.util.StringUtils.isBlank; -import static java.util.Objects.isNull; - -/** - * Global Session File ServiceImpl. - * - * @author zhongxiang.wang - * @author miaoxueyu - */ -@Component -@org.springframework.context.annotation.Configuration -@ConditionalOnExpression("#{'file'.equals('${sessionMode}')}") -public class GlobalSessionFileServiceImpl implements GlobalSessionService { - - @Override - public PageResult query(GlobalSessionParam param) { - if (param.getPageSize() <= 0 || param.getPageNum() <= 0) { - throw new IllegalArgumentException("wrong pageSize or pageNum"); - } - - final Collection allSessions = SessionHolder.getRootSessionManager().allSessions(); - - final List filteredSessions = allSessions.parallelStream() - .filter(obtainPredicate(param)) - .collect(Collectors.toList()); - - return PageResult.build(SessionConverter.convertGlobalSession(filteredSessions), param.getPageNum(), - param.getPageSize()); - } - - /** - * obtain the condition. - * @param param condition for query global session - * @return the filter condition - */ - private Predicate obtainPredicate(GlobalSessionParam param) { - - return session -> { - return - // xid - (isBlank(param.getXid()) || session.getXid().contains(param.getXid())) - - && - // applicationId - (isBlank(param.getApplicationId()) || session.getApplicationId().contains(param.getApplicationId())) - - && - // status - (isNull(param.getStatus()) || Objects.equals(session.getStatus().getCode(), param.getStatus())) - - && - // transactionName - (isBlank(param.getTransactionName()) - || session.getTransactionName().contains(param.getTransactionName())) - - && - // timeStart - (isNull(param.getTimeStart()) || param.getTimeStart() <= session.getBeginTime()) - - && - // timeEnd - (isNull(param.getTimeEnd()) || param.getTimeEnd() >= session.getBeginTime()); - - }; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/raft/BranchSessionRaftServiceImpl.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/raft/BranchSessionRaftServiceImpl.java deleted file mode 100644 index dce8fb50bf..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/raft/BranchSessionRaftServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.impl.raft; - -import io.seata.server.console.impl.file.BranchSessionFileServiceImpl; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; - -/** - * Branch Session File ServiceImpl. - * - * @author zhongxiang.wang - */ -@Component -@org.springframework.context.annotation.Configuration -@ConditionalOnExpression("#{'raft'.equals('${sessionMode}')}") -public class BranchSessionRaftServiceImpl extends BranchSessionFileServiceImpl { - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/raft/GlobalLockRaftServiceImpl.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/raft/GlobalLockRaftServiceImpl.java deleted file mode 100644 index 974b374cbc..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/raft/GlobalLockRaftServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.impl.raft; - -import io.seata.server.console.impl.file.GlobalLockFileServiceImpl; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; - -/** - * Global Lock File ServiceImpl. - * - * @author zhongxiang.wang - */ -@Component -@org.springframework.context.annotation.Configuration -@ConditionalOnExpression("#{'raft'.equals('${lockMode}')}") -public class GlobalLockRaftServiceImpl extends GlobalLockFileServiceImpl { - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/raft/GlobalSessionRaftServiceImpl.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/raft/GlobalSessionRaftServiceImpl.java deleted file mode 100644 index d81a41a880..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/raft/GlobalSessionRaftServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.impl.raft; - -import io.seata.server.console.impl.file.GlobalSessionFileServiceImpl; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; - -/** - * Global Session File ServiceImpl. - * - * @author zhongxiang.wang - */ -@Component -@org.springframework.context.annotation.Configuration -@ConditionalOnExpression("#{'raft'.equals('${sessionMode}')}") -public class GlobalSessionRaftServiceImpl extends GlobalSessionFileServiceImpl { - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java deleted file mode 100644 index af135121a6..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.impl.redis; - -import java.util.ArrayList; -import java.util.List; -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.StringUtils; -import io.seata.console.result.PageResult; -import io.seata.server.console.vo.BranchSessionVO; -import io.seata.core.store.BranchTransactionDO; -import io.seata.server.console.service.BranchSessionService; -import io.seata.server.storage.redis.store.RedisTransactionStoreManager; -import io.seata.server.storage.redis.store.RedisTransactionStoreManagerFactory; -import org.springframework.beans.BeanUtils; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; - -/** - * Branch Session Redis ServiceImpl. - * - * @author zhongxiang.wang - * @author doubleDimple - */ -@Component -@org.springframework.context.annotation.Configuration -@ConditionalOnExpression("#{'redis'.equals('${sessionMode}')}") -public class BranchSessionRedisServiceImpl implements BranchSessionService { - - @Override - public PageResult queryByXid(String xid) { - if (StringUtils.isBlank(xid)) { - return PageResult.success(); - } - - List branchSessionVos = new ArrayList<>(); - - RedisTransactionStoreManager instance = RedisTransactionStoreManagerFactory.getInstance(); - - List branchSessionDos = instance.findBranchSessionByXid(xid); - - if (CollectionUtils.isNotEmpty(branchSessionDos)) { - for (BranchTransactionDO branchSessionDo : branchSessionDos) { - BranchSessionVO branchSessionVO = new BranchSessionVO(); - BeanUtils.copyProperties(branchSessionDo, branchSessionVO); - branchSessionVos.add(branchSessionVO); - } - } - - return PageResult.success(branchSessionVos, branchSessionVos.size(), 0, branchSessionVos.size()); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java deleted file mode 100644 index 9530caab39..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.impl.redis; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import io.seata.common.util.CollectionUtils; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; -import io.seata.common.util.BeanUtils; -import io.seata.server.console.param.GlobalLockParam; -import io.seata.console.result.PageResult; -import io.seata.server.console.vo.GlobalLockVO; -import io.seata.server.console.service.GlobalLockService; -import io.seata.server.storage.redis.JedisPooledFactory; -import redis.clients.jedis.Jedis; -import static io.seata.common.Constants.ROW_LOCK_KEY_SPLIT_CHAR; -import static io.seata.common.exception.FrameworkErrorCode.ParameterRequired; -import static io.seata.common.util.StringUtils.isNotBlank; -import static io.seata.console.result.PageResult.checkPage; -import static io.seata.core.constants.RedisKeyConstants.DEFAULT_REDIS_SEATA_GLOBAL_LOCK_PREFIX; -import static io.seata.core.constants.RedisKeyConstants.DEFAULT_REDIS_SEATA_ROW_LOCK_PREFIX; -import static io.seata.core.constants.RedisKeyConstants.SPLIT; - -/** - * Global Lock Redis Service Impl. - * - * @author zhongxiang.wang - * @author doubleDimple - */ -@Component -@org.springframework.context.annotation.Configuration -@ConditionalOnExpression("#{'redis'.equals('${lockMode}')}") -public class GlobalLockRedisServiceImpl implements GlobalLockService { - - @Override - public PageResult query(GlobalLockParam param) { - - int total = 0; - List globalLockVos; - checkPage(param); - if (isNotBlank(param.getXid())) { - globalLockVos = queryGlobalByXid(param.getXid()); - total = globalLockVos.size(); - return PageResult.success(globalLockVos, total, param.getPageNum(), param.getPageSize()); - } - else if (isNotBlank(param.getTableName()) && isNotBlank(param.getPk()) && isNotBlank(param.getResourceId())) { - // SEATA_ROW_LOCK_jdbc:mysql://116.62.62.26/seata-order^^^order^^^2188 - String tableName = param.getTableName(); - String pk = param.getPk(); - String resourceId = param.getResourceId(); - globalLockVos = queryGlobalLockByRowKey(buildRowKey(tableName, pk, resourceId)); - total = globalLockVos.size(); - return PageResult.success(globalLockVos, total, param.getPageNum(), param.getPageSize()); - } - else { - return PageResult.failure(ParameterRequired.getErrCode(), - "only three parameters of tableName,pk,resourceId or Xid are supported"); - } - } - - private List queryGlobalLockByRowKey(String buildRowKey) { - return readGlobalLockByRowKey(buildRowKey); - } - - private String buildRowKey(String tableName, String pk, String resourceId) { - return DEFAULT_REDIS_SEATA_ROW_LOCK_PREFIX + resourceId + SPLIT + tableName + SPLIT + pk; - } - - private List queryGlobalByXid(String xid) { - return readGlobalLockByXid(DEFAULT_REDIS_SEATA_GLOBAL_LOCK_PREFIX + xid); - } - - private List readGlobalLockByXid(String key) { - List vos = new ArrayList<>(); - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - Map mapGlobalKeys = jedis.hgetAll(key); - if (CollectionUtils.isNotEmpty(mapGlobalKeys)) { - List rowLockKeys = new ArrayList<>(); - mapGlobalKeys.forEach((k, v) -> rowLockKeys.addAll(Arrays.asList(v.split(ROW_LOCK_KEY_SPLIT_CHAR)))); - for (String rowLoclKey : rowLockKeys) { - Map mapRowLockKey = jedis.hgetAll(rowLoclKey); - GlobalLockVO vo = (GlobalLockVO) BeanUtils.mapToObject(mapRowLockKey, GlobalLockVO.class); - if (vo != null) { - vos.add(vo); - } - } - } - } - - return vos; - } - - private List readGlobalLockByRowKey(String key) { - List vos = new ArrayList<>(); - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - Map map = jedis.hgetAll(key); - GlobalLockVO vo = (GlobalLockVO) BeanUtils.mapToObject(map, GlobalLockVO.class); - if (vo != null) { - vos.add(vo); - } - } - return vos; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java deleted file mode 100644 index 12121aa554..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.impl.redis; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import io.seata.common.util.CollectionUtils; -import io.seata.console.result.PageResult; -import io.seata.server.console.param.GlobalSessionParam; -import io.seata.server.console.vo.GlobalSessionVO; -import io.seata.core.model.GlobalStatus; -import io.seata.server.console.service.GlobalSessionService; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionCondition; -import io.seata.server.storage.redis.store.RedisTransactionStoreManager; -import io.seata.server.storage.redis.store.RedisTransactionStoreManagerFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; -import static io.seata.common.exception.FrameworkErrorCode.ParameterRequired; -import static io.seata.common.util.StringUtils.isBlank; -import static io.seata.common.util.StringUtils.isNotBlank; -import static io.seata.console.result.PageResult.checkPage; -import static io.seata.server.storage.SessionConverter.convertToGlobalSessionVo; - -/** - * Global Session Redis ServiceImpl. - * - * @author zhongxiang.wang - * @author doubleDimple - */ -@Component -@org.springframework.context.annotation.Configuration -@ConditionalOnExpression("#{'redis'.equals('${sessionMode}')}") -public class GlobalSessionRedisServiceImpl implements GlobalSessionService { - - private static final Logger LOGGER = LoggerFactory.getLogger(GlobalSessionRedisServiceImpl.class); - - @Override - public PageResult query(GlobalSessionParam param) { - List result = new ArrayList<>(); - Long total = 0L; - if (param.getTimeStart() != null || param.getTimeEnd() != null) { - // not support time range query - LOGGER.debug("not supported according to time range query"); - return PageResult.failure(ParameterRequired.getErrCode(), "not supported according to time range query"); - } - List globalSessions = new ArrayList<>(); - - RedisTransactionStoreManager instance = RedisTransactionStoreManagerFactory.getInstance(); - - checkPage(param); - - if (isBlank(param.getXid()) && param.getStatus() == null) { - total = instance.countByGlobalSessions(GlobalStatus.values()); - globalSessions = instance.findGlobalSessionByPage(param.getPageNum(), param.getPageSize(), - param.isWithBranch()); - } - else { - List globalSessionsNew = new ArrayList<>(); - if (isNotBlank(param.getXid())) { - SessionCondition sessionCondition = new SessionCondition(); - sessionCondition.setXid(param.getXid()); - sessionCondition.setLazyLoadBranch(!param.isWithBranch()); - globalSessions = instance.readSession(sessionCondition); - total = (long) globalSessions.size(); - } - - if (param.getStatus() != null && GlobalStatus.get(param.getStatus()) != null) { - if (CollectionUtils.isNotEmpty(globalSessions)) { - globalSessionsNew = globalSessions.stream() - .filter(globalSession -> globalSession.getStatus().getCode() == (param.getStatus())) - .collect(Collectors.toList()); - total = (long) globalSessionsNew.size(); - } - else { - total = instance.countByGlobalSessions(new GlobalStatus[] { GlobalStatus.get(param.getStatus()) }); - globalSessionsNew = instance.readSessionStatusByPage(param); - } - } - - if (LOGGER.isDebugEnabled()) { - if (isNotBlank(param.getApplicationId())) { - // not support - LOGGER.debug("not supported according to applicationId query"); - } - if (isNotBlank(param.getTransactionName())) { - // not support - LOGGER.debug("not supported according to transactionName query"); - } - } - globalSessions = globalSessionsNew.size() > 0 ? globalSessionsNew : globalSessions; - } - - convertToGlobalSessionVo(result, globalSessions); - - return PageResult.success(result, total.intValue(), param.getPageNum(), param.getPageSize()); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/param/GlobalLockParam.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/param/GlobalLockParam.java deleted file mode 100644 index f688768394..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/param/GlobalLockParam.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.param; - -import io.seata.console.param.BaseParam; - -import java.io.Serializable; - -/** - * Global lock param. - * - * @author zhongxiang.wang - */ -public class GlobalLockParam extends BaseParam implements Serializable { - - private static final long serialVersionUID = 615412528070131284L; - - /** - * the xid. - */ - private String xid; - - /** - * the table name. - */ - private String tableName; - - /** - * the transaction id. - */ - private String transactionId; - - /** - * the branch id. - */ - private String branchId; - - /** - * the primary Key. - */ - private String pk; - - /** - * the resourceId. - */ - private String resourceId; - - public String getTransactionId() { - return transactionId; - } - - public void setTransactionId(String transactionId) { - this.transactionId = transactionId; - } - - public String getBranchId() { - return branchId; - } - - public void setBranchId(String branchId) { - this.branchId = branchId; - } - - public String getXid() { - return xid; - } - - public void setXid(String xid) { - this.xid = xid; - } - - public String getTableName() { - return tableName; - } - - public void setTableName(String tableName) { - this.tableName = tableName; - } - - public String getPk() { - return pk; - } - - public void setPk(String pk) { - this.pk = pk; - } - - public String getResourceId() { - return resourceId; - } - - public void setResourceId(String resourceId) { - this.resourceId = resourceId; - } - - @Override - public String toString() { - return "GlobalLockParam{" + "xid='" + xid + '\'' + ", tableName='" + tableName + '\'' + ", transactionId='" - + transactionId + '\'' + ", branchId='" + branchId + '\'' + ", pk='" + pk + '\'' + ", resourceId='" - + resourceId + '\'' + '}'; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/param/GlobalSessionParam.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/param/GlobalSessionParam.java deleted file mode 100644 index 75792b58df..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/param/GlobalSessionParam.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.param; - -import io.seata.console.param.BaseParam; - -import java.io.Serializable; - -/** - * Global session param. - * - * @author zhongxiang.wang - */ -public class GlobalSessionParam extends BaseParam implements Serializable { - - private static final long serialVersionUID = 115488252809011284L; - - /** - * the xid. - */ - private String xid; - - /** - * the application id. - */ - private String applicationId; - - /** - * the global session status. - */ - private Integer status; - - /** - * the transaction name. - */ - private String transactionName; - - /** - * if with branch true: with branch session false: no branch session. - */ - private boolean withBranch; - - public String getXid() { - return xid; - } - - public void setXid(String xid) { - this.xid = xid; - } - - public String getTransactionName() { - return transactionName; - } - - public void setTransactionName(String transactionName) { - this.transactionName = transactionName; - } - - public String getApplicationId() { - return applicationId; - } - - public void setApplicationId(String applicationId) { - this.applicationId = applicationId; - } - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public boolean isWithBranch() { - return withBranch; - } - - public void setWithBranch(boolean withBranch) { - this.withBranch = withBranch; - } - - @Override - public String toString() { - return "GlobalSessionParam{" + "xid='" + xid + '\'' + ", applicationId='" + applicationId + '\'' + ", status=" - + status + ", transactionName='" + transactionName + '\'' + ", withBranch=" + withBranch + '}'; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/service/BranchSessionService.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/service/BranchSessionService.java deleted file mode 100644 index d980b916e2..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/service/BranchSessionService.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.service; - -import io.seata.server.console.vo.BranchSessionVO; -import io.seata.console.result.PageResult; - -/** - * Branch session service. - * - * @author wangzhongxiang - */ -public interface BranchSessionService { - - /** - * Query branch session by xid. - * @param xid the xid - * @return the BranchSessionVO list - */ - PageResult queryByXid(String xid); - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/service/GlobalLockService.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/service/GlobalLockService.java deleted file mode 100644 index 25b0e08b94..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/service/GlobalLockService.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.service; - -import io.seata.server.console.param.GlobalLockParam; -import io.seata.server.console.vo.GlobalLockVO; -import io.seata.console.result.PageResult; - -/** - * Global lock service. - * - * @author wangzhongxiang - */ -public interface GlobalLockService { - - /** - * Query locks by param. - * @param param the param - * @return the list of GlobalLockVO - */ - PageResult query(GlobalLockParam param); - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/service/GlobalSessionService.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/service/GlobalSessionService.java deleted file mode 100644 index 49b073bc28..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/service/GlobalSessionService.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.service; - -import io.seata.server.console.param.GlobalSessionParam; -import io.seata.server.console.vo.GlobalSessionVO; -import io.seata.console.result.PageResult; - -/** - * Global session service. - * - * @author wangzhongxiang - */ -public interface GlobalSessionService { - - /** - * Query global session. - * @param param the param - * @return the GlobalSessionVO list - */ - PageResult query(GlobalSessionParam param); - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/vo/BranchSessionVO.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/vo/BranchSessionVO.java deleted file mode 100644 index b359053786..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/vo/BranchSessionVO.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.vo; - -import io.seata.core.constants.ServerTableColumnsName; - -import java.sql.Date; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Objects; - -/** - * BranchSessionVO. - * - * @author zhongxiang.wang - */ -public class BranchSessionVO { - - private String xid; - - private String transactionId; - - private String branchId; - - private String resourceGroupId; - - private String resourceId; - - private String branchType; - - private Integer status; - - private String clientId; - - private String applicationData; - - private Long gmtCreate; - - private Long gmtModified; - - public BranchSessionVO() { - - } - - public BranchSessionVO(String xid, Long transactionId, Long branchId, String resourceGroupId, String resourceId, - String branchType, Integer status, String clientId, String applicationData) { - this.xid = xid; - this.transactionId = String.valueOf(transactionId); - this.branchId = String.valueOf(branchId); - this.resourceGroupId = resourceGroupId; - this.resourceId = resourceId; - this.branchType = branchType; - this.status = status; - this.clientId = clientId; - this.applicationData = applicationData; - } - - public String getXid() { - return xid; - } - - public void setXid(String xid) { - this.xid = xid; - } - - public String getTransactionId() { - return transactionId; - } - - public void setTransactionId(Long transactionId) { - this.transactionId = String.valueOf(transactionId); - } - - public String getBranchId() { - return branchId; - } - - public void setBranchId(Long branchId) { - this.branchId = String.valueOf(branchId); - } - - public String getResourceGroupId() { - return resourceGroupId; - } - - public void setResourceGroupId(String resourceGroupId) { - this.resourceGroupId = resourceGroupId; - } - - public String getResourceId() { - return resourceId; - } - - public void setResourceId(String resourceId) { - this.resourceId = resourceId; - } - - public String getBranchType() { - return branchType; - } - - public void setBranchType(String branchType) { - this.branchType = branchType; - } - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public String getClientId() { - return clientId; - } - - public void setClientId(String clientId) { - this.clientId = clientId; - } - - public String getApplicationData() { - return applicationData; - } - - public void setApplicationData(String applicationData) { - this.applicationData = applicationData; - } - - public Long getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Long gmtCreate) { - this.gmtCreate = gmtCreate; - } - - public Long getGmtModified() { - return gmtModified; - } - - public void setGmtModified(Long gmtModified) { - this.gmtModified = gmtModified; - } - - public static BranchSessionVO convert(ResultSet rs) throws SQLException { - BranchSessionVO branchSessionVO = new BranchSessionVO(); - branchSessionVO.setXid(rs.getString(ServerTableColumnsName.BRANCH_TABLE_XID)); - branchSessionVO.setTransactionId(rs.getLong(ServerTableColumnsName.BRANCH_TABLE_TRANSACTION_ID)); - branchSessionVO.setBranchId(rs.getLong(ServerTableColumnsName.BRANCH_TABLE_BRANCH_ID)); - branchSessionVO.setResourceGroupId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_RESOURCE_GROUP_ID)); - branchSessionVO.setResourceId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_RESOURCE_ID)); - branchSessionVO.setBranchType(rs.getString(ServerTableColumnsName.BRANCH_TABLE_BRANCH_TYPE)); - branchSessionVO.setStatus(rs.getInt(ServerTableColumnsName.BRANCH_TABLE_STATUS)); - branchSessionVO.setClientId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_CLIENT_ID)); - branchSessionVO.setApplicationData(rs.getString(ServerTableColumnsName.BRANCH_TABLE_APPLICATION_DATA)); - Date gmtCreateTimestamp = rs.getDate(ServerTableColumnsName.BRANCH_TABLE_GMT_CREATE); - if (gmtCreateTimestamp != null) { - branchSessionVO.setGmtCreate(gmtCreateTimestamp.getTime()); - } - Date gmtModifiedTimestamp = rs.getDate(ServerTableColumnsName.BRANCH_TABLE_GMT_MODIFIED); - if (gmtModifiedTimestamp != null) { - branchSessionVO.setGmtModified(gmtModifiedTimestamp.getTime()); - } - return branchSessionVO; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - BranchSessionVO that = (BranchSessionVO) o; - return Objects.equals(xid, that.xid) && Objects.equals(transactionId, that.transactionId) - && Objects.equals(branchId, that.branchId) && Objects.equals(resourceGroupId, that.resourceGroupId) - && Objects.equals(resourceId, that.resourceId) && Objects.equals(branchType, that.branchType) - && Objects.equals(status, that.status) && Objects.equals(clientId, that.clientId) - && Objects.equals(applicationData, that.applicationData) && Objects.equals(gmtCreate, that.gmtCreate) - && Objects.equals(gmtModified, that.gmtModified); - } - - @Override - public int hashCode() { - return Objects.hash(xid, transactionId, branchId, resourceGroupId, resourceId, branchType, status, clientId, - applicationData, gmtCreate, gmtModified); - } - - @Override - public String toString() { - return "BranchSessionVO{" + "xid='" + xid + '\'' + ", transactionId=" + transactionId + ", branchId=" + branchId - + ", resourceGroupId='" + resourceGroupId + '\'' + ", resourceId='" + resourceId + '\'' - + ", branchType='" + branchType + '\'' + ", status=" + status + ", clientId='" + clientId + '\'' - + ", applicationData='" + applicationData + '\'' + ", gmtCreate=" + gmtCreate + ", gmtModified=" - + gmtModified + '}'; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/vo/GlobalLockVO.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/vo/GlobalLockVO.java deleted file mode 100644 index 9a07754b13..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/vo/GlobalLockVO.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.vo; - -import io.seata.common.util.CollectionUtils; -import io.seata.core.constants.ServerTableColumnsName; -import io.seata.core.lock.RowLock; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * GlobalLockVO. - * - * @author zhongxiang.wang - * @author miaoxueyu - */ -public class GlobalLockVO { - - private String xid; - - private String transactionId; - - private String branchId; - - private String resourceId; - - private String tableName; - - private String pk; - - private String rowKey; - - private Long gmtCreate; - - private Long gmtModified; - - /** - * convert RowLock list to GlobalLockVO list. - * @param rowLocks the RowLock list - * @return the GlobalLockVO list - */ - public static List convert(List rowLocks) { - if (CollectionUtils.isEmpty(rowLocks)) { - return Collections.emptyList(); - } - final List result = new ArrayList<>(rowLocks.size()); - for (RowLock rowLock : rowLocks) { - result.add(convert(rowLock)); - } - - return result; - } - - /** - * convert RowLock to GlobalLockVO. - * @param rowLock the RowLock - * @return the GlobalLockVO - */ - public static GlobalLockVO convert(RowLock rowLock) { - final GlobalLockVO globalLockVO = new GlobalLockVO(); - globalLockVO.setXid(rowLock.getXid()); - globalLockVO.setTransactionId(rowLock.getTransactionId()); - globalLockVO.setBranchId(rowLock.getBranchId()); - globalLockVO.setResourceId(rowLock.getResourceId()); - globalLockVO.setTableName(rowLock.getTableName()); - globalLockVO.setPk(rowLock.getPk()); - globalLockVO.setRowKey(rowLock.getRowKey()); - return globalLockVO; - } - - public String getXid() { - return xid; - } - - public void setXid(String xid) { - this.xid = xid; - } - - public String getTransactionId() { - return transactionId; - } - - public void setTransactionId(Long transactionId) { - this.transactionId = String.valueOf(transactionId); - } - - public String getBranchId() { - return branchId; - } - - public void setBranchId(Long branchId) { - this.branchId = String.valueOf(branchId); - } - - public String getResourceId() { - return resourceId; - } - - public void setResourceId(String resourceId) { - this.resourceId = resourceId; - } - - public String getTableName() { - return tableName; - } - - public void setTableName(String tableName) { - this.tableName = tableName; - } - - public String getPk() { - return pk; - } - - public void setPk(String pk) { - this.pk = pk; - } - - public String getRowKey() { - return rowKey; - } - - public void setRowKey(String rowKey) { - this.rowKey = rowKey; - } - - public Long getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Long gmtCreate) { - this.gmtCreate = gmtCreate; - } - - public Long getGmtModified() { - return gmtModified; - } - - public void setGmtModified(Long gmtModified) { - this.gmtModified = gmtModified; - } - - public static GlobalLockVO convert(ResultSet rs) throws SQLException { - GlobalLockVO globalLockVO = new GlobalLockVO(); - globalLockVO.setRowKey(rs.getString(ServerTableColumnsName.LOCK_TABLE_ROW_KEY)); - globalLockVO.setXid(rs.getString(ServerTableColumnsName.LOCK_TABLE_XID)); - globalLockVO.setTransactionId(rs.getLong(ServerTableColumnsName.LOCK_TABLE_TRANSACTION_ID)); - globalLockVO.setBranchId(rs.getLong(ServerTableColumnsName.LOCK_TABLE_BRANCH_ID)); - globalLockVO.setResourceId(rs.getString(ServerTableColumnsName.LOCK_TABLE_RESOURCE_ID)); - globalLockVO.setTableName(rs.getString(ServerTableColumnsName.LOCK_TABLE_TABLE_NAME)); - globalLockVO.setPk(rs.getString(ServerTableColumnsName.LOCK_TABLE_PK)); - Timestamp gmtCreateTimestamp = rs.getTimestamp(ServerTableColumnsName.LOCK_TABLE_GMT_CREATE); - if (gmtCreateTimestamp != null) { - globalLockVO.setGmtCreate(gmtCreateTimestamp.getTime()); - } - Timestamp gmtModifiedTimestamp = rs.getTimestamp(ServerTableColumnsName.LOCK_TABLE_GMT_MODIFIED); - if (gmtModifiedTimestamp != null) { - globalLockVO.setGmtModified(gmtModifiedTimestamp.getTime()); - } - return globalLockVO; - } - - @Override - public String toString() { - return "GlobalLockVO{" + "xid='" + xid + '\'' + ", transactionId=" + transactionId + ", branchId=" + branchId - + ", resourceId='" + resourceId + '\'' + ", tableName='" + tableName + '\'' + ", pk='" + pk + '\'' - + ", rowKey='" + rowKey + '\'' + ", gmtCreate=" + gmtCreate + ", gmtModified=" + gmtModified + '}'; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/vo/GlobalSessionVO.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/vo/GlobalSessionVO.java deleted file mode 100644 index 55d9968c4c..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/console/vo/GlobalSessionVO.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.console.vo; - -import io.seata.core.constants.ServerTableColumnsName; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; -import java.util.Set; - -/** - * GlobalSessionVO. - * - * @author zhongxiang.wang - */ -public class GlobalSessionVO { - - private String xid; - - private String transactionId; - - private Integer status; - - private String applicationId; - - private String transactionServiceGroup; - - private String transactionName; - - private Long timeout; - - private Long beginTime; - - private String applicationData; - - private Long gmtCreate; - - private Long gmtModified; - - private Set branchSessionVOs; - - public GlobalSessionVO() { - - } - - public GlobalSessionVO(String xid, Long transactionId, Integer status, String applicationId, - String transactionServiceGroup, String transactionName, Long timeout, Long beginTime, - String applicationData, Set branchSessionVOs) { - this.xid = xid; - this.transactionId = String.valueOf(transactionId); - this.status = status; - this.applicationId = applicationId; - this.transactionServiceGroup = transactionServiceGroup; - this.transactionName = transactionName; - this.timeout = timeout; - this.beginTime = beginTime; - this.applicationData = applicationData; - this.branchSessionVOs = branchSessionVOs; - } - - public String getXid() { - return xid; - } - - public void setXid(String xid) { - this.xid = xid; - } - - public String getTransactionId() { - return transactionId; - } - - public void setTransactionId(Long transactionId) { - this.transactionId = String.valueOf(transactionId); - } - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public String getApplicationId() { - return applicationId; - } - - public void setApplicationId(String applicationId) { - this.applicationId = applicationId; - } - - public String getTransactionServiceGroup() { - return transactionServiceGroup; - } - - public void setTransactionServiceGroup(String transactionServiceGroup) { - this.transactionServiceGroup = transactionServiceGroup; - } - - public String getTransactionName() { - return transactionName; - } - - public void setTransactionName(String transactionName) { - this.transactionName = transactionName; - } - - public Long getTimeout() { - return timeout; - } - - public void setTimeout(Long timeout) { - this.timeout = timeout; - } - - public Long getBeginTime() { - return beginTime; - } - - public void setBeginTime(Long beginTime) { - this.beginTime = beginTime; - } - - public String getApplicationData() { - return applicationData; - } - - public void setApplicationData(String applicationData) { - this.applicationData = applicationData; - } - - public Long getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Long gmtCreate) { - this.gmtCreate = gmtCreate; - } - - public Long getGmtModified() { - return gmtModified; - } - - public void setGmtModified(Long gmtModified) { - this.gmtModified = gmtModified; - } - - public Set getBranchSessionVOs() { - return branchSessionVOs; - } - - public void setBranchSessionVOs(Set branchSessionVOs) { - this.branchSessionVOs = branchSessionVOs; - } - - public static GlobalSessionVO convert(ResultSet rs) throws SQLException { - GlobalSessionVO globalSessionVO = new GlobalSessionVO(); - globalSessionVO.setXid(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_XID)); - globalSessionVO.setTransactionId(rs.getLong(ServerTableColumnsName.GLOBAL_TABLE_TRANSACTION_ID)); - globalSessionVO.setStatus(rs.getInt(ServerTableColumnsName.GLOBAL_TABLE_STATUS)); - globalSessionVO.setApplicationId(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_APPLICATION_ID)); - globalSessionVO - .setTransactionServiceGroup(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_TRANSACTION_SERVICE_GROUP)); - globalSessionVO.setTransactionName(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_TRANSACTION_NAME)); - globalSessionVO.setTimeout(rs.getLong(ServerTableColumnsName.GLOBAL_TABLE_TIMEOUT)); - globalSessionVO.setBeginTime(rs.getLong(ServerTableColumnsName.GLOBAL_TABLE_BEGIN_TIME)); - globalSessionVO.setApplicationData(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_APPLICATION_DATA)); - Timestamp gmtCreateTimestamp = rs.getTimestamp(ServerTableColumnsName.GLOBAL_TABLE_GMT_CREATE); - if (gmtCreateTimestamp != null) { - globalSessionVO.setGmtCreate(gmtCreateTimestamp.getTime()); - } - Timestamp gmtModifiedTimestamp = rs.getTimestamp(ServerTableColumnsName.GLOBAL_TABLE_GMT_MODIFIED); - if (gmtModifiedTimestamp != null) { - globalSessionVO.setGmtModified(gmtModifiedTimestamp.getTime()); - } - return globalSessionVO; - } - - @Override - public String toString() { - return "GlobalSessionVO{" + "xid='" + xid + '\'' + ", transactionId=" + transactionId + ", status=" + status - + ", applicationId='" + applicationId + '\'' + ", transactionServiceGroup='" + transactionServiceGroup - + '\'' + ", transactionName='" + transactionName + '\'' + ", timeout=" + timeout + ", beginTime=" - + beginTime + ", applicationData='" + applicationData + '\'' + ", gmtCreate=" + gmtCreate - + ", gmtModified=" + gmtModified + ", branchSessionVOs=" + branchSessionVOs + '}'; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/controller/ClusterController.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/controller/ClusterController.java deleted file mode 100644 index 4f00571853..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/controller/ClusterController.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.controller; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import javax.servlet.AsyncContext; -import javax.servlet.http.HttpServletRequest; - -import com.alipay.sofa.jraft.RouteTable; -import com.alipay.sofa.jraft.conf.Configuration; -import com.alipay.sofa.jraft.entity.PeerId; -import io.seata.common.ConfigurationKeys; -import io.seata.common.metadata.MetadataResponse; -import io.seata.common.metadata.Node; -import io.seata.common.util.StringUtils; -import io.seata.config.ConfigurationFactory; -import io.seata.console.result.Result; -import io.seata.server.cluster.manager.ClusterWatcherManager; -import io.seata.server.cluster.raft.RaftServer; -import io.seata.server.cluster.raft.RaftServerFactory; -import io.seata.server.cluster.raft.sync.msg.dto.RaftClusterMetadata; -import io.seata.server.cluster.watch.Watcher; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.context.ApplicationContext; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import static io.seata.common.ConfigurationKeys.STORE_MODE; -import static io.seata.common.DefaultValues.DEFAULT_SEATA_GROUP; - -/** - * @author funkye - */ -@RestController -@RequestMapping("/metadata/v1") -public class ClusterController { - - private static final Logger LOGGER = LoggerFactory.getLogger(ClusterController.class); - - @Resource - private ClusterWatcherManager clusterWatcherManager; - - private ServerProperties serverProperties; - - @Resource - ApplicationContext applicationContext; - - @PostConstruct - private void init() { - this.serverProperties = applicationContext.getBean(ServerProperties.class); - } - - @PostMapping("/changeCluster") - public Result changeCluster(@RequestParam String raftClusterStr) { - Result result = new Result<>(); - final Configuration newConf = new Configuration(); - if (!newConf.parse(raftClusterStr)) { - result.setMessage("fail to parse initConf:" + raftClusterStr); - } - else { - RaftServerFactory.groups().forEach(group -> { - RaftServerFactory.getCliServiceInstance() - .changePeers(group, RouteTable.getInstance().getConfiguration(group), newConf); - RouteTable.getInstance().updateConfiguration(group, newConf); - }); - } - return result; - } - - @GetMapping("/cluster") - public MetadataResponse cluster(String group) { - MetadataResponse metadataResponse = new MetadataResponse(); - if (StringUtils.isBlank(group)) { - group = ConfigurationFactory.getInstance() - .getConfig(ConfigurationKeys.SERVER_RAFT_GROUP, DEFAULT_SEATA_GROUP); - } - RaftServer raftServer = RaftServerFactory.getInstance().getRaftServer(group); - if (raftServer != null) { - String mode = ConfigurationFactory.getInstance().getConfig(STORE_MODE); - metadataResponse.setStoreMode(mode); - RouteTable routeTable = RouteTable.getInstance(); - try { - routeTable.refreshLeader(RaftServerFactory.getCliClientServiceInstance(), group, 1000); - PeerId leader = routeTable.selectLeader(group); - if (leader != null) { - Set nodes = new HashSet<>(); - RaftClusterMetadata raftClusterMetadata = raftServer.getRaftStateMachine().getRaftLeaderMetadata(); - Node leaderNode = raftServer.getRaftStateMachine().getRaftLeaderMetadata().getLeader(); - leaderNode.setGroup(group); - nodes.add(leaderNode); - nodes.addAll(raftClusterMetadata.getLearner()); - nodes.addAll(raftClusterMetadata.getFollowers()); - metadataResponse.setTerm(raftClusterMetadata.getTerm()); - metadataResponse.setNodes(new ArrayList<>(nodes)); - } - } - catch (Exception e) { - LOGGER.error("there is an exception to getting the leader address: {}", e.getMessage(), e); - } - } - return metadataResponse; - } - - @PostMapping("/watch") - public void watch(HttpServletRequest request, @RequestParam Map groupTerms, - @RequestParam(defaultValue = "28000") int timeout) { - AsyncContext context = request.startAsync(); - context.setTimeout(0L); - groupTerms.forEach((group, term) -> { - Watcher watcher = new Watcher<>(group, context, timeout, - Long.parseLong(String.valueOf(term))); - clusterWatcherManager.registryWatcher(watcher); - }); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/controller/HealthController.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/controller/HealthController.java deleted file mode 100644 index eaf7a31b76..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/controller/HealthController.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.controller; - -import io.seata.server.ServerRunner; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -/** - * @author spilledyear@outlook.com - */ -@Controller -@RequestMapping -public class HealthController { - - private static final String OK = "ok"; - - private static final String NOT_OK = "not_ok"; - - @Autowired - private ServerRunner serverRunner; - - @RequestMapping("/health") - @ResponseBody - String healthCheck() { - return serverRunner.started() ? OK : NOT_OK; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/AbstractCore.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/AbstractCore.java deleted file mode 100644 index f2c41d52a5..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/AbstractCore.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.coordinator; - -import java.io.IOException; -import java.util.concurrent.TimeoutException; - -import io.seata.core.context.RootContext; -import io.seata.core.exception.BranchTransactionException; -import io.seata.core.exception.GlobalTransactionException; -import io.seata.core.exception.TransactionException; -import io.seata.core.exception.TransactionExceptionCode; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.BranchType; -import io.seata.core.model.GlobalStatus; -import io.seata.core.protocol.transaction.BranchCommitRequest; -import io.seata.core.protocol.transaction.BranchCommitResponse; -import io.seata.core.protocol.transaction.BranchRollbackRequest; -import io.seata.core.protocol.transaction.BranchRollbackResponse; -import io.seata.core.rpc.RemotingServer; -import io.seata.server.lock.LockManager; -import io.seata.server.lock.LockerManagerFactory; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHelper; -import io.seata.server.session.SessionHolder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -import static io.seata.core.exception.TransactionExceptionCode.BranchTransactionNotExist; -import static io.seata.core.exception.TransactionExceptionCode.FailedToAddBranch; -import static io.seata.core.exception.TransactionExceptionCode.GlobalTransactionNotActive; -import static io.seata.core.exception.TransactionExceptionCode.GlobalTransactionStatusInvalid; -import static io.seata.core.exception.TransactionExceptionCode.FailedToSendBranchCommitRequest; -import static io.seata.core.exception.TransactionExceptionCode.FailedToSendBranchRollbackRequest; - -/** - * The type abstract core. - * - * @author ph3636 - */ -public abstract class AbstractCore implements Core { - - protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractCore.class); - - protected LockManager lockManager = LockerManagerFactory.getLockManager(); - - protected RemotingServer remotingServer; - - protected AbstractCore(RemotingServer remotingServer) { - if (remotingServer == null) { - throw new IllegalArgumentException("remotingServer must be not null"); - } - this.remotingServer = remotingServer; - } - - public abstract BranchType getHandleBranchType(); - - @Override - public Long branchRegister(BranchType branchType, String resourceId, String clientId, String xid, - String applicationData, String lockKeys) throws TransactionException { - GlobalSession globalSession = assertGlobalSessionNotNull(xid, false); - return SessionHolder.lockAndExecute(globalSession, () -> { - globalSessionStatusCheck(globalSession); - BranchSession branchSession = SessionHelper.newBranchByGlobal(globalSession, branchType, resourceId, - applicationData, lockKeys, clientId); - MDC.put(RootContext.MDC_KEY_BRANCH_ID, String.valueOf(branchSession.getBranchId())); - branchSessionLock(globalSession, branchSession); - try { - globalSession.addBranch(branchSession); - } - catch (RuntimeException ex) { - branchSessionUnlock(branchSession); - throw new BranchTransactionException(FailedToAddBranch, - String.format("Failed to store branch xid = %s branchId = %s", globalSession.getXid(), - branchSession.getBranchId()), - ex); - } - if (LOGGER.isInfoEnabled()) { - LOGGER.info("Register branch successfully, xid = {}, branchId = {}, resourceId = {} ,lockKeys = {}", - globalSession.getXid(), branchSession.getBranchId(), resourceId, lockKeys); - } - return branchSession.getBranchId(); - }); - } - - protected void globalSessionStatusCheck(GlobalSession globalSession) throws GlobalTransactionException { - if (!globalSession.isActive()) { - throw new GlobalTransactionException(GlobalTransactionNotActive, String.format( - "Could not register branch into global session xid = %s status = %s, cause by globalSession not active", - globalSession.getXid(), globalSession.getStatus())); - } - if (globalSession.getStatus() != GlobalStatus.Begin) { - throw new GlobalTransactionException(GlobalTransactionStatusInvalid, - String.format( - "Could not register branch into global session xid = %s status = %s while expecting %s", - globalSession.getXid(), globalSession.getStatus(), GlobalStatus.Begin)); - } - } - - protected void branchSessionLock(GlobalSession globalSession, BranchSession branchSession) - throws TransactionException { - - } - - protected void branchSessionUnlock(BranchSession branchSession) throws TransactionException { - - } - - private GlobalSession assertGlobalSessionNotNull(String xid, boolean withBranchSessions) - throws TransactionException { - GlobalSession globalSession = SessionHolder.findGlobalSession(xid, withBranchSessions); - if (globalSession == null) { - throw new GlobalTransactionException(TransactionExceptionCode.GlobalTransactionNotExist, - String.format("Could not found global transaction xid = %s, may be has finished.", xid)); - } - return globalSession; - } - - @Override - public void branchReport(BranchType branchType, String xid, long branchId, BranchStatus status, - String applicationData) throws TransactionException { - GlobalSession globalSession = assertGlobalSessionNotNull(xid, true); - BranchSession branchSession = globalSession.getBranch(branchId); - if (branchSession == null) { - throw new BranchTransactionException(BranchTransactionNotExist, - String.format("Could not found branch session xid = %s branchId = %s", xid, branchId)); - } - branchSession.setApplicationData(applicationData); - globalSession.changeBranchStatus(branchSession, status); - - if (LOGGER.isInfoEnabled()) { - LOGGER.info("Report branch status successfully, xid = {}, branchId = {}", globalSession.getXid(), - branchSession.getBranchId()); - } - } - - @Override - public boolean lockQuery(BranchType branchType, String resourceId, String xid, String lockKeys) - throws TransactionException { - return true; - } - - @Override - public BranchStatus branchCommit(GlobalSession globalSession, BranchSession branchSession) - throws TransactionException { - try { - BranchCommitRequest request = new BranchCommitRequest(); - request.setXid(branchSession.getXid()); - request.setBranchId(branchSession.getBranchId()); - request.setResourceId(branchSession.getResourceId()); - request.setApplicationData(branchSession.getApplicationData()); - request.setBranchType(branchSession.getBranchType()); - return branchCommitSend(request, globalSession, branchSession); - } - catch (IOException | TimeoutException e) { - throw new BranchTransactionException(FailedToSendBranchCommitRequest, - String.format("Send branch commit failed, xid = %s branchId = %s", branchSession.getXid(), - branchSession.getBranchId()), - e); - } - } - - protected BranchStatus branchCommitSend(BranchCommitRequest request, GlobalSession globalSession, - BranchSession branchSession) throws IOException, TimeoutException { - - BranchCommitResponse response = (BranchCommitResponse) remotingServer - .sendSyncRequest(branchSession.getResourceId(), branchSession.getClientId(), request, branchSession.isAT()); - return response.getBranchStatus(); - } - - @Override - public BranchStatus branchRollback(GlobalSession globalSession, BranchSession branchSession) - throws TransactionException { - try { - BranchRollbackRequest request = new BranchRollbackRequest(); - request.setXid(branchSession.getXid()); - request.setBranchId(branchSession.getBranchId()); - request.setResourceId(branchSession.getResourceId()); - request.setApplicationData(branchSession.getApplicationData()); - request.setBranchType(branchSession.getBranchType()); - return branchRollbackSend(request, globalSession, branchSession); - } - catch (IOException | TimeoutException e) { - throw new BranchTransactionException(FailedToSendBranchRollbackRequest, - String.format("Send branch rollback failed, xid = %s branchId = %s", branchSession.getXid(), - branchSession.getBranchId()), - e); - } - } - - protected BranchStatus branchRollbackSend(BranchRollbackRequest request, GlobalSession globalSession, - BranchSession branchSession) throws IOException, TimeoutException { - - BranchRollbackResponse response = (BranchRollbackResponse) remotingServer - .sendSyncRequest(branchSession.getResourceId(), branchSession.getClientId(), request, branchSession.isAT()); - return response.getBranchStatus(); - } - - @Override - public String begin(String applicationId, String transactionServiceGroup, String name, int timeout) - throws TransactionException { - return null; - } - - @Override - public GlobalStatus commit(String xid) throws TransactionException { - return null; - } - - @Override - public boolean doGlobalCommit(GlobalSession globalSession, boolean retrying) throws TransactionException { - return true; - } - - @Override - public GlobalStatus globalReport(String xid, GlobalStatus globalStatus) throws TransactionException { - return null; - } - - @Override - public GlobalStatus rollback(String xid) throws TransactionException { - return null; - } - - @Override - public boolean doGlobalRollback(GlobalSession globalSession, boolean retrying) throws TransactionException { - return true; - } - - @Override - public GlobalStatus getStatus(String xid) throws TransactionException { - return null; - } - - @Override - public void doGlobalReport(GlobalSession globalSession, String xid, GlobalStatus globalStatus) - throws TransactionException { - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/Core.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/Core.java deleted file mode 100644 index 8def2e56f8..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/Core.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.coordinator; - -import io.seata.core.exception.TransactionException; -import io.seata.core.model.GlobalStatus; -import io.seata.server.session.GlobalSession; - -/** - * The interface Core. - * - * @author sharajava - */ -public interface Core extends TransactionCoordinatorInbound, TransactionCoordinatorOutbound { - - /** - * Do global commit. - * @param globalSession the global session - * @param retrying the retrying - * @return is global commit. - * @throws TransactionException the transaction exception - */ - boolean doGlobalCommit(GlobalSession globalSession, boolean retrying) throws TransactionException; - - /** - * Do global rollback. - * @param globalSession the global session - * @param retrying the retrying - * @return is global rollback. - * @throws TransactionException the transaction exception - */ - boolean doGlobalRollback(GlobalSession globalSession, boolean retrying) throws TransactionException; - - /** - * Do global report. - * @param globalSession the global session - * @param xid Transaction id. - * @param param the global status - * @throws TransactionException the transaction exception - */ - void doGlobalReport(GlobalSession globalSession, String xid, GlobalStatus param) throws TransactionException; - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/DefaultCoordinator.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/DefaultCoordinator.java deleted file mode 100644 index 4b40a7b57a..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/DefaultCoordinator.java +++ /dev/null @@ -1,629 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.coordinator; - -import io.netty.channel.Channel; -import io.seata.common.thread.NamedThreadFactory; -import io.seata.common.util.CollectionUtils; -import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; -import io.seata.core.context.RootContext; -import io.seata.core.exception.TransactionException; -import io.seata.core.model.GlobalStatus; -import io.seata.core.protocol.AbstractMessage; -import io.seata.core.protocol.AbstractResultMessage; -import io.seata.core.protocol.transaction.*; -import io.seata.core.rpc.Disposable; -import io.seata.core.rpc.RemotingServer; -import io.seata.core.rpc.RpcContext; -import io.seata.core.rpc.TransactionMessageHandler; -import io.seata.core.rpc.netty.ChannelManager; -import io.seata.core.rpc.netty.NettyRemotingServer; -import io.seata.server.AbstractTCInboundHandler; -import io.seata.server.metrics.MetricsPublisher; -import io.seata.server.session.*; -import io.seata.server.store.StoreConfig; -import org.apache.commons.lang.time.DateFormatUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -import java.util.Collection; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static io.seata.common.Constants.*; -import static io.seata.common.DefaultValues.*; - -/** - * The type Default coordinator. - */ -public class DefaultCoordinator extends AbstractTCInboundHandler implements TransactionMessageHandler, Disposable { - - protected static final Logger LOGGER = LoggerFactory.getLogger(DefaultCoordinator.class); - - private static final int TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS = 5000; - - private static final String TIME_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS"; - - /** - * The constant COMMITTING_RETRY_PERIOD. - */ - protected static final long COMMITTING_RETRY_PERIOD = CONFIG.getLong(ConfigurationKeys.COMMITING_RETRY_PERIOD, - DEFAULT_COMMITING_RETRY_PERIOD); - - /** - * The constant ASYNC_COMMITTING_RETRY_PERIOD. - */ - protected static final long ASYNC_COMMITTING_RETRY_PERIOD = CONFIG - .getLong(ConfigurationKeys.ASYNC_COMMITING_RETRY_PERIOD, DEFAULT_ASYNC_COMMITTING_RETRY_PERIOD); - - /** - * The constant ROLLBACKING_RETRY_PERIOD. - */ - protected static final long ROLLBACKING_RETRY_PERIOD = CONFIG.getLong(ConfigurationKeys.ROLLBACKING_RETRY_PERIOD, - DEFAULT_ROLLBACKING_RETRY_PERIOD); - - /** - * The constant TIMEOUT_RETRY_PERIOD. - */ - protected static final long TIMEOUT_RETRY_PERIOD = CONFIG.getLong(ConfigurationKeys.TIMEOUT_RETRY_PERIOD, - DEFAULT_TIMEOUT_RETRY_PERIOD); - - /** - * The Transaction undo log delete period. - */ - protected static final long UNDO_LOG_DELETE_PERIOD = CONFIG - .getLong(ConfigurationKeys.TRANSACTION_UNDO_LOG_DELETE_PERIOD, DEFAULT_UNDO_LOG_DELETE_PERIOD); - - /** - * The Transaction undo log delay delete period. - */ - protected static final long UNDO_LOG_DELAY_DELETE_PERIOD = 3 * 60 * 1000; - - private static final int ALWAYS_RETRY_BOUNDARY = 0; - - /** - * default branch async queue size. - */ - private static final int DEFAULT_BRANCH_ASYNC_QUEUE_SIZE = 5000; - - /** - * the pool size of branch asynchronous remove thread pool. - */ - private static final int BRANCH_ASYNC_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 2; - - private static final long MAX_COMMIT_RETRY_TIMEOUT = ConfigurationFactory.getInstance() - .getLong(ConfigurationKeys.MAX_COMMIT_RETRY_TIMEOUT, DEFAULT_MAX_COMMIT_RETRY_TIMEOUT); - - private static final long MAX_ROLLBACK_RETRY_TIMEOUT = ConfigurationFactory.getInstance() - .getLong(ConfigurationKeys.MAX_ROLLBACK_RETRY_TIMEOUT, DEFAULT_MAX_ROLLBACK_RETRY_TIMEOUT); - - private static final boolean ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE = ConfigurationFactory.getInstance() - .getBoolean(ConfigurationKeys.ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE, - DEFAULT_ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE); - - private final ScheduledThreadPoolExecutor retryRollbacking = new ScheduledThreadPoolExecutor(1, - new NamedThreadFactory(RETRY_ROLLBACKING, 1)); - - private final ScheduledThreadPoolExecutor retryCommitting = new ScheduledThreadPoolExecutor(1, - new NamedThreadFactory(RETRY_COMMITTING, 1)); - - private final ScheduledThreadPoolExecutor asyncCommitting = new ScheduledThreadPoolExecutor(1, - new NamedThreadFactory(ASYNC_COMMITTING, 1)); - - private final ScheduledThreadPoolExecutor timeoutCheck = new ScheduledThreadPoolExecutor(1, - new NamedThreadFactory(TX_TIMEOUT_CHECK, 1)); - - private final ScheduledThreadPoolExecutor undoLogDelete = new ScheduledThreadPoolExecutor(1, - new NamedThreadFactory(UNDOLOG_DELETE, 1)); - - private final GlobalStatus[] rollbackingStatuses = new GlobalStatus[] { GlobalStatus.TimeoutRollbacking, - GlobalStatus.TimeoutRollbackRetrying, GlobalStatus.RollbackRetrying, GlobalStatus.Rollbacking }; - - private final GlobalStatus[] retryCommittingStatuses = new GlobalStatus[] { GlobalStatus.Committing, - GlobalStatus.CommitRetrying, GlobalStatus.Committed }; - - private final ThreadPoolExecutor branchRemoveExecutor; - - private RemotingServer remotingServer; - - private final DefaultCore core; - - private static volatile DefaultCoordinator instance; - - /** - * Instantiates a new Default coordinator. - * @param remotingServer the remoting server - */ - protected DefaultCoordinator(RemotingServer remotingServer) { - if (remotingServer == null) { - throw new IllegalArgumentException("RemotingServer not allowed be null."); - } - this.remotingServer = remotingServer; - this.core = new DefaultCore(remotingServer); - boolean enableBranchAsyncRemove = CONFIG.getBoolean(ConfigurationKeys.ENABLE_BRANCH_ASYNC_REMOVE, - DEFAULT_ENABLE_BRANCH_ASYNC_REMOVE); - // create branchRemoveExecutor - if (enableBranchAsyncRemove && StoreConfig.getSessionMode() != StoreConfig.SessionMode.FILE) { - branchRemoveExecutor = new ThreadPoolExecutor(BRANCH_ASYNC_POOL_SIZE, BRANCH_ASYNC_POOL_SIZE, - Integer.MAX_VALUE, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(CONFIG.getInt(ConfigurationKeys.SESSION_BRANCH_ASYNC_QUEUE_SIZE, - DEFAULT_BRANCH_ASYNC_QUEUE_SIZE)), - new NamedThreadFactory("branchSessionRemove", BRANCH_ASYNC_POOL_SIZE), - new ThreadPoolExecutor.CallerRunsPolicy()); - } - else { - branchRemoveExecutor = null; - } - } - - public static DefaultCoordinator getInstance(RemotingServer remotingServer) { - if (null == instance) { - synchronized (DefaultCoordinator.class) { - if (null == instance) { - StoreConfig.SessionMode storeMode = StoreConfig.getSessionMode(); - instance = Objects.equals(StoreConfig.SessionMode.RAFT, storeMode) - ? new RaftCoordinator(remotingServer) : new DefaultCoordinator(remotingServer); - } - } - } - return instance; - } - - public static DefaultCoordinator getInstance() { - if (null == instance) { - throw new IllegalArgumentException("The instance has not been created."); - } - return instance; - } - - /** - * Asynchronous remove branch. - * @param globalSession the globalSession - * @param branchSession the branchSession - */ - public void doBranchRemoveAsync(GlobalSession globalSession, BranchSession branchSession) { - if (globalSession == null) { - return; - } - branchRemoveExecutor.execute(new BranchRemoveTask(globalSession, branchSession)); - } - - /** - * Asynchronous remove all branch. - * @param globalSession the globalSession - */ - public void doBranchRemoveAllAsync(GlobalSession globalSession) { - if (globalSession == null) { - return; - } - branchRemoveExecutor.execute(new BranchRemoveTask(globalSession)); - } - - @Override - protected void doGlobalBegin(GlobalBeginRequest request, GlobalBeginResponse response, RpcContext rpcContext) - throws TransactionException { - response.setXid(core.begin(rpcContext.getApplicationId(), rpcContext.getTransactionServiceGroup(), - request.getTransactionName(), request.getTimeout())); - if (LOGGER.isInfoEnabled()) { - LOGGER.info( - "Begin new global transaction applicationId: {},transactionServiceGroup: {}, transactionName: {},timeout:{},xid:{}", - rpcContext.getApplicationId(), rpcContext.getTransactionServiceGroup(), - request.getTransactionName(), request.getTimeout(), response.getXid()); - } - } - - @Override - protected void doGlobalCommit(GlobalCommitRequest request, GlobalCommitResponse response, RpcContext rpcContext) - throws TransactionException { - MDC.put(RootContext.MDC_KEY_XID, request.getXid()); - response.setGlobalStatus(core.commit(request.getXid())); - } - - @Override - protected void doGlobalRollback(GlobalRollbackRequest request, GlobalRollbackResponse response, - RpcContext rpcContext) throws TransactionException { - MDC.put(RootContext.MDC_KEY_XID, request.getXid()); - response.setGlobalStatus(core.rollback(request.getXid())); - } - - @Override - protected void doGlobalStatus(GlobalStatusRequest request, GlobalStatusResponse response, RpcContext rpcContext) - throws TransactionException { - MDC.put(RootContext.MDC_KEY_XID, request.getXid()); - response.setGlobalStatus(core.getStatus(request.getXid())); - } - - @Override - protected void doGlobalReport(GlobalReportRequest request, GlobalReportResponse response, RpcContext rpcContext) - throws TransactionException { - MDC.put(RootContext.MDC_KEY_XID, request.getXid()); - response.setGlobalStatus(core.globalReport(request.getXid(), request.getGlobalStatus())); - } - - @Override - protected void doBranchRegister(BranchRegisterRequest request, BranchRegisterResponse response, - RpcContext rpcContext) throws TransactionException { - MDC.put(RootContext.MDC_KEY_XID, request.getXid()); - response.setBranchId(core.branchRegister(request.getBranchType(), request.getResourceId(), - rpcContext.getClientId(), request.getXid(), request.getApplicationData(), request.getLockKey())); - } - - @Override - protected void doBranchReport(BranchReportRequest request, BranchReportResponse response, RpcContext rpcContext) - throws TransactionException { - MDC.put(RootContext.MDC_KEY_XID, request.getXid()); - MDC.put(RootContext.MDC_KEY_BRANCH_ID, String.valueOf(request.getBranchId())); - core.branchReport(request.getBranchType(), request.getXid(), request.getBranchId(), request.getStatus(), - request.getApplicationData()); - } - - @Override - protected void doLockCheck(GlobalLockQueryRequest request, GlobalLockQueryResponse response, RpcContext rpcContext) - throws TransactionException { - MDC.put(RootContext.MDC_KEY_XID, request.getXid()); - response.setLockable(core.lockQuery(request.getBranchType(), request.getResourceId(), request.getXid(), - request.getLockKey())); - } - - /** - * Timeout check. - */ - protected void timeoutCheck() { - SessionCondition sessionCondition = new SessionCondition(GlobalStatus.Begin); - sessionCondition.setLazyLoadBranch(true); - Collection beginGlobalsessions = SessionHolder.getRootSessionManager() - .findGlobalSessions(sessionCondition); - if (CollectionUtils.isEmpty(beginGlobalsessions)) { - return; - } - if (!beginGlobalsessions.isEmpty() && LOGGER.isDebugEnabled()) { - LOGGER.debug("Global transaction timeout check begin, size: {}", beginGlobalsessions.size()); - } - SessionHelper.forEach(beginGlobalsessions, globalSession -> { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug(globalSession.getXid() + " " + globalSession.getStatus() + " " - + globalSession.getBeginTime() + " " + globalSession.getTimeout()); - } - SessionHolder.lockAndExecute(globalSession, () -> { - if (globalSession.getStatus() != GlobalStatus.Begin || !globalSession.isTimeout()) { - return false; - } - - LOGGER.warn( - "Global transaction[{}] is timeout and will be rollback,transaction begin time:{} and now:{}", - globalSession.getXid(), - DateFormatUtils.format(globalSession.getBeginTime(), TIME_FORMAT_PATTERN), - DateFormatUtils.format(System.currentTimeMillis(), TIME_FORMAT_PATTERN)); - - globalSession.close(); - globalSession.changeGlobalStatus(GlobalStatus.TimeoutRollbacking); - - // transaction timeout and start rollbacking event - MetricsPublisher.postSessionDoingEvent(globalSession, GlobalStatus.TimeoutRollbacking.name(), false, - false); - - return true; - }); - }); - if (!beginGlobalsessions.isEmpty() && LOGGER.isDebugEnabled()) { - LOGGER.debug("Global transaction timeout check end. "); - } - - } - - /** - * Handle retry rollbacking. - */ - protected void handleRetryRollbacking() { - SessionCondition sessionCondition = new SessionCondition(rollbackingStatuses); - sessionCondition.setLazyLoadBranch(true); - Collection rollbackingSessions = SessionHolder.getRootSessionManager() - .findGlobalSessions(sessionCondition); - if (CollectionUtils.isEmpty(rollbackingSessions)) { - return; - } - long now = System.currentTimeMillis(); - SessionHelper.forEach(rollbackingSessions, rollbackingSession -> { - try { - // prevent repeated rollback - if (rollbackingSession.getStatus() == GlobalStatus.Rollbacking && !rollbackingSession.isDeadSession()) { - // The function of this 'return' is 'continue'. - return; - } - if (isRetryTimeout(now, MAX_ROLLBACK_RETRY_TIMEOUT, rollbackingSession.getBeginTime())) { - if (ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE) { - rollbackingSession.clean(); - } - - SessionHelper.endRollbackFailed(rollbackingSession, true, true); - - // The function of this 'return' is 'continue'. - return; - } - core.doGlobalRollback(rollbackingSession, true); - } - catch (TransactionException ex) { - LOGGER.error("Failed to retry rollbacking [{}] {} {}", rollbackingSession.getXid(), ex.getCode(), - ex.getMessage()); - } - }); - } - - /** - * Handle retry committing. - */ - protected void handleRetryCommitting() { - SessionCondition retryCommittingSessionCondition = new SessionCondition(retryCommittingStatuses); - retryCommittingSessionCondition.setLazyLoadBranch(true); - Collection committingSessions = SessionHolder.getRootSessionManager() - .findGlobalSessions(retryCommittingSessionCondition); - if (CollectionUtils.isEmpty(committingSessions)) { - return; - } - long now = System.currentTimeMillis(); - SessionHelper.forEach(committingSessions, committingSession -> { - try { - // prevent repeated commit - if ((GlobalStatus.Committing.equals(committingSession.getStatus()) - || GlobalStatus.Committed.equals(committingSession.getStatus())) - && !committingSession.isDeadSession()) { - // The function of this 'return' is 'continue'. - return; - } - if (isRetryTimeout(now, MAX_COMMIT_RETRY_TIMEOUT, committingSession.getBeginTime())) { - - // commit retry timeout event - SessionHelper.endCommitFailed(committingSession, true, true); - - // The function of this 'return' is 'continue'. - return; - } - if (GlobalStatus.Committed.equals(committingSession.getStatus()) - && committingSession.getBranchSessions().isEmpty()) { - SessionHelper.endCommitted(committingSession, true); - } - core.doGlobalCommit(committingSession, true); - } - catch (TransactionException ex) { - LOGGER.error("Failed to retry committing [{}] {} {}", committingSession.getXid(), ex.getCode(), - ex.getMessage()); - } - }); - } - - /** - * Handle async committing. - */ - protected void handleAsyncCommitting() { - SessionCondition sessionCondition = new SessionCondition(GlobalStatus.AsyncCommitting); - Collection asyncCommittingSessions = SessionHolder.getRootSessionManager() - .findGlobalSessions(sessionCondition); - if (CollectionUtils.isEmpty(asyncCommittingSessions)) { - return; - } - SessionHelper.forEach(asyncCommittingSessions, asyncCommittingSession -> { - try { - core.doGlobalCommit(asyncCommittingSession, true); - } - catch (TransactionException ex) { - LOGGER.error("Failed to async committing [{}] {} {}", asyncCommittingSession.getXid(), ex.getCode(), - ex.getMessage(), ex); - } - }); - } - - /** - * Undo log delete. - */ - protected void undoLogDelete() { - Map rmChannels = ChannelManager.getRmChannels(); - if (rmChannels == null || rmChannels.isEmpty()) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("no active rm channels to delete undo log"); - } - return; - } - short saveDays = CONFIG.getShort(ConfigurationKeys.TRANSACTION_UNDO_LOG_SAVE_DAYS, - UndoLogDeleteRequest.DEFAULT_SAVE_DAYS); - for (Map.Entry channelEntry : rmChannels.entrySet()) { - String resourceId = channelEntry.getKey(); - UndoLogDeleteRequest deleteRequest = new UndoLogDeleteRequest(); - deleteRequest.setResourceId(resourceId); - deleteRequest.setSaveDays(saveDays > 0 ? saveDays : UndoLogDeleteRequest.DEFAULT_SAVE_DAYS); - try { - remotingServer.sendAsyncRequest(channelEntry.getValue(), deleteRequest); - } - catch (Exception e) { - LOGGER.error("Failed to async delete undo log resourceId = {}, exception: {}", resourceId, - e.getMessage()); - } - } - } - - private boolean isRetryTimeout(long now, long timeout, long beginTime) { - return timeout >= ALWAYS_RETRY_BOUNDARY && now - beginTime > timeout; - } - - /** - * Init. - */ - public void init() { - retryRollbacking.scheduleAtFixedRate( - () -> SessionHolder.distributedLockAndExecute(RETRY_ROLLBACKING, this::handleRetryRollbacking), 0, - ROLLBACKING_RETRY_PERIOD, TimeUnit.MILLISECONDS); - - retryCommitting.scheduleAtFixedRate( - () -> SessionHolder.distributedLockAndExecute(RETRY_COMMITTING, this::handleRetryCommitting), 0, - COMMITTING_RETRY_PERIOD, TimeUnit.MILLISECONDS); - - asyncCommitting.scheduleAtFixedRate( - () -> SessionHolder.distributedLockAndExecute(ASYNC_COMMITTING, this::handleAsyncCommitting), 0, - ASYNC_COMMITTING_RETRY_PERIOD, TimeUnit.MILLISECONDS); - - timeoutCheck.scheduleAtFixedRate( - () -> SessionHolder.distributedLockAndExecute(TX_TIMEOUT_CHECK, this::timeoutCheck), 0, - TIMEOUT_RETRY_PERIOD, TimeUnit.MILLISECONDS); - - undoLogDelete.scheduleAtFixedRate( - () -> SessionHolder.distributedLockAndExecute(UNDOLOG_DELETE, this::undoLogDelete), - UNDO_LOG_DELAY_DELETE_PERIOD, UNDO_LOG_DELETE_PERIOD, TimeUnit.MILLISECONDS); - } - - @Override - public AbstractResultMessage onRequest(AbstractMessage request, RpcContext context) { - if (!(request instanceof AbstractTransactionRequestToTC)) { - throw new IllegalArgumentException(); - } - AbstractTransactionRequestToTC transactionRequest = (AbstractTransactionRequestToTC) request; - transactionRequest.setTCInboundHandler(this); - - return transactionRequest.handle(context); - } - - @Override - public void onResponse(AbstractResultMessage response, RpcContext context) { - if (!(response instanceof AbstractTransactionResponse)) { - throw new IllegalArgumentException(); - } - - } - - @Override - public void destroy() { - // 1. first shutdown timed task - retryRollbacking.shutdown(); - retryCommitting.shutdown(); - asyncCommitting.shutdown(); - timeoutCheck.shutdown(); - undoLogDelete.shutdown(); - if (branchRemoveExecutor != null) { - branchRemoveExecutor.shutdown(); - } - try { - retryRollbacking.awaitTermination(TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS, TimeUnit.MILLISECONDS); - retryCommitting.awaitTermination(TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS, TimeUnit.MILLISECONDS); - asyncCommitting.awaitTermination(TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS, TimeUnit.MILLISECONDS); - timeoutCheck.awaitTermination(TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS, TimeUnit.MILLISECONDS); - undoLogDelete.awaitTermination(TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS, TimeUnit.MILLISECONDS); - if (branchRemoveExecutor != null) { - branchRemoveExecutor.awaitTermination(TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS, TimeUnit.MILLISECONDS); - } - } - catch (InterruptedException ignore) { - - } - // 2. second close netty flow - if (remotingServer instanceof NettyRemotingServer) { - ((NettyRemotingServer) remotingServer).destroy(); - } - // 3. third destroy SessionHolder - SessionHolder.destroy(); - instance = null; - } - - /** - * only used for mock test. - * @param remotingServer 远程服务 - */ - public void setRemotingServer(RemotingServer remotingServer) { - this.remotingServer = remotingServer; - } - - /** - * the task to remove branchSession. - */ - static class BranchRemoveTask implements Runnable { - - /** - * the globalSession. - */ - private final GlobalSession globalSession; - - /** - * the branchSession. - */ - private final BranchSession branchSession; - - /** - * If you use this construct, the task will remove the branchSession provided by - * the parameter. - * @param globalSession the globalSession - */ - BranchRemoveTask(GlobalSession globalSession, BranchSession branchSession) { - this.globalSession = globalSession; - if (branchSession == null) { - throw new IllegalArgumentException("BranchSession can`t be null!"); - } - this.branchSession = branchSession; - } - - /** - * If you use this construct, the task will remove all branchSession. - * @param globalSession the globalSession - */ - BranchRemoveTask(GlobalSession globalSession) { - this.globalSession = globalSession; - this.branchSession = null; - } - - @Override - public void run() { - if (globalSession == null) { - return; - } - try { - MDC.put(RootContext.MDC_KEY_XID, globalSession.getXid()); - if (branchSession != null) { - doRemove(branchSession); - } - else { - globalSession.getSortedBranches().parallelStream().forEach(this::doRemove); - } - } - catch (Exception unKnowException) { - LOGGER.error("Asynchronous delete branchSession error, xid = {}", globalSession.getXid(), - unKnowException); - } - finally { - MDC.remove(RootContext.MDC_KEY_XID); - } - } - - private void doRemove(BranchSession bt) { - try { - MDC.put(RootContext.MDC_KEY_BRANCH_ID, String.valueOf(bt.getBranchId())); - globalSession.removeBranch(bt); - LOGGER.info("Asynchronous delete branchSession successfully, xid = {}, branchId = {}", - globalSession.getXid(), bt.getBranchId()); - } - catch (TransactionException transactionException) { - LOGGER.error("Asynchronous delete branchSession error, xid = {}, branchId = {}", globalSession.getXid(), - bt.getBranchId(), transactionException); - } - finally { - MDC.remove(RootContext.MDC_KEY_BRANCH_ID); - } - } - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/DefaultCore.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/DefaultCore.java deleted file mode 100644 index 1d577d42c8..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/DefaultCore.java +++ /dev/null @@ -1,426 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.coordinator; - -import io.seata.common.DefaultValues; -import io.seata.common.exception.NotSupportYetException; -import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.common.util.CollectionUtils; -import io.seata.config.ConfigurationFactory; -import io.seata.core.context.RootContext; -import io.seata.core.exception.TransactionException; -import io.seata.core.logger.StackTraceLogger; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.BranchType; -import io.seata.core.model.GlobalStatus; -import io.seata.core.rpc.RemotingServer; -import io.seata.server.metrics.MetricsPublisher; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHelper; -import io.seata.server.session.SessionHolder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import static io.seata.common.ConfigurationKeys.ENABLE_PARALLEL_HANDLE_BRANCH_KEY; -import static io.seata.common.ConfigurationKeys.XAER_NOTA_RETRY_TIMEOUT; -import static io.seata.server.session.BranchSessionHandler.CONTINUE; - -/** - * The type Default core. - * - * @author sharajava - */ -public class DefaultCore implements Core { - - private static final Logger LOGGER = LoggerFactory.getLogger(DefaultCore.class); - - private static final int RETRY_XAER_NOTA_TIMEOUT = ConfigurationFactory.getInstance() - .getInt(XAER_NOTA_RETRY_TIMEOUT, DefaultValues.DEFAULT_XAER_NOTA_RETRY_TIMEOUT); - - private static Map coreMap = new ConcurrentHashMap<>(); - - private static final boolean PARALLEL_HANDLE_BRANCH = ConfigurationFactory.getInstance() - .getBoolean(ENABLE_PARALLEL_HANDLE_BRANCH_KEY, false); - - /** - * get the Default core. - * @param remotingServer the remoting server - */ - public DefaultCore(RemotingServer remotingServer) { - List allCore = EnhancedServiceLoader.loadAll(AbstractCore.class, - new Class[] { RemotingServer.class }, new Object[] { remotingServer }); - if (CollectionUtils.isNotEmpty(allCore)) { - for (AbstractCore core : allCore) { - coreMap.put(core.getHandleBranchType(), core); - } - } - } - - /** - * get core. - * @param branchType the branchType - * @return the core - */ - public AbstractCore getCore(BranchType branchType) { - AbstractCore core = coreMap.get(branchType); - if (core == null) { - throw new NotSupportYetException("unsupported type:" + branchType.name()); - } - return core; - } - - /** - * only for mock. - * @param branchType the branchType - * @param core the core - */ - public void mockCore(BranchType branchType, AbstractCore core) { - coreMap.put(branchType, core); - } - - @Override - public Long branchRegister(BranchType branchType, String resourceId, String clientId, String xid, - String applicationData, String lockKeys) throws TransactionException { - return getCore(branchType).branchRegister(branchType, resourceId, clientId, xid, applicationData, lockKeys); - } - - @Override - public void branchReport(BranchType branchType, String xid, long branchId, BranchStatus status, - String applicationData) throws TransactionException { - getCore(branchType).branchReport(branchType, xid, branchId, status, applicationData); - } - - @Override - public boolean lockQuery(BranchType branchType, String resourceId, String xid, String lockKeys) - throws TransactionException { - return getCore(branchType).lockQuery(branchType, resourceId, xid, lockKeys); - } - - @Override - public BranchStatus branchCommit(GlobalSession globalSession, BranchSession branchSession) - throws TransactionException { - return getCore(branchSession.getBranchType()).branchCommit(globalSession, branchSession); - } - - @Override - public BranchStatus branchRollback(GlobalSession globalSession, BranchSession branchSession) - throws TransactionException { - return getCore(branchSession.getBranchType()).branchRollback(globalSession, branchSession); - } - - @Override - public String begin(String applicationId, String transactionServiceGroup, String name, int timeout) - throws TransactionException { - GlobalSession session = GlobalSession.createGlobalSession(applicationId, transactionServiceGroup, name, - timeout); - MDC.put(RootContext.MDC_KEY_XID, session.getXid()); - - session.begin(); - - // transaction start event - MetricsPublisher.postSessionDoingEvent(session, false); - - return session.getXid(); - } - - @Override - public GlobalStatus commit(String xid) throws TransactionException { - GlobalSession globalSession = SessionHolder.findGlobalSession(xid); - if (globalSession == null) { - return GlobalStatus.Finished; - } - - if (globalSession.isTimeout()) { - LOGGER.info("TC detected timeout, xid = {}", globalSession.getXid()); - return GlobalStatus.TimeoutRollbacking; - } - - // just lock changeStatus - boolean shouldCommit = SessionHolder.lockAndExecute(globalSession, () -> { - boolean shouldCommitNow = false; - if (globalSession.getStatus() == GlobalStatus.Begin) { - // Highlight: Firstly, close the session, then no more branch can be - // registered. - globalSession.close(); - if (globalSession.canBeCommittedAsync()) { - globalSession.asyncCommit(); - MetricsPublisher.postSessionDoneEvent(globalSession, GlobalStatus.Committed, false, false); - } - else { - globalSession.changeGlobalStatus(GlobalStatus.Committing); - shouldCommitNow = true; - } - // clean session after changing status successfully. - globalSession.clean(); - } - return shouldCommitNow; - }); - - if (shouldCommit) { - boolean success = doGlobalCommit(globalSession, false); - // If successful and all remaining branches can be committed asynchronously, - // do async commit. - if (success && globalSession.hasBranch() && globalSession.canBeCommittedAsync()) { - globalSession.asyncCommit(); - return GlobalStatus.Committed; - } - else { - return globalSession.getStatus(); - } - } - else { - return globalSession.getStatus() == GlobalStatus.AsyncCommitting ? GlobalStatus.Committed - : globalSession.getStatus(); - } - } - - @Override - public boolean doGlobalCommit(GlobalSession globalSession, boolean retrying) throws TransactionException { - boolean success = true; - // start committing event - MetricsPublisher.postSessionDoingEvent(globalSession, retrying); - - if (globalSession.isSaga()) { - success = getCore(BranchType.SAGA).doGlobalCommit(globalSession, retrying); - } - else { - List branchSessions = globalSession.getSortedBranches(); - Boolean result = SessionHelper.forEach(branchSessions, branchSession -> { - // if not retrying, skip the canBeCommittedAsync branches - if (!retrying && branchSession.canBeCommittedAsync()) { - return CONTINUE; - } - - BranchStatus currentStatus = branchSession.getStatus(); - if (currentStatus == BranchStatus.PhaseOne_Failed) { - SessionHelper.removeBranch(globalSession, branchSession, !retrying); - return CONTINUE; - } - try { - BranchStatus branchStatus = getCore(branchSession.getBranchType()).branchCommit(globalSession, - branchSession); - if (isXaerNotaTimeout(globalSession, branchStatus)) { - LOGGER.info("Commit branch XAER_NOTA retry timeout, xid = {} branchId = {}", - globalSession.getXid(), branchSession.getBranchId()); - branchStatus = BranchStatus.PhaseTwo_Committed; - } - switch (branchStatus) { - case PhaseTwo_Committed: - SessionHelper.removeBranch(globalSession, branchSession, !retrying); - LOGGER.info("Commit branch transaction successfully, xid = {} branchId = {}", - globalSession.getXid(), branchSession.getBranchId()); - return CONTINUE; - case PhaseTwo_CommitFailed_Unretryable: - // not at branch - SessionHelper.endCommitFailed(globalSession, retrying); - LOGGER.error( - "Committing global transaction[{}] finally failed, caused by branch transaction[{}] commit failed.", - globalSession.getXid(), branchSession.getBranchId()); - return false; - - default: - if (!retrying) { - globalSession.queueToRetryCommit(); - return false; - } - if (globalSession.canBeCommittedAsync()) { - LOGGER.error("Committing branch transaction[{}], status:{} and will retry later", - branchSession.getBranchId(), branchStatus); - return CONTINUE; - } - else { - LOGGER.error( - "Committing global transaction[{}] failed, caused by branch transaction[{}] commit failed, will retry later.", - globalSession.getXid(), branchSession.getBranchId()); - return false; - } - } - } - catch (Exception ex) { - String commitInfo = retrying ? "Global commit continue" : "Global commit failed"; - StackTraceLogger.error(LOGGER, ex, "Committing branch transaction exception:retrying={}, {}, {}", - new String[] { String.valueOf(retrying), branchSession.toString(), commitInfo }); - if (!retrying) { - globalSession.queueToRetryCommit(); - throw new TransactionException(ex); - } - } - return CONTINUE; - }, PARALLEL_HANDLE_BRANCH && branchSessions.size() >= 2); - // Return if the result is not null - if (result != null) { - return result; - } - // If has branch and not all remaining branches can be committed - // asynchronously, - // do print log and return false - if (globalSession.hasBranch() && !globalSession.canBeCommittedAsync()) { - LOGGER.info("Committing global transaction is NOT done, xid = {}.", globalSession.getXid()); - return false; - } - } - // if it succeeds and there is no branch, retrying=true is the asynchronous state - // when retrying. EndCommitted is - // executed to improve concurrency performance, and the global transaction ends.. - if (success && globalSession.getBranchSessions().isEmpty()) { - SessionHelper.endCommitted(globalSession, retrying); - LOGGER.info("Committing global transaction is successfully done, xid = {}.", globalSession.getXid()); - } - return success; - } - - @Override - public GlobalStatus rollback(String xid) throws TransactionException { - GlobalSession globalSession = SessionHolder.findGlobalSession(xid); - if (globalSession == null) { - return GlobalStatus.Finished; - } - // just lock changeStatus - boolean shouldRollBack = SessionHolder.lockAndExecute(globalSession, () -> { - globalSession.close(); // Highlight: Firstly, close the session, then no more - // branch can be registered. - if (globalSession.getStatus() == GlobalStatus.Begin) { - globalSession.changeGlobalStatus(GlobalStatus.Rollbacking); - return true; - } - return false; - }); - if (!shouldRollBack) { - return globalSession.getStatus(); - } - - boolean rollbackSuccess = doGlobalRollback(globalSession, false); - return rollbackSuccess ? GlobalStatus.Rollbacked : globalSession.getStatus(); - } - - @Override - public boolean doGlobalRollback(GlobalSession globalSession, boolean retrying) throws TransactionException { - boolean success = true; - // start rollback event - MetricsPublisher.postSessionDoingEvent(globalSession, retrying); - - if (globalSession.isSaga()) { - success = getCore(BranchType.SAGA).doGlobalRollback(globalSession, retrying); - } - else { - List branchSessions = globalSession.getSortedBranches(); - Boolean result = SessionHelper.forEach(branchSessions, branchSession -> { - BranchStatus currentBranchStatus = branchSession.getStatus(); - if (currentBranchStatus == BranchStatus.PhaseOne_Failed) { - SessionHelper.removeBranch(globalSession, branchSession, !retrying); - return CONTINUE; - } - try { - BranchStatus branchStatus = branchRollback(globalSession, branchSession); - if (isXaerNotaTimeout(globalSession, branchStatus)) { - LOGGER.info("Rollback branch XAER_NOTA retry timeout, xid = {} branchId = {}", - globalSession.getXid(), branchSession.getBranchId()); - branchStatus = BranchStatus.PhaseTwo_Rollbacked; - } - switch (branchStatus) { - case PhaseTwo_Rollbacked: - SessionHelper.removeBranch(globalSession, branchSession, !retrying); - LOGGER.info("Rollback branch transaction successfully, xid = {} branchId = {}", - globalSession.getXid(), branchSession.getBranchId()); - return CONTINUE; - case PhaseTwo_RollbackFailed_Unretryable: - SessionHelper.endRollbackFailed(globalSession, retrying); - LOGGER.error("Rollback branch transaction fail and stop retry, xid = {} branchId = {}", - globalSession.getXid(), branchSession.getBranchId()); - return false; - default: - LOGGER.error("Rollback branch transaction fail and will retry, xid = {} branchId = {}", - globalSession.getXid(), branchSession.getBranchId()); - if (!retrying) { - globalSession.queueToRetryRollback(); - } - return false; - } - } - catch (Exception ex) { - StackTraceLogger.error(LOGGER, ex, - "Rollback branch transaction exception, xid = {} ,branchId = {} ,retrying={} ,exception = {}, global rollback failed", - new String[] { globalSession.getXid(), String.valueOf(branchSession.getBranchId()), - String.valueOf(retrying), ex.getMessage() }); - if (!retrying) { - globalSession.queueToRetryRollback(); - } - throw new TransactionException(ex); - } - }, PARALLEL_HANDLE_BRANCH && branchSessions.size() >= 2); - // Return if the result is not null - if (result != null) { - return result; - } - } - - // In db mode, lock and branch data residual problems may occur. - // Therefore, execution needs to be delayed here and cannot be executed - // synchronously. - if (success) { - SessionHelper.endRollbacked(globalSession, retrying); - LOGGER.info("Rollback global transaction successfully, xid = {}.", globalSession.getXid()); - } - return success; - } - - @Override - public GlobalStatus getStatus(String xid) throws TransactionException { - GlobalSession globalSession = SessionHolder.findGlobalSession(xid, false); - if (globalSession == null) { - return GlobalStatus.Finished; - } - else { - return globalSession.getStatus(); - } - } - - @Override - public GlobalStatus globalReport(String xid, GlobalStatus globalStatus) throws TransactionException { - GlobalSession globalSession = SessionHolder.findGlobalSession(xid); - if (globalSession == null) { - return globalStatus; - } - doGlobalReport(globalSession, xid, globalStatus); - return globalSession.getStatus(); - } - - @Override - public void doGlobalReport(GlobalSession globalSession, String xid, GlobalStatus globalStatus) - throws TransactionException { - if (globalSession.isSaga()) { - getCore(BranchType.SAGA).doGlobalReport(globalSession, xid, globalStatus); - } - } - - private boolean isXaerNotaTimeout(GlobalSession globalSession, BranchStatus branchStatus) { - if (BranchStatus.PhaseTwo_CommitFailed_XAER_NOTA_Retryable.equals(branchStatus) - || BranchStatus.PhaseTwo_RollbackFailed_XAER_NOTA_Retryable.equals(branchStatus)) { - return System.currentTimeMillis() > globalSession.getBeginTime() + globalSession.getTimeout() - + Math.max(RETRY_XAER_NOTA_TIMEOUT, globalSession.getTimeout()); - } - else { - return false; - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/RaftCoordinator.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/RaftCoordinator.java deleted file mode 100644 index 7205c037cc..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/RaftCoordinator.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.coordinator; - -import io.seata.core.exception.TransactionException; -import io.seata.core.exception.TransactionExceptionCode; -import io.seata.core.protocol.transaction.AbstractTransactionRequest; -import io.seata.core.protocol.transaction.AbstractTransactionResponse; -import io.seata.core.rpc.RemotingServer; -import io.seata.server.cluster.listener.ClusterChangeEvent; -import io.seata.server.cluster.raft.context.SeataClusterContext; -import io.seata.server.store.StoreConfig; -import org.springframework.context.ApplicationListener; - -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; - -/** - * The type raft tx coordinator. - * - * @author funkye - */ -public class RaftCoordinator extends DefaultCoordinator implements ApplicationListener { - - protected static final Map GROUP_PREVENT = new ConcurrentHashMap<>(); - - public RaftCoordinator(RemotingServer remotingServer) { - super(remotingServer); - } - - @Override - public void exceptionHandleTemplate( - Callback callback, T request, S response) { - String group = SeataClusterContext.bindGroup(); - try { - if (!isPass(group)) { - throw new TransactionException(TransactionExceptionCode.NotRaftLeader, - " The current TC is not a leader node, interrupt processing !"); - } - super.exceptionHandleTemplate(callback, request, response); - } - catch (TransactionException tex) { - LOGGER.error("Catch TransactionException while do RPC, request: {}", request, tex); - callback.onTransactionException(request, response, tex); - } - finally { - SeataClusterContext.unbindGroup(); - } - } - - private boolean isPass(String group) { - // Non-raft mode always allows requests - return Optional.ofNullable(GROUP_PREVENT.get(group)).orElse(false); - } - - public static void setPrevent(String group, boolean prevent) { - if (StoreConfig.getSessionMode() == StoreConfig.SessionMode.RAFT) { - GROUP_PREVENT.put(group, prevent); - } - } - - @Override - public void onApplicationEvent(ClusterChangeEvent event) { - setPrevent(event.getGroup(), event.isLeader()); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/TransactionCoordinatorInbound.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/TransactionCoordinatorInbound.java deleted file mode 100644 index d8c9932b10..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/TransactionCoordinatorInbound.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.coordinator; - -import io.seata.core.model.ResourceManagerOutbound; -import io.seata.core.model.TransactionManager; - -/** - * receive inbound request from RM or TM. - * - * @author zhangchenghui.dev@gmail.com - * @since 1.1.0 - */ -public interface TransactionCoordinatorInbound extends ResourceManagerOutbound, TransactionManager { - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/TransactionCoordinatorOutbound.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/TransactionCoordinatorOutbound.java deleted file mode 100644 index 042e0d955e..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/coordinator/TransactionCoordinatorOutbound.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.coordinator; - -import io.seata.core.exception.TransactionException; -import io.seata.core.model.BranchStatus; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; - -/** - * send outbound request to RM. - * - * @author zhangchenghui.dev@gmail.com - * @since 1.1.0 - */ -public interface TransactionCoordinatorOutbound { - - /** - * Commit a branch transaction. - * @param globalSession the global session - * @param branchSession the branch session - * @return Status of the branch after committing. - * @throws TransactionException Any exception that fails this will be wrapped with - * TransactionException and thrown out. - */ - BranchStatus branchCommit(GlobalSession globalSession, BranchSession branchSession) throws TransactionException; - - /** - * Rollback a branch transaction. - * @param globalSession the global session - * @param branchSession the branch session - * @return Status of the branch after rollbacking. - * @throws TransactionException Any exception that fails this will be wrapped with - * TransactionException and thrown out. - */ - BranchStatus branchRollback(GlobalSession globalSession, BranchSession branchSession) throws TransactionException; - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/env/ContainerHelper.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/env/ContainerHelper.java deleted file mode 100644 index 457d88e8f8..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/env/ContainerHelper.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.env; - -import io.seata.common.util.NumberUtils; -import io.seata.common.util.StringUtils; - -import static io.seata.core.constants.ConfigurationKeys.ENV_SEATA_PORT_KEY; - -/** - * @author xingfudeshi@gmail.com - * @author wang.liang - */ -public class ContainerHelper { - - private static final String C_GROUP_PATH = "/proc/1/cgroup"; - - private static final String DOCKER_PATH = "/docker"; - - private static final String KUBEPODS_PATH = "/kubepods"; - - private static final String ENV_SYSTEM_KEY = "SEATA_ENV"; - - private static final String ENV_SEATA_IP_KEY = "SEATA_IP"; - - private static final String ENV_SERVER_NODE_KEY = "SERVER_NODE"; - - private static final String ENV_STORE_MODE_KEY = "STORE_MODE"; - - private static final String ENV_LOCK_STORE_MODE_KEY = "LOCK_STORE_MODE"; - - private static final String ENV_SESSION_STORE_MODE_KEY = "SESSION_STORE_MODE"; - - /** - * Gets env from container. - * @return the env - */ - public static String getEnv() { - return StringUtils.trimToNull(System.getenv(ENV_SYSTEM_KEY)); - } - - /** - * Gets host from container. - * @return the env - */ - public static String getHost() { - return StringUtils.trimToNull(System.getenv(ENV_SEATA_IP_KEY)); - } - - /** - * Gets port from container. - * @return the env - */ - public static int getPort() { - return NumberUtils.toInt(System.getenv(ENV_SEATA_PORT_KEY), 0); - } - - /** - * Gets server node from container. - * @return the env - */ - public static Long getServerNode() { - return NumberUtils.toLong(System.getenv(ENV_SERVER_NODE_KEY)); - } - - /** - * Gets store mode from container. - * @return the env - */ - public static String getStoreMode() { - return StringUtils.trimToNull(System.getenv(ENV_STORE_MODE_KEY)); - } - - /** - * Gets session store mode from container. - * @return the env - */ - public static String getSessionStoreMode() { - return StringUtils.trimToNull(System.getenv(ENV_SESSION_STORE_MODE_KEY)); - } - - /** - * Gets lock store mode from container. - * @return the env - */ - public static String getLockStoreMode() { - return StringUtils.trimToNull(System.getenv(ENV_LOCK_STORE_MODE_KEY)); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/env/PortHelper.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/env/PortHelper.java deleted file mode 100644 index fb774fb5de..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/env/PortHelper.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.env; - -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.MapUtil; -import io.seata.common.util.NumberUtils; -import io.seata.common.util.StringUtils; -import org.springframework.util.ResourceUtils; -import org.yaml.snakeyaml.Yaml; - -import java.io.*; -import java.util.Map; -import java.util.Properties; - -/** - * @author wang.liang - */ -public class PortHelper { - - public static int getPortFromEnvOrStartup(String[] args) { - int port = 0; - if (args != null && args.length >= 2) { - for (int i = 0; i < args.length; ++i) { - if ("-p".equalsIgnoreCase(args[i]) && i < args.length - 1) { - port = NumberUtils.toInt(args[i + 1], 0); - } - } - } - if (port == 0) { - port = ContainerHelper.getPort(); - } - return port; - } - - /** - * get config from configFile -Dspring.config.location > - * classpath:application.properties > classpath:application.yml. - * @return the port - * @throws IOException the io exception - */ - public static int getPortFromConfigFile() throws IOException { - - int port = 8080; - File configFile = null; - File startupConfigFile = getConfigFromStartup(); - if (null != startupConfigFile) { - configFile = startupConfigFile; - } - else { - try { - File propertiesFile = ResourceUtils.getFile("classpath:application.properties"); - configFile = propertiesFile; - } - catch (FileNotFoundException exx) { - File ymlFile = ResourceUtils.getFile("classpath:application.yml"); - configFile = ymlFile; - } - } - InputStream inputStream = null; - try { - inputStream = new FileInputStream(configFile); - String fileName = configFile.getName(); - String portNum = null; - if (fileName.endsWith("yml")) { - Map yamlMap = new Yaml().load(inputStream); - Map configMap = MapUtil.getFlattenedMap(yamlMap); - if (CollectionUtils.isNotEmpty(configMap)) { - Object serverPort = configMap.get("server.port"); - if (null != serverPort) { - portNum = serverPort.toString(); - } - } - } - else { - Properties properties = new Properties(); - properties.load(inputStream); - portNum = properties.getProperty("server.port"); - } - if (null != portNum) { - try { - port = Integer.parseInt(portNum); - } - catch (NumberFormatException exx) { - // ignore - } - } - } - finally { - if (null != inputStream) { - inputStream.close(); - } - } - return port; - - } - - private static File getConfigFromStartup() { - - String configLocation = System.getProperty("spring.config.location"); - if (StringUtils.isNotBlank(configLocation)) { - try { - File configFile = ResourceUtils.getFile(configLocation); - if (!configFile.isFile()) { - return null; - } - String fileName = configFile.getName(); - if (!(fileName.endsWith("yml") || fileName.endsWith("properties"))) { - return null; - } - return configFile; - } - catch (FileNotFoundException e) { - return null; - } - } - return null; - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/event/EventBusManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/event/EventBusManager.java deleted file mode 100644 index 2d1fb627b8..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/event/EventBusManager.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.event; - -import io.seata.core.event.EventBus; -import io.seata.core.event.GuavaEventBus; - -/** - * Manager hold the singleton event bus instance. - * - * @author zhengyangyong - */ -public class EventBusManager { - - public static EventBus get() { - return SingletonHolder.INSTANCE; - } - - private static class SingletonHolder { - - private static final EventBus INSTANCE = new GuavaEventBus("tc", true); - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/lock/AbstractLockManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/lock/AbstractLockManager.java deleted file mode 100644 index 7bfaafd2ad..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/lock/AbstractLockManager.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.lock; - -import io.seata.common.XID; -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.StringUtils; -import io.seata.core.exception.TransactionException; -import io.seata.core.lock.Locker; -import io.seata.core.lock.RowLock; -import io.seata.core.model.LockStatus; -import io.seata.server.session.BranchSession; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * The type Abstract lock manager. - * - * @author zhangsen - */ -public abstract class AbstractLockManager implements LockManager { - - /** - * The constant LOGGER. - */ - protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractLockManager.class); - - @Override - public boolean acquireLock(BranchSession branchSession) throws TransactionException { - return acquireLock(branchSession, true, false); - } - - @Override - public boolean acquireLock(BranchSession branchSession, boolean autoCommit, boolean skipCheckLock) - throws TransactionException { - if (branchSession == null) { - throw new IllegalArgumentException("branchSession can't be null for memory/file locker."); - } - String lockKey = branchSession.getLockKey(); - if (StringUtils.isNullOrEmpty(lockKey)) { - // no lock - return true; - } - // get locks of branch - List locks = collectRowLocks(branchSession); - if (CollectionUtils.isEmpty(locks)) { - // no lock - return true; - } - return getLocker(branchSession).acquireLock(locks, autoCommit, skipCheckLock); - } - - @Override - public boolean releaseLock(BranchSession branchSession) throws TransactionException { - if (branchSession == null) { - throw new IllegalArgumentException("branchSession can't be null for memory/file locker."); - } - List locks = collectRowLocks(branchSession); - try { - return getLocker(branchSession).releaseLock(locks); - } - catch (Exception t) { - LOGGER.error("unLock error, branchSession:{}", branchSession, t); - return false; - } - } - - @Override - public boolean isLockable(String xid, String resourceId, String lockKey) throws TransactionException { - if (StringUtils.isBlank(lockKey)) { - // no lock - return true; - } - List locks = collectRowLocks(lockKey, resourceId, xid); - try { - return getLocker().isLockable(locks); - } - catch (Exception t) { - LOGGER.error("isLockable error, xid:{} resourceId:{}, lockKey:{}", xid, resourceId, lockKey, t); - return false; - } - } - - @Override - public void cleanAllLocks() throws TransactionException { - getLocker().cleanAllLocks(); - } - - /** - * Gets locker. - * @return the locker - */ - protected Locker getLocker() { - return getLocker(null); - } - - /** - * Gets locker. - * @param branchSession the branch session - * @return the locker - */ - protected abstract Locker getLocker(BranchSession branchSession); - - @Override - public List collectRowLocks(BranchSession branchSession) { - if (branchSession == null || StringUtils.isBlank(branchSession.getLockKey())) { - return Collections.emptyList(); - } - - String lockKey = branchSession.getLockKey(); - String resourceId = branchSession.getResourceId(); - String xid = branchSession.getXid(); - long transactionId = branchSession.getTransactionId(); - long branchId = branchSession.getBranchId(); - - return collectRowLocks(lockKey, resourceId, xid, transactionId, branchId); - } - - /** - * Collect row locks list. - * @param lockKey the lock key - * @param resourceId the resource id - * @param xid the xid - * @return the list - */ - protected List collectRowLocks(String lockKey, String resourceId, String xid) { - return collectRowLocks(lockKey, resourceId, xid, XID.getTransactionId(xid), null); - } - - /** - * Collect row locks list. - * @param lockKey the lock key - * @param resourceId the resource id - * @param xid the xid - * @param transactionId the transaction id - * @param branchID the branch id - * @return the list - */ - protected List collectRowLocks(String lockKey, String resourceId, String xid, Long transactionId, - Long branchID) { - List locks = new ArrayList<>(); - - String[] tableGroupedLockKeys = lockKey.split(";"); - for (String tableGroupedLockKey : tableGroupedLockKeys) { - int idx = tableGroupedLockKey.indexOf(':'); - if (idx < 0) { - return locks; - } - String tableName = tableGroupedLockKey.substring(0, idx); - String mergedPKs = tableGroupedLockKey.substring(idx + 1); - if (StringUtils.isBlank(mergedPKs)) { - return locks; - } - String[] pks = mergedPKs.split(","); - if (pks.length == 0) { - return locks; - } - for (String pk : pks) { - if (StringUtils.isNotBlank(pk)) { - RowLock rowLock = new RowLock(); - rowLock.setXid(xid); - rowLock.setTransactionId(transactionId); - rowLock.setBranchId(branchID); - rowLock.setTableName(tableName); - rowLock.setPk(pk); - rowLock.setResourceId(resourceId); - locks.add(rowLock); - } - } - } - return locks; - } - - @Override - public void updateLockStatus(String xid, LockStatus lockStatus) { - this.getLocker().updateLockStatus(xid, lockStatus); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/lock/LockManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/lock/LockManager.java deleted file mode 100644 index 86bcb3a567..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/lock/LockManager.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.lock; - -import java.util.List; - -import io.seata.core.exception.TransactionException; -import io.seata.core.lock.RowLock; -import io.seata.core.model.LockStatus; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; - -/** - * The interface Lock manager. - * - * @author sharajava - */ -public interface LockManager { - - /** - * Acquire lock boolean. - * @param branchSession the branch session - * @return the boolean - * @throws TransactionException the transaction exception - */ - boolean acquireLock(BranchSession branchSession) throws TransactionException; - - /** - * Acquire lock boolean. - * @param branchSession the branch session - * @param autoCommit the auto commit - * @param skipCheckLock whether skip check lock or not - * @return the boolean - * @throws TransactionException the transaction exception - */ - boolean acquireLock(BranchSession branchSession, boolean autoCommit, boolean skipCheckLock) - throws TransactionException; - - /** - * Un lock boolean. - * @param branchSession the branch session - * @return the boolean - * @throws TransactionException the transaction exception - */ - boolean releaseLock(BranchSession branchSession) throws TransactionException; - - /** - * Un lock boolean. - * @param globalSession the global session - * @return the boolean - * @throws TransactionException the transaction exception - */ - boolean releaseGlobalSessionLock(GlobalSession globalSession) throws TransactionException; - - /** - * Is lockable boolean. - * @param xid the xid - * @param resourceId the resource id - * @param lockKey the lock key - * @return the boolean - * @throws TransactionException the transaction exception - */ - boolean isLockable(String xid, String resourceId, String lockKey) throws TransactionException; - - /** - * Clean all locks. - * @throws TransactionException the transaction exception - */ - void cleanAllLocks() throws TransactionException; - - /** - * Collect row locks list. - * @param branchSession the branch session - * @return the list - */ - List collectRowLocks(BranchSession branchSession); - - /** - * update lock status. - * @param xid the xid - * @param lockStatus the lock status - * @throws TransactionException the transaction exception - * - */ - void updateLockStatus(String xid, LockStatus lockStatus) throws TransactionException; - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/lock/LockerManagerFactory.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/lock/LockerManagerFactory.java deleted file mode 100644 index aaf0f6bf7f..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/lock/LockerManagerFactory.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.lock; - -import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.server.store.StoreConfig; -import io.seata.server.store.StoreConfig.LockMode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * The type Lock manager factory. - * - * @author sharajava - */ -public class LockerManagerFactory { - - private static final Logger LOGGER = LoggerFactory.getLogger(LockerManagerFactory.class); - - private static final Configuration CONFIG = ConfigurationFactory.getInstance(); - - /** - * the lock manager. - */ - private static volatile LockManager LOCK_MANAGER; - - /** - * Get lock manager. - * @return the lock manager - */ - public static LockManager getLockManager() { - init(); - return LOCK_MANAGER; - } - - public static void init() { - init(null); - } - - public static void destroy() { - LOCK_MANAGER = null; - } - - public static void init(LockMode lockMode) { - if (LOCK_MANAGER == null) { - synchronized (LockerManagerFactory.class) { - if (LOCK_MANAGER == null) { - if (null == lockMode) { - lockMode = StoreConfig.getLockMode(); - } - LOGGER.info("use lock store mode: {}", lockMode.getName()); - // if not exist the lock mode, throw exception - if (null != StoreConfig.StoreMode.get(lockMode.name())) { - LOCK_MANAGER = EnhancedServiceLoader.load(LockManager.class, lockMode.getName()); - } - } - } - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/lock/distributed/DistributedLockerFactory.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/lock/distributed/DistributedLockerFactory.java deleted file mode 100644 index a9987aee05..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/lock/distributed/DistributedLockerFactory.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.lock.distributed; - -import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.common.loader.EnhancedServiceNotFoundException; -import io.seata.core.store.DefaultDistributedLocker; -import io.seata.core.store.DistributedLocker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Distributed locker factory. - * - * @author zhongxiang.wang - */ -public class DistributedLockerFactory { - - /** - * The constant LOGGER. - */ - private static final Logger LOGGER = LoggerFactory.getLogger(DistributedLockerFactory.class); - - private static volatile DistributedLocker DISTRIBUTED_LOCKER = null; - - /** - * Get the distributed locker by lockerType. - * @param lockerType the locker type - * @return the distributed locker - */ - public static DistributedLocker getDistributedLocker(String lockerType) { - if (DISTRIBUTED_LOCKER == null) { - synchronized (DistributedLocker.class) { - if (DISTRIBUTED_LOCKER == null) { - DistributedLocker distributedLocker = null; - try { - if (!"file".equals(lockerType)) { - distributedLocker = EnhancedServiceLoader.load(DistributedLocker.class, lockerType); - } - } - catch (EnhancedServiceNotFoundException ex) { - LOGGER.error("Get distributed locker failed: {}", ex.getMessage(), ex); - } - if (distributedLocker == null) { - distributedLocker = new DefaultDistributedLocker(); - } - DISTRIBUTED_LOCKER = distributedLocker; - } - } - } - return DISTRIBUTED_LOCKER; - } - - public static void cleanLocker() { - DISTRIBUTED_LOCKER = null; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/logging/listener/SystemPropertyLoggerContextListener.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/logging/listener/SystemPropertyLoggerContextListener.java deleted file mode 100644 index 114ccd5d39..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/logging/listener/SystemPropertyLoggerContextListener.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.logging.listener; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.spi.LoggerContextListener; -import ch.qos.logback.core.Context; -import ch.qos.logback.core.spi.ContextAwareBase; -import ch.qos.logback.core.spi.LifeCycle; -import io.seata.core.constants.ConfigurationKeys; - -/** - * @author wang.liang - */ -public class SystemPropertyLoggerContextListener extends ContextAwareBase implements LoggerContextListener, LifeCycle { - - private boolean started = false; - - @Override - public void start() { - if (started) { - return; - } - - Context context = getContext(); - context.putProperty("RPC_PORT", System.getProperty(ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL)); - - started = true; - } - - @Override - public void stop() { - } - - @Override - public boolean isStarted() { - return started; - } - - @Override - public boolean isResetResistant() { - return true; - } - - @Override - public void onStart(LoggerContext context) { - } - - @Override - public void onReset(LoggerContext context) { - } - - @Override - public void onStop(LoggerContext context) { - } - - @Override - public void onLevelChange(Logger logger, Level level) { - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/logging/logback/ExtendedWhitespaceThrowableProxyConverter.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/logging/logback/ExtendedWhitespaceThrowableProxyConverter.java deleted file mode 100644 index 9c79cea10b..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/logging/logback/ExtendedWhitespaceThrowableProxyConverter.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.logging.logback; - -import ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter; -import ch.qos.logback.classic.spi.IThrowableProxy; -import ch.qos.logback.core.CoreConstants; - -/** - * {@link ExtendedThrowableProxyConverter} that adds some additional whitespace around the - * stack trace. Copied from spring-boot-xxx.jar by wang.liang - * - * @author Phillip Webb - */ -public class ExtendedWhitespaceThrowableProxyConverter extends ExtendedThrowableProxyConverter { - - @Override - protected String throwableProxyToString(IThrowableProxy tp) { - return "==>" + CoreConstants.LINE_SEPARATOR + super.throwableProxyToString(tp) + "<==" - + CoreConstants.LINE_SEPARATOR + CoreConstants.LINE_SEPARATOR; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/logging/logback/appender/EnhancedLogstashEncoder.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/logging/logback/appender/EnhancedLogstashEncoder.java deleted file mode 100644 index 04c611df99..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/logging/logback/appender/EnhancedLogstashEncoder.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.logging.logback.appender; - -import net.logstash.logback.composite.JsonProvider; -import net.logstash.logback.composite.JsonProviders; -import net.logstash.logback.encoder.LogstashEncoder; - -import java.util.ArrayList; - -/** - * The type Enhanced logstash encoder. - * - * @author wang.liang - * @since 1.5.0 - */ -public class EnhancedLogstashEncoder extends LogstashEncoder { - - /** - * set exclude provider. - * @param excludedProviderClassName the excluded provider class name - */ - public void setExcludeProvider(String excludedProviderClassName) { - JsonProviders providers = getFormatter().getProviders(); - for (JsonProvider provider : new ArrayList<>(providers.getProviders())) { - if (provider.getClass().getName().equals(excludedProviderClassName)) { - providers.removeProvider((JsonProvider) provider); - } - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/logging/logback/appender/MetricLogbackAppender.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/logging/logback/appender/MetricLogbackAppender.java deleted file mode 100644 index 5f3e188ef2..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/logging/logback/appender/MetricLogbackAppender.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.logging.logback.appender; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.classic.spi.ThrowableProxy; -import ch.qos.logback.core.AppenderBase; -import ch.qos.logback.core.LogbackException; -import io.seata.core.event.EventBus; -import io.seata.core.event.ExceptionEvent; -import io.seata.server.event.EventBusManager; - -/** - * The type metric logback appender. - * - * @author Bughue - */ -public class MetricLogbackAppender extends AppenderBase { - - private EventBus eventBus = EventBusManager.get(); - - @Override - protected void append(ILoggingEvent event) { - try { - Level level = event.getLevel(); - - if (level.isGreaterOrEqual(Level.ERROR)) { - ThrowableProxy info = (ThrowableProxy) event.getThrowableProxy(); - - if (info != null) { - Throwable throwable = info.getThrowable(); - eventBus.post(new ExceptionEvent(throwable.getClass().getName())); - } - } - } - catch (Exception ex) { - throw new LogbackException(event.getFormattedMessage(), ex); - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/metrics/MeterIdConstants.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/metrics/MeterIdConstants.java deleted file mode 100644 index 813fc699f0..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/metrics/MeterIdConstants.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.metrics; - -import io.seata.metrics.IdConstants; -import io.seata.metrics.Id; - -/** - * Constants for meter id in tc. - * - * @author zhengyangyong - */ -public interface MeterIdConstants { - - /** - * 活跃(次数). - */ - Id COUNTER_ACTIVE = new Id(IdConstants.SEATA_TRANSACTION).withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_COUNTER) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_ACTIVE); - - /** - * 提交(次数). - */ - Id COUNTER_COMMITTED = new Id(IdConstants.SEATA_TRANSACTION) - .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_COUNTER) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_COMMITTED); - - /** - * 回滚(次数). - */ - Id COUNTER_ROLLBACKED = new Id(IdConstants.SEATA_TRANSACTION) - .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_COUNTER) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_ROLLBACKED); - - /** - * 修改回滚(次数). - */ - Id COUNTER_AFTER_ROLLBACKED = new Id(IdConstants.SEATA_TRANSACTION) - .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_COUNTER) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_AFTER_ROLLBACKED_KEY); - - /** - * 修改提交(次数). - */ - Id COUNTER_AFTER_COMMITTED = new Id(IdConstants.SEATA_TRANSACTION) - .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_COUNTER) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_AFTER_COMMITTED_KEY); - - /** - * 整体提交. - */ - Id SUMMARY_COMMITTED = new Id(IdConstants.SEATA_TRANSACTION) - .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_COMMITTED); - - /** - * 整体回滚. - */ - Id SUMMARY_ROLLBACKED = new Id(IdConstants.SEATA_TRANSACTION) - .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_ROLLBACKED); - - /** - * 整体失败. - */ - Id SUMMARY_FAILED = new Id(IdConstants.SEATA_TRANSACTION).withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_FAILED); - - /** - * 两次提交超时. - */ - Id SUMMARY_TWO_PHASE_TIMEOUT = new Id(IdConstants.SEATA_TRANSACTION) - .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_TWO_PHASE_TIMEOUT); - - /** - * 整体修改回滚. - */ - Id SUMMARY_AFTER_ROLLBACKED = new Id(IdConstants.SEATA_TRANSACTION) - .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_AFTER_ROLLBACKED_KEY); - - /** - * 整体修改提交. - */ - Id SUMMARY_AFTER_COMMITTED = new Id(IdConstants.SEATA_TRANSACTION) - .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_AFTER_COMMITTED_KEY); - - /** - * 提交. - */ - Id TIMER_COMMITTED = new Id(IdConstants.SEATA_TRANSACTION).withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_TIMER) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_COMMITTED); - - /** - * 回滚. - */ - Id TIMER_ROLLBACK = new Id(IdConstants.SEATA_TRANSACTION).withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_TIMER) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_ROLLBACKED); - - /** - * 失败. - */ - Id TIMER_FAILED = new Id(IdConstants.SEATA_TRANSACTION).withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_TIMER) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_FAILED); - - /** - * 修改回滚. - */ - Id TIMER_AFTER_ROLLBACKED = new Id(IdConstants.SEATA_TRANSACTION) - .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_TIMER) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_AFTER_ROLLBACKED_KEY); - - /** - * 修改提交. - */ - Id TIMER_AFTER_COMMITTED = new Id(IdConstants.SEATA_TRANSACTION) - .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_TIMER) - .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_AFTER_COMMITTED_KEY); - - /** - * 整体异常. - */ - Id SUMMARY_EXP = new Id(IdConstants.SEATA_EXCEPTION).withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC) - .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY); - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/metrics/MetricsManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/metrics/MetricsManager.java deleted file mode 100644 index ad94d9088e..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/metrics/MetricsManager.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.metrics; - -import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; -import io.seata.metrics.exporter.Exporter; -import io.seata.metrics.exporter.ExporterFactory; -import io.seata.metrics.registry.Registry; -import io.seata.metrics.registry.RegistryFactory; -import io.seata.server.event.EventBusManager; - -import java.util.List; - -import static io.seata.common.DefaultValues.DEFAULT_METRICS_ENABLED; - -/** - * Metrics manager for init. - * - * @author zhengyangyong - */ -public class MetricsManager { - - private Registry registry; - - public static MetricsManager get() { - return MetricsManager.SingletonHolder.INSTANCE; - } - - public Registry getRegistry() { - return registry; - } - - public void init() { - boolean enabled = ConfigurationFactory.getInstance() - .getBoolean(ConfigurationKeys.METRICS_PREFIX + ConfigurationKeys.METRICS_ENABLED, DEFAULT_METRICS_ENABLED); - if (enabled) { - registry = RegistryFactory.getInstance(); - if (registry != null) { - List exporters = ExporterFactory.getInstanceList(); - // only at least one metrics exporter implement had imported in pom then - // need register MetricsSubscriber - if (exporters.size() != 0) { - exporters.forEach(exporter -> exporter.setRegistry(registry)); - EventBusManager.get().register(new MetricsSubscriber(registry)); - } - } - } - } - - private static class SingletonHolder { - - private static final MetricsManager INSTANCE = new MetricsManager(); - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/metrics/MetricsPublisher.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/metrics/MetricsPublisher.java deleted file mode 100644 index 54148826aa..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/metrics/MetricsPublisher.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.metrics; - -import io.seata.core.event.EventBus; -import io.seata.core.event.GlobalTransactionEvent; -import io.seata.core.model.GlobalStatus; -import io.seata.server.event.EventBusManager; -import io.seata.server.session.GlobalSession; - -/** - * The type Metrics publisher. - * - * @author slievrly - */ -public class MetricsPublisher { - - private static final EventBus EVENT_BUS = EventBusManager.get(); - - /** - * post end event. - * @param globalSession the global session - * @param retryGlobal the retry global - * @param retryBranch the retry branch - */ - public static void postSessionDoneEvent(final GlobalSession globalSession, boolean retryGlobal, - boolean retryBranch) { - postSessionDoneEvent(globalSession, globalSession.getStatus(), retryGlobal, retryBranch); - } - - /** - * post end event (force specified state). - * @param globalSession the global session - * @param status the global status - * @param retryGlobal the retry global - * @param retryBranch the retry branch - */ - public static void postSessionDoneEvent(final GlobalSession globalSession, GlobalStatus status, boolean retryGlobal, - boolean retryBranch) { - postSessionDoneEvent(globalSession, status.name(), retryGlobal, globalSession.getBeginTime(), retryBranch); - } - - /** - * Post session done event. - * @param globalSession the global session - * @param status the status - * @param retryGlobal the retry global - * @param beginTime the begin time - * @param retryBranch the retry branch - */ - public static void postSessionDoneEvent(final GlobalSession globalSession, String status, boolean retryGlobal, - long beginTime, boolean retryBranch) { - EVENT_BUS.post(new GlobalTransactionEvent(globalSession.getTransactionId(), GlobalTransactionEvent.ROLE_TC, - globalSession.getTransactionName(), globalSession.getApplicationId(), - globalSession.getTransactionServiceGroup(), beginTime, System.currentTimeMillis(), status, retryGlobal, - retryBranch)); - } - - /** - * Post session doing event. - * @param globalSession the global session - * @param retryGlobal the retry global - */ - public static void postSessionDoingEvent(final GlobalSession globalSession, boolean retryGlobal) { - postSessionDoingEvent(globalSession, globalSession.getStatus().name(), retryGlobal, false); - } - - /** - * Post session doing event. - * @param globalSession the global session - * @param status the status - * @param retryGlobal the retry global - * @param retryBranch the retry branch - */ - public static void postSessionDoingEvent(final GlobalSession globalSession, String status, boolean retryGlobal, - boolean retryBranch) { - EVENT_BUS.post(new GlobalTransactionEvent(globalSession.getTransactionId(), GlobalTransactionEvent.ROLE_TC, - globalSession.getTransactionName(), globalSession.getApplicationId(), - globalSession.getTransactionServiceGroup(), globalSession.getBeginTime(), null, status, retryGlobal, - retryBranch)); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/metrics/MetricsSubscriber.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/metrics/MetricsSubscriber.java deleted file mode 100644 index f34d3aa738..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/metrics/MetricsSubscriber.java +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.metrics; - -import com.google.common.eventbus.Subscribe; -import io.seata.core.event.ExceptionEvent; -import io.seata.core.event.GlobalTransactionEvent; -import io.seata.core.model.GlobalStatus; -import io.seata.metrics.registry.Registry; -import io.seata.server.event.EventBusManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; - -import static io.seata.metrics.IdConstants.*; - -/** - * Event subscriber for metrics. - * - * @author zhengyangyong - */ -public class MetricsSubscriber { - - private static final Logger LOGGER = LoggerFactory.getLogger(MetricsSubscriber.class); - - private final Registry registry; - - private final Map> consumers; - - public MetricsSubscriber(Registry registry) { - this.registry = registry; - consumers = new HashMap<>(); - consumers.put(GlobalStatus.Begin.name(), this::processGlobalStatusBegin); - consumers.put(GlobalStatus.Committed.name(), this::processGlobalStatusCommitted); - consumers.put(GlobalStatus.Rollbacked.name(), this::processGlobalStatusRollbacked); - - consumers.put(GlobalStatus.CommitFailed.name(), this::processGlobalStatusCommitFailed); - consumers.put(GlobalStatus.RollbackFailed.name(), this::processGlobalStatusRollbackFailed); - consumers.put(GlobalStatus.TimeoutRollbacked.name(), this::processGlobalStatusTimeoutRollbacked); - consumers.put(GlobalStatus.TimeoutRollbackFailed.name(), this::processGlobalStatusTimeoutRollbackFailed); - - consumers.put(GlobalStatus.CommitRetryTimeout.name(), this::processGlobalStatusCommitRetryTimeout); - consumers.put(GlobalStatus.RollbackRetryTimeout.name(), this::processGlobalStatusTimeoutRollbackRetryTimeout); - - consumers.put(STATUS_VALUE_AFTER_COMMITTED_KEY, this::processAfterGlobalCommitted); - consumers.put(STATUS_VALUE_AFTER_ROLLBACKED_KEY, this::processAfterGlobalRollbacked); - } - - private void processGlobalStatusBegin(GlobalTransactionEvent event) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("accept new event,xid:{},event:{}", event.getId(), event); - for (Object object : EventBusManager.get().getSubscribers()) { - LOGGER.debug("subscribe:{},threadName:{}", object.toString(), Thread.currentThread().getName()); - } - } - registry - .getCounter(MeterIdConstants.COUNTER_ACTIVE.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .increase(1); - } - - private void processGlobalStatusCommitted(GlobalTransactionEvent event) { - if (event.isRetryGlobal()) { - return; - } - decreaseActive(event); - registry - .getCounter(MeterIdConstants.COUNTER_COMMITTED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .increase(1); - registry - .getSummary(MeterIdConstants.SUMMARY_COMMITTED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .increase(1); - registry - .getTimer(MeterIdConstants.TIMER_COMMITTED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .record(event.getEndTime() - event.getBeginTime(), TimeUnit.MILLISECONDS); - } - - private void processGlobalStatusRollbacked(GlobalTransactionEvent event) { - if (event.isRetryGlobal()) { - return; - } - decreaseActive(event); - registry - .getCounter(MeterIdConstants.COUNTER_ROLLBACKED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .increase(1); - registry - .getSummary(MeterIdConstants.SUMMARY_ROLLBACKED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .increase(1); - registry - .getTimer(MeterIdConstants.TIMER_ROLLBACK.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .record(event.getEndTime() - event.getBeginTime(), TimeUnit.MILLISECONDS); - } - - private void processAfterGlobalRollbacked(GlobalTransactionEvent event) { - if (event.isRetryGlobal() && event.isRetryBranch()) { - decreaseActive(event); - } - registry - .getCounter(MeterIdConstants.COUNTER_AFTER_ROLLBACKED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .increase(1); - registry - .getSummary(MeterIdConstants.SUMMARY_AFTER_ROLLBACKED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .increase(1); - registry - .getTimer(MeterIdConstants.TIMER_AFTER_ROLLBACKED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .record(event.getEndTime() - event.getBeginTime(), TimeUnit.MILLISECONDS); - } - - private void processAfterGlobalCommitted(GlobalTransactionEvent event) { - if (event.isRetryGlobal() && event.isRetryBranch()) { - decreaseActive(event); - } - registry - .getCounter(MeterIdConstants.COUNTER_AFTER_COMMITTED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .increase(1); - registry - .getSummary(MeterIdConstants.SUMMARY_AFTER_COMMITTED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .increase(1); - registry - .getTimer(MeterIdConstants.TIMER_AFTER_COMMITTED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .record(event.getEndTime() - event.getBeginTime(), TimeUnit.MILLISECONDS); - } - - private void processGlobalStatusCommitFailed(GlobalTransactionEvent event) { - decreaseActive(event); - reportFailed(event); - } - - private void processGlobalStatusRollbackFailed(GlobalTransactionEvent event) { - decreaseActive(event); - reportFailed(event); - } - - private void processGlobalStatusTimeoutRollbacked(GlobalTransactionEvent event) { - decreaseActive(event); - } - - private void processGlobalStatusTimeoutRollbackFailed(GlobalTransactionEvent event) { - decreaseActive(event); - reportTwoPhaseTimeout(event); - } - - private void processGlobalStatusCommitRetryTimeout(GlobalTransactionEvent event) { - decreaseActive(event); - reportTwoPhaseTimeout(event); - } - - private void processGlobalStatusTimeoutRollbackRetryTimeout(GlobalTransactionEvent event) { - decreaseActive(event); - } - - private void decreaseActive(GlobalTransactionEvent event) { - registry - .getCounter(MeterIdConstants.COUNTER_ACTIVE.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .decrease(1); - } - - private void reportFailed(GlobalTransactionEvent event) { - registry - .getSummary(MeterIdConstants.SUMMARY_FAILED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .increase(1); - registry - .getTimer(MeterIdConstants.TIMER_FAILED.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .record(event.getEndTime() - event.getBeginTime(), TimeUnit.MILLISECONDS); - } - - private void reportTwoPhaseTimeout(GlobalTransactionEvent event) { - registry - .getSummary(MeterIdConstants.SUMMARY_TWO_PHASE_TIMEOUT.withTag(APP_ID_KEY, event.getApplicationId()) - .withTag(GROUP_KEY, event.getGroup())) - .increase(1); - } - - @Subscribe - public void recordGlobalTransactionEventForMetrics(GlobalTransactionEvent event) { - if (registry != null && consumers.containsKey(event.getStatus())) { - consumers.get(event.getStatus()).accept(event); - } - } - - @Subscribe - public void exceptionEventForMetrics(ExceptionEvent event) { - registry.getSummary(MeterIdConstants.SUMMARY_EXP.withTag(APP_ID_KEY, event.getName())).increase(1); - } - - @Override - public boolean equals(Object obj) { - return this.getClass().getName().equals(obj.getClass().getName()); - } - - /** - * PMD check SuppressWarnings("checkstyle:EqualsHashCode"). - * @return the hash code - */ - @Override - public int hashCode() { - return super.hashCode(); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/AbstractSessionManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/AbstractSessionManager.java deleted file mode 100644 index 4b1563ab2d..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/AbstractSessionManager.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import io.seata.core.exception.BranchTransactionException; -import io.seata.core.exception.GlobalTransactionException; -import io.seata.core.exception.TransactionException; -import io.seata.core.exception.TransactionExceptionCode; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.GlobalStatus; -import io.seata.core.model.LockStatus; -import io.seata.server.store.SessionStorable; -import io.seata.server.store.TransactionStoreManager; -import io.seata.server.store.TransactionStoreManager.LogOperation; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * The type Abstract session manager. - */ -public abstract class AbstractSessionManager implements SessionManager { - - /** - * The constant LOGGER. - */ - protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractSessionManager.class); - - /** - * The Transaction store manager. - */ - protected TransactionStoreManager transactionStoreManager; - - /** - * The Name. - */ - protected String name; - - /** - * Instantiates a new Abstract session manager. - */ - public AbstractSessionManager() { - } - - /** - * Instantiates a new Abstract session manager. - * @param name the name - */ - public AbstractSessionManager(String name) { - this.name = name; - } - - @Override - public void addGlobalSession(GlobalSession session) throws TransactionException { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("MANAGER[{}] SESSION[{}] {}", name, session, LogOperation.GLOBAL_ADD); - } - writeSession(LogOperation.GLOBAL_ADD, session); - } - - @Override - public void updateGlobalSessionStatus(GlobalSession session, GlobalStatus status) throws TransactionException { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("MANAGER[{}] SESSION[{}] {}", name, session, LogOperation.GLOBAL_UPDATE); - } - if (GlobalStatus.Rollbacking == status || GlobalStatus.TimeoutRollbacking == status) { - session.getBranchSessions().forEach(i -> i.setLockStatus(LockStatus.Rollbacking)); - } - session.setStatus(status); - writeSession(LogOperation.GLOBAL_UPDATE, session); - } - - @Override - public void removeGlobalSession(GlobalSession session) throws TransactionException { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("MANAGER[{}] SESSION[{}] {}", name, session, LogOperation.GLOBAL_REMOVE); - } - writeSession(LogOperation.GLOBAL_REMOVE, session); - } - - @Override - public void addBranchSession(GlobalSession session, BranchSession branchSession) throws TransactionException { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("MANAGER[{}] SESSION[{}] {}", name, branchSession, LogOperation.BRANCH_ADD); - } - writeSession(LogOperation.BRANCH_ADD, branchSession); - } - - @Override - public void updateBranchSessionStatus(BranchSession branchSession, BranchStatus status) - throws TransactionException { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("MANAGER[{}] SESSION[{}] {}", name, branchSession, LogOperation.BRANCH_UPDATE); - } - writeSession(LogOperation.BRANCH_UPDATE, branchSession); - } - - @Override - public void removeBranchSession(GlobalSession globalSession, BranchSession branchSession) - throws TransactionException { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("MANAGER[{}] SESSION[{}] {}", name, branchSession, LogOperation.BRANCH_REMOVE); - } - writeSession(LogOperation.BRANCH_REMOVE, branchSession); - } - - @Override - public void onBegin(GlobalSession globalSession) throws TransactionException { - addGlobalSession(globalSession); - } - - @Override - public void onStatusChange(GlobalSession globalSession, GlobalStatus status) throws TransactionException { - updateGlobalSessionStatus(globalSession, status); - } - - @Override - public void onBranchStatusChange(GlobalSession globalSession, BranchSession branchSession, BranchStatus status) - throws TransactionException { - branchSession.setStatus(status); - updateBranchSessionStatus(branchSession, status); - } - - @Override - public void onAddBranch(GlobalSession globalSession, BranchSession branchSession) throws TransactionException { - addBranchSession(globalSession, branchSession); - } - - @Override - public void onRemoveBranch(GlobalSession globalSession, BranchSession branchSession) throws TransactionException { - removeBranchSession(globalSession, branchSession); - } - - @Override - public void onClose(GlobalSession globalSession) throws TransactionException { - globalSession.setActive(false); - } - - @Override - public void onSuccessEnd(GlobalSession globalSession) throws TransactionException { - removeGlobalSession(globalSession); - } - - @Override - public void onFailEnd(GlobalSession globalSession) throws TransactionException { - LOGGER.info("xid:{} fail end, transaction:{}", globalSession.getXid(), globalSession); - } - - private void writeSession(LogOperation logOperation, SessionStorable sessionStorable) throws TransactionException { - if (!transactionStoreManager.writeSession(logOperation, sessionStorable)) { - if (LogOperation.GLOBAL_ADD.equals(logOperation)) { - throw new GlobalTransactionException(TransactionExceptionCode.FailedWriteSession, - "Fail to store global session"); - } - else if (LogOperation.GLOBAL_UPDATE.equals(logOperation)) { - throw new GlobalTransactionException(TransactionExceptionCode.FailedWriteSession, - "Fail to update global session"); - } - else if (LogOperation.GLOBAL_REMOVE.equals(logOperation)) { - throw new GlobalTransactionException(TransactionExceptionCode.FailedWriteSession, - "Fail to remove global session"); - } - else if (LogOperation.BRANCH_ADD.equals(logOperation)) { - throw new BranchTransactionException(TransactionExceptionCode.FailedWriteSession, - "Fail to store branch session"); - } - else if (LogOperation.BRANCH_UPDATE.equals(logOperation)) { - throw new BranchTransactionException(TransactionExceptionCode.FailedWriteSession, - "Fail to update branch session"); - } - else if (LogOperation.BRANCH_REMOVE.equals(logOperation)) { - throw new BranchTransactionException(TransactionExceptionCode.FailedWriteSession, - "Fail to remove branch session"); - } - else { - throw new BranchTransactionException(TransactionExceptionCode.FailedWriteSession, - "Unknown LogOperation:" + logOperation.name()); - } - } - } - - @Override - public void destroy() { - } - - /** - * Sets transaction store manager. - * @param transactionStoreManager the transaction store manager - */ - public void setTransactionStoreManager(TransactionStoreManager transactionStoreManager) { - this.transactionStoreManager = transactionStoreManager; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/BranchSession.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/BranchSession.java deleted file mode 100644 index 33ad6ba936..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/BranchSession.java +++ /dev/null @@ -1,471 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import com.alipay.sofa.jraft.util.BufferUtils; -import io.seata.common.util.CompressUtil; -import io.seata.core.exception.TransactionException; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.BranchType; -import io.seata.core.model.LockStatus; -import io.seata.server.lock.LockManager; -import io.seata.server.lock.LockerManagerFactory; -import io.seata.server.storage.file.lock.FileLocker; -import io.seata.server.store.SessionStorable; -import io.seata.server.store.StoreConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.Collections; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -import static io.seata.core.model.LockStatus.Locked; - -/** - * The type Branch session. - * - * @author sharajava - */ -public class BranchSession implements Lockable, Comparable, SessionStorable { - - private static final Logger LOGGER = LoggerFactory.getLogger(BranchSession.class); - - private static final int MAX_BRANCH_SESSION_SIZE = StoreConfig.getMaxBranchSessionSize(); - - private static ThreadLocal byteBufferThreadLocal = ThreadLocal - .withInitial(() -> ByteBuffer.allocate(MAX_BRANCH_SESSION_SIZE)); - - private String xid; - - private long transactionId; - - private long branchId; - - private String resourceGroupId; - - private String resourceId; - - private String lockKey; - - private BranchType branchType; - - private BranchStatus status = BranchStatus.Unknown; - - private String clientId; - - private String applicationData; - - private LockStatus lockStatus = Locked; - - private final Map> lockHolder; - - private final LockManager lockManager = LockerManagerFactory.getLockManager(); - - public BranchSession() { - lockHolder = new ConcurrentHashMap<>(2); - } - - public BranchSession(BranchType branchType) { - this.branchType = branchType; - this.lockHolder = branchType == BranchType.AT ? new ConcurrentHashMap<>(8) : Collections.emptyMap(); - } - - /** - * Gets application data. - * @return the application data - */ - public String getApplicationData() { - return applicationData; - } - - /** - * Sets application data. - * @param applicationData the application data - */ - public void setApplicationData(String applicationData) { - this.applicationData = applicationData; - } - - /** - * Gets resource group id. - * @return the resource group id - */ - public String getResourceGroupId() { - return resourceGroupId; - } - - /** - * Sets resource group id. - * @param resourceGroupId the resource group id - */ - public void setResourceGroupId(String resourceGroupId) { - this.resourceGroupId = resourceGroupId; - } - - /** - * Gets client id. - * @return the client id - */ - public String getClientId() { - return clientId; - } - - /** - * Sets client id. - * @param clientId the client id - */ - public void setClientId(String clientId) { - this.clientId = clientId; - } - - /** - * Gets resource id. - * @return the resource id - */ - public String getResourceId() { - return resourceId; - } - - /** - * Sets resource id. - * @param resourceId the resource id - */ - public void setResourceId(String resourceId) { - this.resourceId = resourceId; - } - - /** - * Gets lock key. - * @return the lock key - */ - public String getLockKey() { - return lockKey; - } - - /** - * Sets lock key. - * @param lockKey the lock key - */ - public void setLockKey(String lockKey) { - this.lockKey = lockKey; - } - - /** - * Gets branch type. - * @return the branch type - */ - public BranchType getBranchType() { - return branchType; - } - - /** - * Sets branch type. - * @param branchType the branch type - */ - public void setBranchType(BranchType branchType) { - this.branchType = branchType; - } - - /** - * Gets status. - * @return the status - */ - public BranchStatus getStatus() { - return status; - } - - /** - * Sets status. - * @param status the status - */ - public void setStatus(BranchStatus status) { - this.status = status; - } - - /** - * Gets transaction id. - * @return the transaction id - */ - public long getTransactionId() { - return transactionId; - } - - /** - * Sets transaction id. - * @param transactionId the transaction id - */ - public void setTransactionId(long transactionId) { - this.transactionId = transactionId; - } - - /** - * Gets branch id. - * @return the branch id - */ - public long getBranchId() { - return branchId; - } - - /** - * Sets branch id. - * @param branchId the branch id - */ - public void setBranchId(long branchId) { - this.branchId = branchId; - } - - /** - * Gets xid. - * @return the xid - */ - public String getXid() { - return xid; - } - - /** - * Sets xid. - * @param xid the xid - */ - public void setXid(String xid) { - this.xid = xid; - } - - @Override - public String toString() { - return "BR:" + branchId + "/" + transactionId; - } - - @Override - public int compareTo(BranchSession o) { - return Long.compare(this.branchId, o.branchId); - } - - public boolean canBeCommittedAsync() { - return branchType == BranchType.AT || status == BranchStatus.PhaseOne_Failed; - } - - /** - * Gets lock holder. - * @return the lock holder - */ - public Map> getLockHolder() { - return lockHolder; - } - - @Override - public boolean lock() throws TransactionException { - return this.lock(true, false); - } - - public boolean lock(boolean autoCommit, boolean skipCheckLock) throws TransactionException { - if (this.branchType.equals(BranchType.AT)) { - return lockManager.acquireLock(this, autoCommit, skipCheckLock); - } - return true; - } - - @Override - public boolean unlock() throws TransactionException { - if (this.branchType == BranchType.AT) { - return lockManager.releaseLock(this); - } - return true; - } - - public boolean isAT() { - return this.getBranchType() == BranchType.AT; - } - - public LockStatus getLockStatus() { - return lockStatus; - } - - public void setLockStatus(LockStatus lockStatus) { - this.lockStatus = lockStatus; - } - - @Override - public byte[] encode() { - - byte[] resourceIdBytes = resourceId != null ? resourceId.getBytes() : null; - - byte[] lockKeyBytes = lockKey != null ? lockKey.getBytes() : null; - - byte[] clientIdBytes = clientId != null ? clientId.getBytes() : null; - - byte[] applicationDataBytes = applicationData != null ? applicationData.getBytes() : null; - - byte[] xidBytes = xid != null ? xid.getBytes() : null; - - byte branchTypeByte = branchType != null ? (byte) branchType.ordinal() : -1; - - int size = calBranchSessionSize(resourceIdBytes, lockKeyBytes, clientIdBytes, applicationDataBytes, xidBytes); - - if (size > MAX_BRANCH_SESSION_SIZE) { - if (lockKeyBytes == null) { - throw new RuntimeException("branch session size exceeded, size : " + size + " maxBranchSessionSize : " - + MAX_BRANCH_SESSION_SIZE); - } - // try compress lockkey - try { - size -= lockKeyBytes.length; - lockKeyBytes = CompressUtil.compress(lockKeyBytes); - } - catch (IOException e) { - LOGGER.error("compress lockKey error", e); - } - finally { - size += lockKeyBytes.length; - } - - if (size > MAX_BRANCH_SESSION_SIZE) { - throw new RuntimeException("compress branch session size exceeded, compressSize : " + size - + " maxBranchSessionSize : " + MAX_BRANCH_SESSION_SIZE); - } - } - - ByteBuffer byteBuffer = byteBufferThreadLocal.get(); - // recycle - byteBuffer.clear(); - - byteBuffer.putLong(transactionId); - byteBuffer.putLong(branchId); - - if (resourceIdBytes != null) { - byteBuffer.putInt(resourceIdBytes.length); - byteBuffer.put(resourceIdBytes); - } - else { - byteBuffer.putInt(0); - } - - if (lockKeyBytes != null) { - byteBuffer.putInt(lockKeyBytes.length); - byteBuffer.put(lockKeyBytes); - } - else { - byteBuffer.putInt(0); - } - - if (clientIdBytes != null) { - byteBuffer.putShort((short) clientIdBytes.length); - byteBuffer.put(clientIdBytes); - } - else { - byteBuffer.putShort((short) 0); - } - - if (applicationDataBytes != null) { - byteBuffer.putInt(applicationDataBytes.length); - byteBuffer.put(applicationDataBytes); - } - else { - byteBuffer.putInt(0); - } - - if (xidBytes != null) { - byteBuffer.putInt(xidBytes.length); - byteBuffer.put(xidBytes); - } - else { - byteBuffer.putInt(0); - } - - byteBuffer.put(branchTypeByte); - - byteBuffer.put((byte) status.getCode()); - byteBuffer.put((byte) lockStatus.getCode()); - BufferUtils.flip(byteBuffer); - byte[] result = new byte[byteBuffer.limit()]; - byteBuffer.get(result); - return result; - } - - private int calBranchSessionSize(byte[] resourceIdBytes, byte[] lockKeyBytes, byte[] clientIdBytes, - byte[] applicationDataBytes, byte[] xidBytes) { - final int size = 8 // trascationId - + 8 // branchId - + 4 // resourceIdBytes.length - + 4 // lockKeyBytes.length - + 2 // clientIdBytes.length - + 4 // applicationDataBytes.length - + 4 // xidBytes.size - + 1 // statusCode - + (resourceIdBytes == null ? 0 : resourceIdBytes.length) - + (lockKeyBytes == null ? 0 : lockKeyBytes.length) + (clientIdBytes == null ? 0 : clientIdBytes.length) - + (applicationDataBytes == null ? 0 : applicationDataBytes.length) - + (xidBytes == null ? 0 : xidBytes.length) + 1; // branchType - return size; - } - - @Override - public void decode(byte[] a) { - ByteBuffer byteBuffer = ByteBuffer.wrap(a); - this.transactionId = byteBuffer.getLong(); - this.branchId = byteBuffer.getLong(); - int resourceLen = byteBuffer.getInt(); - if (resourceLen > 0) { - byte[] byResource = new byte[resourceLen]; - byteBuffer.get(byResource); - this.resourceId = new String(byResource); - } - int lockKeyLen = byteBuffer.getInt(); - if (lockKeyLen > 0) { - byte[] byLockKey = new byte[lockKeyLen]; - byteBuffer.get(byLockKey); - if (CompressUtil.isCompressData(byLockKey)) { - try { - this.lockKey = new String(CompressUtil.uncompress(byLockKey)); - } - catch (IOException e) { - throw new RuntimeException("decompress lockKey error", e); - } - } - else { - this.lockKey = new String(byLockKey); - } - - } - short clientIdLen = byteBuffer.getShort(); - if (clientIdLen > 0) { - byte[] byClientId = new byte[clientIdLen]; - byteBuffer.get(byClientId); - this.clientId = new String(byClientId); - } - int applicationDataLen = byteBuffer.getInt(); - if (applicationDataLen > 0) { - byte[] byApplicationData = new byte[applicationDataLen]; - byteBuffer.get(byApplicationData); - this.applicationData = new String(byApplicationData); - } - int xidLen = byteBuffer.getInt(); - if (xidLen > 0) { - byte[] xidBytes = new byte[xidLen]; - byteBuffer.get(xidBytes); - this.xid = new String(xidBytes); - } - int branchTypeId = byteBuffer.get(); - if (branchTypeId >= 0) { - this.branchType = BranchType.values()[branchTypeId]; - } - this.status = BranchStatus.get(byteBuffer.get()); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/BranchSessionHandler.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/BranchSessionHandler.java deleted file mode 100644 index 0c14ff1722..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/BranchSessionHandler.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import io.seata.core.exception.TransactionException; - -/** - * The Functional Interface Branch session handler. - * - * @author wang.liang - * @since 1.5.0 - */ -@FunctionalInterface -public interface BranchSessionHandler { - - /** - * 继续. - */ - Boolean CONTINUE = null; - - /** - * Handle branch session. - * @param branchSession the branch session - * @return the handle result - * @throws TransactionException the transaction exception - */ - Boolean handle(BranchSession branchSession) throws TransactionException; - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/GlobalSession.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/GlobalSession.java deleted file mode 100644 index 776a6108ee..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/GlobalSession.java +++ /dev/null @@ -1,795 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import com.alipay.sofa.jraft.util.BufferUtils; -import io.seata.common.ConfigurationKeys; -import io.seata.common.Constants; -import io.seata.common.DefaultValues; -import io.seata.common.XID; -import io.seata.common.util.StringUtils; -import io.seata.config.ConfigurationFactory; -import io.seata.core.exception.GlobalTransactionException; -import io.seata.core.exception.TransactionException; -import io.seata.core.exception.TransactionExceptionCode; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.BranchType; -import io.seata.core.model.GlobalStatus; -import io.seata.core.model.LockStatus; -import io.seata.server.UUIDGenerator; -import io.seata.server.cluster.raft.RaftServerFactory; -import io.seata.server.lock.LockerManagerFactory; -import io.seata.server.store.SessionStorable; -import io.seata.server.store.StoreConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.nio.ByteBuffer; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -import static io.seata.core.model.GlobalStatus.*; - -/** - * The type Global session. - * - * @author sharajava - */ -public class GlobalSession implements SessionLifecycle, SessionStorable { - - private static final Logger LOGGER = LoggerFactory.getLogger(GlobalSession.class); - - private static final int MAX_GLOBAL_SESSION_SIZE = StoreConfig.getMaxGlobalSessionSize(); - - private static ThreadLocal byteBufferThreadLocal = ThreadLocal - .withInitial(() -> ByteBuffer.allocate(MAX_GLOBAL_SESSION_SIZE)); - - /** - * ThreadLocal should be optimize. It is tied to the current threading model. - * threadlocal's public set method does nothing to protect it from abuse. - */ - private static final ThreadLocal EXPECTED_STATUS_THREAD_LOCAL = new ThreadLocal<>(); - - /** - * If the global session's status is (Rollbacking or Committing) and currentTime - - * createTime >= RETRY_DEAD_THRESHOLD then the tx will be remand as need to retry - * rollback. - */ - private static final int RETRY_DEAD_THRESHOLD = ConfigurationFactory.getInstance() - .getInt(ConfigurationKeys.RETRY_DEAD_THRESHOLD, DefaultValues.DEFAULT_RETRY_DEAD_THRESHOLD); - - private String xid; - - private long transactionId; - - private volatile GlobalStatus status; - - private String applicationId; - - private String transactionServiceGroup; - - private String transactionName; - - private int timeout; - - private long beginTime; - - private String applicationData; - - private final boolean lazyLoadBranch; - - private volatile boolean active = true; - - private List branchSessions; - - private GlobalSessionLock globalSessionLock = new GlobalSessionLock(); - - private Set lifecycleListeners = new HashSet<>(2); - - /** - * Add boolean. - * @param branchSession the branch session - * @return the boolean - */ - public boolean add(BranchSession branchSession) { - if (null != branchSessions) { - return branchSessions.add(branchSession); - } - else { - // db and redis no need to deal with - return true; - } - } - - /** - * Remove boolean. - * @param branchSession the branch session - * @return the boolean - */ - public boolean remove(BranchSession branchSession) { - synchronized (this) { - return branchSessions.remove(branchSession); - } - } - - /** - * Remove boolean. - * @param branchId the long - * @return the boolean - */ - public boolean remove(Long branchId) { - return this.remove(this.getBranch(branchId)); - } - - /** - * Can be committed async boolean. - * @return the boolean - */ - public boolean canBeCommittedAsync() { - List branchSessions = getBranchSessions(); - for (BranchSession branchSession : branchSessions) { - if (!branchSession.canBeCommittedAsync()) { - return false; - } - } - return true; - } - - /** - * Has AT branch. - * @return the boolean - */ - public boolean hasATBranch() { - List branchSessions = getBranchSessions(); - for (BranchSession branchSession : branchSessions) { - if (branchSession.getBranchType() == BranchType.AT) { - return true; - } - } - return false; - } - - /** - * Is saga type transaction. - * @return is saga - */ - public boolean isSaga() { - List branchSessions = getBranchSessions(); - if (branchSessions.size() > 0) { - return BranchType.SAGA == branchSessions.get(0).getBranchType(); - } - else { - return StringUtils.isNotBlank(transactionName) - && transactionName.startsWith(Constants.SAGA_TRANS_NAME_PREFIX); - } - } - - /** - * Is timeout boolean. - * @return the boolean - */ - public boolean isTimeout() { - return (System.currentTimeMillis() - beginTime) > timeout; - } - - /** - * prevent could not handle committing and rollbacking transaction. - * @return if true retry commit or roll back - */ - public boolean isDeadSession() { - return (System.currentTimeMillis() - beginTime) > RETRY_DEAD_THRESHOLD; - } - - @Override - public void begin() throws TransactionException { - this.status = GlobalStatus.Begin; - this.beginTime = System.currentTimeMillis(); - this.active = true; - SessionHolder.getRootSessionManager().onBegin(this); - for (SessionLifecycleListener lifecycleListener : lifecycleListeners) { - lifecycleListener.onBegin(this); - } - } - - @Override - public void changeGlobalStatus(GlobalStatus status) throws TransactionException { - if (GlobalStatus.Rollbacking == status || GlobalStatus.TimeoutRollbacking == status) { - LockerManagerFactory.getLockManager().updateLockStatus(xid, LockStatus.Rollbacking); - } - SessionHolder.getRootSessionManager().onStatusChange(this, status); - // set session status after update successfully - this.status = status; - for (SessionLifecycleListener lifecycleListener : lifecycleListeners) { - lifecycleListener.onStatusChange(this, status); - } - } - - @Override - public void changeBranchStatus(BranchSession branchSession, BranchStatus status) throws TransactionException { - SessionHolder.getRootSessionManager().onBranchStatusChange(this, branchSession, status); - for (SessionLifecycleListener lifecycleListener : lifecycleListeners) { - lifecycleListener.onBranchStatusChange(this, branchSession, status); - } - } - - @Override - public boolean isActive() { - return active; - } - - @Override - public void close() throws TransactionException { - if (active) { - SessionHolder.getRootSessionManager().onClose(this); - for (SessionLifecycleListener lifecycleListener : lifecycleListeners) { - lifecycleListener.onClose(this); - } - } - } - - @Override - public void end() throws TransactionException { - if (GlobalStatus.isTwoPhaseSuccess(status)) { - // TODO: Non AT mode does not need to be unlocked - // Clean locks first - clean(); - SessionHolder.getRootSessionManager().onSuccessEnd(this); - for (SessionLifecycleListener lifecycleListener : lifecycleListeners) { - lifecycleListener.onSuccessEnd(this); - } - } - else { - SessionHolder.getRootSessionManager().onFailEnd(this); - for (SessionLifecycleListener lifecycleListener : lifecycleListeners) { - lifecycleListener.onFailEnd(this); - } - } - } - - public void clean() throws TransactionException { - if (!LockerManagerFactory.getLockManager().releaseGlobalSessionLock(this)) { - throw new TransactionException("UnLock globalSession error, xid = " + this.xid); - } - } - - /** - * Close and clean. - * @throws TransactionException the transaction exception - */ - public void closeAndClean() throws TransactionException { - close(); - if (this.hasATBranch()) { - clean(); - } - } - - /** - * Add session lifecycle listener. - * @param sessionLifecycleListener the session lifecycle listener - */ - public void addSessionLifecycleListener(SessionLifecycleListener sessionLifecycleListener) { - lifecycleListeners.add(sessionLifecycleListener); - } - - /** - * Remove session lifecycle listener. - * @param sessionLifecycleListener the session lifecycle listener - */ - public void removeSessionLifecycleListener(SessionLifecycleListener sessionLifecycleListener) { - lifecycleListeners.remove(sessionLifecycleListener); - } - - @Override - public void addBranch(BranchSession branchSession) throws TransactionException { - SessionHolder.getRootSessionManager().onAddBranch(this, branchSession); - for (SessionLifecycleListener lifecycleListener : lifecycleListeners) { - lifecycleListener.onAddBranch(this, branchSession); - } - if (!RaftServerFactory.getInstance().isRaftMode()) { - add(branchSession); - } - } - - public void loadBranchs() { - if (branchSessions == null && isLazyLoadBranch()) { - synchronized (this) { - if (branchSessions == null && isLazyLoadBranch()) { - branchSessions = new ArrayList<>(); - Optional.ofNullable(SessionHolder.getRootSessionManager().findGlobalSession(xid, true)) - .ifPresent(globalSession -> branchSessions.addAll(globalSession.getBranchSessions())); - } - } - } - } - - @Override - public void unlockBranch(BranchSession branchSession) throws TransactionException { - // do not unlock if global status in (Committing, CommitRetrying, - // AsyncCommitting), - // because it's already unlocked in 'DefaultCore.commit()' - if (this.status != Committing && this.status != CommitRetrying && this.status != AsyncCommitting) { - if (!branchSession.unlock()) { - throw new TransactionException( - "Unlock branch lock failed, xid = " + this.xid + ", branchId = " + branchSession.getBranchId()); - } - } - } - - @Override - public void removeBranch(BranchSession branchSession) throws TransactionException { - SessionHolder.getRootSessionManager().onRemoveBranch(this, branchSession); - for (SessionLifecycleListener lifecycleListener : lifecycleListeners) { - lifecycleListener.onRemoveBranch(this, branchSession); - } - - if (!RaftServerFactory.getInstance().isRaftMode()) { - this.remove(branchSession); - } - - } - - @Override - public void removeAndUnlockBranch(BranchSession branchSession) throws TransactionException { - unlockBranch(branchSession); - removeBranch(branchSession); - } - - /** - * Gets branch. - * @param branchId the branch id - * @return the branch - */ - public BranchSession getBranch(long branchId) { - synchronized (this) { - List branchSessions = getBranchSessions(); - for (BranchSession branchSession : branchSessions) { - if (branchSession.getBranchId() == branchId) { - return branchSession; - } - } - - return null; - } - } - - /** - * Gets sorted branches. - * @return the sorted branches - */ - public List getSortedBranches() { - return new ArrayList<>(getBranchSessions()); - } - - /** - * Gets reverse sorted branches. - * @return the reverse sorted branches - */ - public List getReverseSortedBranches() { - List reversed = new ArrayList<>(getBranchSessions()); - Collections.reverse(reversed); - return reversed; - } - - /** - * Instantiates a new Global session. - */ - public GlobalSession() { - this.lazyLoadBranch = false; - } - - /** - * Instantiates a new Global session. - * @param applicationId the application id - * @param transactionServiceGroup the transaction service group - * @param transactionName the transaction name - * @param timeout the timeout - * @param lazyLoadBranch the lazy load branch - */ - public GlobalSession(String applicationId, String transactionServiceGroup, String transactionName, int timeout, - boolean lazyLoadBranch) { - this.transactionId = UUIDGenerator.generateUUID(); - this.status = GlobalStatus.Begin; - this.lazyLoadBranch = lazyLoadBranch; - if (!lazyLoadBranch) { - this.branchSessions = new ArrayList<>(); - } - this.applicationId = applicationId; - this.transactionServiceGroup = transactionServiceGroup; - this.transactionName = transactionName; - this.timeout = timeout; - this.xid = XID.generateXID(transactionId); - } - - /** - * Instantiates a new Global session. - * @param applicationId the application id - * @param transactionServiceGroup the transaction service group - * @param transactionName the transaction name - * @param timeout the timeout - */ - public GlobalSession(String applicationId, String transactionServiceGroup, String transactionName, int timeout) { - this(applicationId, transactionServiceGroup, transactionName, timeout, false); - } - - /** - * Gets transaction id. - * @return the transaction id - */ - public long getTransactionId() { - return transactionId; - } - - /** - * Sets transaction id. - * @param transactionId the transaction id - */ - public void setTransactionId(long transactionId) { - this.transactionId = transactionId; - } - - /** - * Gets status. - * @return the status - */ - public GlobalStatus getStatus() { - return status; - } - - /** - * Sets status. - * @param status the status - */ - public void setStatus(GlobalStatus status) { - this.status = status; - } - - /** - * Gets xid. - * @return the xid - */ - public String getXid() { - return xid; - } - - /** - * Sets xid. - * @param xid the xid - */ - public void setXid(String xid) { - this.xid = xid; - } - - /** - * Gets application id. - * @return the application id - */ - public String getApplicationId() { - return applicationId; - } - - /** - * Gets transaction service group. - * @return the transaction service group - */ - public String getTransactionServiceGroup() { - return transactionServiceGroup; - } - - /** - * Gets transaction name. - * @return the transaction name - */ - public String getTransactionName() { - return transactionName; - } - - /** - * Gets timeout. - * @return the timeout - */ - public int getTimeout() { - return timeout; - } - - /** - * Gets begin time. - * @return the begin time - */ - public long getBeginTime() { - return beginTime; - } - - /** - * Sets begin time. - * @param beginTime the begin time - */ - public void setBeginTime(long beginTime) { - this.beginTime = beginTime; - } - - /** - * Gets application data. - * @return the application data - */ - public String getApplicationData() { - return applicationData; - } - - /** - * Sets application data. - * @param applicationData the application data - */ - public void setApplicationData(String applicationData) { - this.applicationData = applicationData; - } - - public boolean isLazyLoadBranch() { - return lazyLoadBranch; - } - - /** - * Create global session global session. - * @param applicationId the application id - * @param txServiceGroup the tx service group - * @param txName the tx name - * @param timeout the timeout - * @return the global session - */ - public static GlobalSession createGlobalSession(String applicationId, String txServiceGroup, String txName, - int timeout) { - GlobalSession session = new GlobalSession(applicationId, txServiceGroup, txName, timeout, false); - return session; - } - - /** - * Sets active. - * @param active the active - */ - public void setActive(boolean active) { - this.active = active; - } - - @Override - public byte[] encode() { - byte[] byApplicationIdBytes = applicationId != null ? applicationId.getBytes() : null; - - byte[] byServiceGroupBytes = transactionServiceGroup != null ? transactionServiceGroup.getBytes() : null; - - byte[] byTxNameBytes = transactionName != null ? transactionName.getBytes() : null; - - byte[] xidBytes = xid != null ? xid.getBytes() : null; - - byte[] applicationDataBytes = applicationData != null ? applicationData.getBytes() : null; - - int size = calGlobalSessionSize(byApplicationIdBytes, byServiceGroupBytes, byTxNameBytes, xidBytes, - applicationDataBytes); - - if (size > MAX_GLOBAL_SESSION_SIZE) { - throw new RuntimeException("global session size exceeded, size : " + size + " maxBranchSessionSize : " - + MAX_GLOBAL_SESSION_SIZE); - } - ByteBuffer byteBuffer = byteBufferThreadLocal.get(); - // recycle - byteBuffer.clear(); - - byteBuffer.putLong(transactionId); - byteBuffer.putInt(timeout); - if (byApplicationIdBytes != null) { - byteBuffer.putShort((short) byApplicationIdBytes.length); - byteBuffer.put(byApplicationIdBytes); - } - else { - byteBuffer.putShort((short) 0); - } - if (byServiceGroupBytes != null) { - byteBuffer.putShort((short) byServiceGroupBytes.length); - byteBuffer.put(byServiceGroupBytes); - } - else { - byteBuffer.putShort((short) 0); - } - if (byTxNameBytes != null) { - byteBuffer.putShort((short) byTxNameBytes.length); - byteBuffer.put(byTxNameBytes); - } - else { - byteBuffer.putShort((short) 0); - } - if (xidBytes != null) { - byteBuffer.putInt(xidBytes.length); - byteBuffer.put(xidBytes); - } - else { - byteBuffer.putInt(0); - } - if (applicationDataBytes != null) { - byteBuffer.putInt(applicationDataBytes.length); - byteBuffer.put(applicationDataBytes); - } - else { - byteBuffer.putInt(0); - } - byteBuffer.putLong(beginTime); - byteBuffer.put((byte) status.getCode()); - BufferUtils.flip(byteBuffer); - byte[] result = new byte[byteBuffer.limit()]; - byteBuffer.get(result); - return result; - } - - private int calGlobalSessionSize(byte[] byApplicationIdBytes, byte[] byServiceGroupBytes, byte[] byTxNameBytes, - byte[] xidBytes, byte[] applicationDataBytes) { - return 8 // transactionId - + 4 // timeout - + 2 // byApplicationIdBytes.length - + 2 // byServiceGroupBytes.length - + 2 // byTxNameBytes.length - + 4 // xidBytes.length - + 4 // applicationDataBytes.length - + 8 // beginTime - + 1 // statusCode - + (byApplicationIdBytes == null ? 0 : byApplicationIdBytes.length) - + (byServiceGroupBytes == null ? 0 : byServiceGroupBytes.length) - + (byTxNameBytes == null ? 0 : byTxNameBytes.length) + (xidBytes == null ? 0 : xidBytes.length) - + (applicationDataBytes == null ? 0 : applicationDataBytes.length); - } - - @Override - public void decode(byte[] a) { - this.branchSessions = new ArrayList<>(); - ByteBuffer byteBuffer = ByteBuffer.wrap(a); - this.transactionId = byteBuffer.getLong(); - this.timeout = byteBuffer.getInt(); - short applicationIdLen = byteBuffer.getShort(); - if (applicationIdLen > 0) { - byte[] byApplicationId = new byte[applicationIdLen]; - byteBuffer.get(byApplicationId); - this.applicationId = new String(byApplicationId); - } - short serviceGroupLen = byteBuffer.getShort(); - if (serviceGroupLen > 0) { - byte[] byServiceGroup = new byte[serviceGroupLen]; - byteBuffer.get(byServiceGroup); - this.transactionServiceGroup = new String(byServiceGroup); - } - short txNameLen = byteBuffer.getShort(); - if (txNameLen > 0) { - byte[] byTxName = new byte[txNameLen]; - byteBuffer.get(byTxName); - this.transactionName = new String(byTxName); - } - int xidLen = byteBuffer.getInt(); - if (xidLen > 0) { - byte[] xidBytes = new byte[xidLen]; - byteBuffer.get(xidBytes); - this.xid = new String(xidBytes); - } - int applicationDataLen = byteBuffer.getInt(); - if (applicationDataLen > 0) { - byte[] applicationDataLenBytes = new byte[applicationDataLen]; - byteBuffer.get(applicationDataLenBytes); - this.applicationData = new String(applicationDataLenBytes); - } - - this.beginTime = byteBuffer.getLong(); - this.status = GlobalStatus.get(byteBuffer.get()); - } - - /** - * Has branch boolean. - * @return the boolean - */ - public boolean hasBranch() { - return getBranchSessions().size() > 0; - } - - public void lock() throws TransactionException { - globalSessionLock.lock(); - } - - public void unlock() { - globalSessionLock.unlock(); - } - - public List getBranchSessions() { - loadBranchs(); - return branchSessions; - } - - public void asyncCommit() throws TransactionException { - changeGlobalStatus(GlobalStatus.AsyncCommitting); - } - - public void queueToRetryCommit() throws TransactionException { - changeGlobalStatus(GlobalStatus.CommitRetrying); - } - - public void queueToRetryRollback() throws TransactionException { - GlobalStatus currentStatus = this.getStatus(); - GlobalStatus newStatus; - if (SessionStatusValidator.isTimeoutGlobalStatus(currentStatus)) { - newStatus = GlobalStatus.TimeoutRollbackRetrying; - } - else { - newStatus = GlobalStatus.RollbackRetrying; - } - changeGlobalStatus(newStatus); - } - - public void setExpectedStatusFromCurrent() { - EXPECTED_STATUS_THREAD_LOCAL.set(this.status); - } - - public void cleanExpectedStatus() { - EXPECTED_STATUS_THREAD_LOCAL.remove(); - } - - public GlobalStatus getExpectedStatus() { - return EXPECTED_STATUS_THREAD_LOCAL.get(); - } - - @Override - public String toString() { - return "GlobalSession{" + "xid='" + xid + '\'' + ", transactionId=" + transactionId + ", status=" + status - + ", applicationId='" + applicationId + '\'' + ", transactionServiceGroup='" + transactionServiceGroup - + '\'' + ", transactionName='" + transactionName + '\'' + ", timeout=" + timeout + ", beginTime=" - + beginTime + ", applicationData='" + applicationData + '\'' + ", lazyLoadBranch=" + lazyLoadBranch - + ", active=" + active + ", branchSessions=" + branchSessions + ", globalSessionLock=" - + globalSessionLock + ", lifecycleListeners=" + lifecycleListeners + '}'; - } - - private static class GlobalSessionLock { - - private final Lock globalSessionLock = new ReentrantLock(); - - private static final int GLOBAL_SESSION_LOCK_TIME_OUT_MILLS = 2 * 1000; - - public void lock() throws TransactionException { - try { - if (globalSessionLock.tryLock(GLOBAL_SESSION_LOCK_TIME_OUT_MILLS, TimeUnit.MILLISECONDS)) { - return; - } - } - catch (InterruptedException e) { - LOGGER.error("Interrupted error", e); - } - throw new GlobalTransactionException(TransactionExceptionCode.FailedLockGlobalTranscation, - "Lock global session failed"); - } - - public void unlock() { - globalSessionLock.unlock(); - } - - } - - @FunctionalInterface - public interface LockRunnable { - - void run() throws TransactionException; - - } - - @FunctionalInterface - public interface LockCallable { - - V call() throws TransactionException; - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/GlobalSessionHandler.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/GlobalSessionHandler.java deleted file mode 100644 index f4c6f0f4ff..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/GlobalSessionHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import io.seata.core.exception.TransactionException; - -/** - * The Functional Interface Global session handler. - * - * @author wang.liang - * @since 1.5.0 - */ -@FunctionalInterface -public interface GlobalSessionHandler { - - /** - * Handle global session. - * @param globalSession the global session - * @throws TransactionException the transaction exception - */ - void handle(GlobalSession globalSession) throws TransactionException; - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/Lockable.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/Lockable.java deleted file mode 100644 index 71205a9e22..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/Lockable.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import io.seata.core.exception.TransactionException; - -/** - * The interface Lockable. - * - * @author sharajava - */ -public interface Lockable { - - /** - * Lock boolean. - * @return the boolean - * @throws TransactionException the transaction exception - */ - boolean lock() throws TransactionException; - - /** - * Unlock boolean. - * @return the boolean - * @throws TransactionException the transaction exception - */ - boolean unlock() throws TransactionException; - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/Reloadable.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/Reloadable.java deleted file mode 100644 index 74f87de197..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/Reloadable.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -/** - * Service contains states which can be reloaded. - * - * @author sharajava - */ -public interface Reloadable { - - /** - * Reload states. - */ - void reload(); - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionCondition.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionCondition.java deleted file mode 100644 index 289d94f09e..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionCondition.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import io.seata.core.model.GlobalStatus; - -/** - * The type Session condition. - * - * @author slievrly - */ -public class SessionCondition { - - private Long transactionId; - - private String xid; - - private GlobalStatus status; - - private GlobalStatus[] statuses; - - private Long overTimeAliveMills; - - private boolean lazyLoadBranch; - - /** - * Instantiates a new Session condition. - */ - public SessionCondition() { - } - - /** - * Instantiates a new Session condition. - * @param xid the xid - */ - public SessionCondition(String xid) { - this.xid = xid; - } - - /** - * Instantiates a new Session condition. - * @param status the status - */ - public SessionCondition(GlobalStatus status) { - this.status = status; - this.statuses = new GlobalStatus[] { status }; - } - - /** - * Instantiates a new Session condition. - * @param statuses the statuses - */ - public SessionCondition(GlobalStatus... statuses) { - this.statuses = statuses; - } - - /** - * Instantiates a new Session condition. - * @param overTimeAliveMills the over time alive mills - */ - public SessionCondition(long overTimeAliveMills) { - this.overTimeAliveMills = overTimeAliveMills; - } - - /** - * Gets status. - * @return the status - */ - public GlobalStatus getStatus() { - return status; - } - - /** - * Sets status. - * @param status the status - */ - public void setStatus(GlobalStatus status) { - this.status = status; - this.statuses = new GlobalStatus[] { status }; - } - - /** - * Gets over time alive mills. - * @return the over time alive mills - */ - public Long getOverTimeAliveMills() { - return overTimeAliveMills; - } - - /** - * Sets over time alive mills. - * @param overTimeAliveMills the over time alive mills - */ - public void setOverTimeAliveMills(Long overTimeAliveMills) { - this.overTimeAliveMills = overTimeAliveMills; - } - - public Long getTransactionId() { - return transactionId; - } - - public void setTransactionId(Long transactionId) { - this.transactionId = transactionId; - } - - public String getXid() { - return xid; - } - - public void setXid(String xid) { - this.xid = xid; - } - - public GlobalStatus[] getStatuses() { - return statuses; - } - - public void setStatuses(GlobalStatus... statuses) { - this.statuses = statuses; - } - - public boolean isLazyLoadBranch() { - return lazyLoadBranch; - } - - public void setLazyLoadBranch(boolean lazyLoadBranch) { - this.lazyLoadBranch = lazyLoadBranch; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionHelper.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionHelper.java deleted file mode 100644 index 1cfea617e6..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionHelper.java +++ /dev/null @@ -1,469 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import io.seata.common.ConfigurationKeys; -import io.seata.common.util.CollectionUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.core.context.RootContext; -import io.seata.core.exception.TransactionException; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.BranchType; -import io.seata.core.model.GlobalStatus; -import io.seata.metrics.IdConstants; -import io.seata.server.UUIDGenerator; -import io.seata.server.cluster.raft.context.SeataClusterContext; -import io.seata.server.coordinator.DefaultCoordinator; -import io.seata.server.metrics.MetricsPublisher; -import io.seata.server.store.StoreConfig; -import io.seata.server.store.StoreConfig.SessionMode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - -import static io.seata.common.DefaultValues.DEFAULT_ENABLE_BRANCH_ASYNC_REMOVE; -import static io.seata.common.DefaultValues.DEFAULT_SEATA_GROUP; - -/** - * The type Session helper. - * - * @author sharajava - */ -public final class SessionHelper { - - private static final Logger LOGGER = LoggerFactory.getLogger(SessionHelper.class); - - /** - * The constant CONFIG. - */ - private static final Configuration CONFIG = ConfigurationFactory.getInstance(); - - private static final Boolean ENABLE_BRANCH_ASYNC_REMOVE = CONFIG - .getBoolean(ConfigurationKeys.ENABLE_BRANCH_ASYNC_REMOVE, DEFAULT_ENABLE_BRANCH_ASYNC_REMOVE); - - private static final String GROUP = CONFIG.getConfig(ConfigurationKeys.SERVER_RAFT_GROUP, DEFAULT_SEATA_GROUP); - - /** - * The instance of DefaultCoordinator. - */ - private static final DefaultCoordinator COORDINATOR = DefaultCoordinator.getInstance(); - - /** - * delay handle session. - */ - private static final boolean DELAY_HANDLE_SESSION = !(Objects.equals(StoreConfig.getSessionMode(), SessionMode.FILE) - || Objects.equals(StoreConfig.getSessionMode(), SessionMode.RAFT)); - - private SessionHelper() { - } - - public static BranchSession newBranchByGlobal(GlobalSession globalSession, BranchType branchType, String resourceId, - String lockKeys, String clientId) { - return newBranchByGlobal(globalSession, branchType, resourceId, null, lockKeys, clientId); - } - - /** - * New branch by global branch session. - * @param globalSession the global session - * @param branchType the branch type - * @param resourceId the resource id - * @param lockKeys the lock keys - * @param clientId the client id - * @return the branch session - */ - public static BranchSession newBranchByGlobal(GlobalSession globalSession, BranchType branchType, String resourceId, - String applicationData, String lockKeys, String clientId) { - BranchSession branchSession = new BranchSession(branchType); - - branchSession.setXid(globalSession.getXid()); - branchSession.setTransactionId(globalSession.getTransactionId()); - branchSession.setBranchId(UUIDGenerator.generateUUID()); - branchSession.setResourceId(resourceId); - branchSession.setLockKey(lockKeys); - branchSession.setClientId(clientId); - branchSession.setApplicationData(applicationData); - branchSession.setStatus(BranchStatus.Registered); - - return branchSession; - } - - /** - * New branch. - * @param branchType the branch type - * @param xid Transaction id. - * @param branchId Branch id. - * @param resourceId Resource id. - * @param applicationData Application data bind with this branch. - * @return the branch session - */ - public static BranchSession newBranch(BranchType branchType, String xid, long branchId, String resourceId, - String applicationData) { - BranchSession branchSession = new BranchSession(); - branchSession.setXid(xid); - branchSession.setBranchId(branchId); - branchSession.setBranchType(branchType); - branchSession.setResourceId(resourceId); - branchSession.setApplicationData(applicationData); - return branchSession; - } - - /** - * End committed. - * @param globalSession the global session - * @param retryGlobal the retry global - * @throws TransactionException the transaction exception - */ - public static void endCommitted(GlobalSession globalSession, boolean retryGlobal) throws TransactionException { - if (retryGlobal || !DELAY_HANDLE_SESSION) { - long beginTime = System.currentTimeMillis(); - boolean retryBranch = globalSession.getStatus() == GlobalStatus.CommitRetrying; - if (!globalSession.getStatus().equals(GlobalStatus.Committed)) { - // TODO: If the globalSession status in the database is Committed, don't - // set status again - globalSession.changeGlobalStatus(GlobalStatus.Committed); - } - globalSession.end(); - if (!DELAY_HANDLE_SESSION) { - MetricsPublisher.postSessionDoneEvent(globalSession, retryGlobal, false); - } - MetricsPublisher.postSessionDoneEvent(globalSession, IdConstants.STATUS_VALUE_AFTER_COMMITTED_KEY, true, - beginTime, retryBranch); - } - else { - globalSession.setStatus(GlobalStatus.Committed); - if (globalSession.isSaga()) { - globalSession.end(); - } - MetricsPublisher.postSessionDoneEvent(globalSession, false, false); - } - } - - /** - * End commit failed. - * @param globalSession the global session - * @param retryGlobal the retry global - * @throws TransactionException the transaction exception - */ - public static void endCommitFailed(GlobalSession globalSession, boolean retryGlobal) throws TransactionException { - endCommitFailed(globalSession, retryGlobal, false); - } - - /** - * End commit failed. - * @param globalSession the global session - * @param retryGlobal the retry global - * @param isRetryTimeout is retry timeout - * @throws TransactionException the transaction exception - */ - public static void endCommitFailed(GlobalSession globalSession, boolean retryGlobal, boolean isRetryTimeout) - throws TransactionException { - if (isRetryTimeout) { - globalSession.changeGlobalStatus(GlobalStatus.CommitRetryTimeout); - } - else { - globalSession.changeGlobalStatus(GlobalStatus.CommitFailed); - } - LOGGER.error("The Global session {} has changed the status to {}, need to be handled it manually.", - globalSession.getXid(), globalSession.getStatus()); - - globalSession.end(); - MetricsPublisher.postSessionDoneEvent(globalSession, retryGlobal, false); - } - - /** - * End rollbacked. - * @param globalSession the global session - * @param retryGlobal the retry global - * @throws TransactionException the transaction exception - */ - public static void endRollbacked(GlobalSession globalSession, boolean retryGlobal) throws TransactionException { - if (retryGlobal || !DELAY_HANDLE_SESSION) { - long beginTime = System.currentTimeMillis(); - boolean timeoutDone = false; - GlobalStatus currentStatus = globalSession.getStatus(); - if (currentStatus == GlobalStatus.TimeoutRollbacking) { - MetricsPublisher.postSessionDoneEvent(globalSession, GlobalStatus.TimeoutRollbacked, false, false); - timeoutDone = true; - } - boolean retryBranch = currentStatus == GlobalStatus.TimeoutRollbackRetrying - || currentStatus == GlobalStatus.RollbackRetrying; - if (!currentStatus.equals(GlobalStatus.TimeoutRollbacked) - && SessionStatusValidator.isTimeoutGlobalStatus(currentStatus)) { - globalSession.changeGlobalStatus(GlobalStatus.TimeoutRollbacked); - } - else if (!globalSession.getStatus().equals(GlobalStatus.Rollbacked)) { - globalSession.changeGlobalStatus(GlobalStatus.Rollbacked); - } - globalSession.end(); - if (!DELAY_HANDLE_SESSION && !timeoutDone) { - MetricsPublisher.postSessionDoneEvent(globalSession, retryGlobal, false); - } - MetricsPublisher.postSessionDoneEvent(globalSession, IdConstants.STATUS_VALUE_AFTER_ROLLBACKED_KEY, true, - beginTime, retryBranch); - } - else { - if (globalSession.isSaga()) { - globalSession.setStatus(GlobalStatus.Rollbacked); - globalSession.end(); - } - MetricsPublisher.postSessionDoneEvent(globalSession, GlobalStatus.Rollbacked, false, false); - } - } - - /** - * End rollback failed. - * @param globalSession the global session - * @param retryGlobal the retry global - * @throws TransactionException the transaction exception - */ - public static void endRollbackFailed(GlobalSession globalSession, boolean retryGlobal) throws TransactionException { - endRollbackFailed(globalSession, retryGlobal, false); - } - - /** - * End rollback failed. - * @param globalSession the global session - * @param retryGlobal the retry global - * @param isRetryTimeout is retry timeout - * @throws TransactionException the transaction exception - */ - public static void endRollbackFailed(GlobalSession globalSession, boolean retryGlobal, boolean isRetryTimeout) - throws TransactionException { - GlobalStatus currentStatus = globalSession.getStatus(); - if (isRetryTimeout) { - globalSession.changeGlobalStatus(GlobalStatus.RollbackRetryTimeout); - } - else if (SessionStatusValidator.isTimeoutGlobalStatus(currentStatus)) { - globalSession.changeGlobalStatus(GlobalStatus.TimeoutRollbackFailed); - } - else { - globalSession.changeGlobalStatus(GlobalStatus.RollbackFailed); - } - LOGGER.error("The Global session {} has changed the status to {}, need to be handled it manually.", - globalSession.getXid(), globalSession.getStatus()); - globalSession.end(); - MetricsPublisher.postSessionDoneEvent(globalSession, retryGlobal, false); - } - - /** - * Parallel foreach global sessions. - * @param sessions the global sessions - * @param handler the handler - */ - public static void parallelForEach(Collection sessions, GlobalSessionHandler handler) { - forEach(sessions, handler, true); - } - - /** - * Single foreach global sessions. - * @param sessions the global sessions - * @param handler the handler - */ - public static void singleForEach(Collection sessions, GlobalSessionHandler handler) { - forEach(sessions, handler, false); - } - - /** - * Foreach global sessions. - * @param sessions the global sessions - * @param handler the handler - * @param parallel the parallel - */ - public static void forEach(Collection sessions, GlobalSessionHandler handler, boolean parallel) { - if (CollectionUtils.isEmpty(sessions)) { - return; - } - - Stream stream = StreamSupport.stream(sessions.spliterator(), parallel); - stream.forEach(globalSession -> { - SeataClusterContext.bindGroup(GROUP); - try { - MDC.put(RootContext.MDC_KEY_XID, globalSession.getXid()); - handler.handle(globalSession); - } - catch (Throwable th) { - LOGGER.error("handle global session failed: {}", globalSession.getXid(), th); - } - finally { - SeataClusterContext.unbindGroup(); - MDC.remove(RootContext.MDC_KEY_XID); - } - }); - } - - /** - * Foreach global sessions. - * @param sessions the global sessions - * @param handler the handler - */ - public static void forEach(Collection sessions, GlobalSessionHandler handler) { - forEach(sessions, handler, true); - } - - /** - * Foreach branch sessions. - * @param sessions the branch session - * @param handler the handler - */ - public static Boolean forEach(Collection sessions, BranchSessionHandler handler) - throws TransactionException { - return forEach(sessions, handler, false); - } - - /** - * Foreach branch sessions. - * @param sessions the branch session - * @param handler the handler - */ - public static Boolean forEach(Collection sessions, BranchSessionHandler handler, boolean parallel) - throws TransactionException { - if (CollectionUtils.isNotEmpty(sessions)) { - Boolean result; - if (parallel) { - Map> map = new HashMap<>(4); - for (BranchSession session : sessions) { - map.computeIfAbsent(session.getResourceId(), k -> new ArrayList<>()).add(session); - } - List> completableFutures = new ArrayList<>(map.size()); - map.forEach((k, v) -> completableFutures.add(CompletableFuture.supplyAsync(() -> { - try { - return SessionHelper.forEach(v, handler, false); - } - catch (TransactionException e) { - throw new RuntimeException(e); - } - }))); - try { - for (CompletableFuture completableFuture : completableFutures) { - result = completableFuture.get(); - if (result == null) { - continue; - } - return result; - } - } - catch (InterruptedException e) { - throw new TransactionException(e); - } - catch (ExecutionException e) { - Throwable throwable = e.getCause(); - if (throwable instanceof RuntimeException) { - Throwable cause = throwable.getCause(); - if (cause instanceof TransactionException) { - throw (TransactionException) cause; - } - } - throw new TransactionException(e); - } - } - else { - for (BranchSession branchSession : sessions) { - try { - MDC.put(RootContext.MDC_KEY_BRANCH_ID, String.valueOf(branchSession.getBranchId())); - result = handler.handle(branchSession); - if (result == null) { - continue; - } - return result; - } - finally { - MDC.remove(RootContext.MDC_KEY_BRANCH_ID); - } - } - } - } - return null; - } - - /** - * Single foreach branch sessions. - * @param sessions the branch session - * @param handler the handler - * @since 1.5.0 - */ - public static Boolean singleForEach(Collection sessions, BranchSessionHandler handler) - throws TransactionException { - return SessionHelper.forEach(sessions, handler, false); - } - - /** - * Parallel foreach branch sessions. - * @param sessions the branch session - * @param handler the handler - */ - public static Boolean parallelForEach(Collection sessions, BranchSessionHandler handler) - throws TransactionException { - return SessionHelper.forEach(sessions, handler, true); - } - - /** - * remove branchSession from globalSession. - * @param globalSession the globalSession - * @param branchSession the branchSession - * @param isAsync if asynchronous remove - */ - public static void removeBranch(GlobalSession globalSession, BranchSession branchSession, boolean isAsync) - throws TransactionException { - globalSession.unlockBranch(branchSession); - if (isEnableBranchRemoveAsync() && isAsync) { - COORDINATOR.doBranchRemoveAsync(globalSession, branchSession); - } - else { - globalSession.removeBranch(branchSession); - } - } - - /** - * remove branchSession from globalSession. - * @param globalSession the globalSession - * @param isAsync if asynchronous remove - */ - public static void removeAllBranch(GlobalSession globalSession, boolean isAsync) throws TransactionException { - List branchSessions = globalSession.getSortedBranches(); - if (branchSessions == null || branchSessions.isEmpty()) { - return; - } - boolean isAsyncRemove = isEnableBranchRemoveAsync() && isAsync; - for (BranchSession branchSession : branchSessions) { - if (isAsyncRemove) { - globalSession.unlockBranch(branchSession); - } - else { - globalSession.removeAndUnlockBranch(branchSession); - } - } - if (isAsyncRemove) { - COORDINATOR.doBranchRemoveAllAsync(globalSession); - } - } - - /** - * if true, enable delete the branch asynchronously. - * @return the boolean - */ - private static boolean isEnableBranchRemoveAsync() { - return Objects.equals(Boolean.TRUE, DELAY_HANDLE_SESSION) - && Objects.equals(Boolean.TRUE, ENABLE_BRANCH_ASYNC_REMOVE); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionHolder.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionHolder.java deleted file mode 100644 index 853a01dce3..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionHolder.java +++ /dev/null @@ -1,406 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import io.seata.common.ConfigurationKeys; -import io.seata.common.XID; -import io.seata.common.exception.ShouldNeverHappenException; -import io.seata.common.exception.StoreException; -import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.core.exception.TransactionException; -import io.seata.core.model.GlobalStatus; -import io.seata.core.model.LockStatus; -import io.seata.core.store.DistributedLockDO; -import io.seata.core.store.DistributedLocker; -import io.seata.server.cluster.raft.RaftServerFactory; -import io.seata.server.cluster.raft.context.SeataClusterContext; -import io.seata.server.lock.distributed.DistributedLockerFactory; -import io.seata.server.store.StoreConfig; -import io.seata.server.store.StoreConfig.SessionMode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.*; -import java.util.concurrent.CompletableFuture; - -import static io.seata.common.ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL; -import static io.seata.common.DefaultValues.*; -import static java.io.File.separator; - -/** - * The type Session holder. - * - * @author sharajava - */ -public class SessionHolder { - - private static final Logger LOGGER = LoggerFactory.getLogger(SessionHolder.class); - - /** - * The constant CONFIG. - */ - protected static final Configuration CONFIG = ConfigurationFactory.getInstance(); - - /** - * The constant ROOT_SESSION_MANAGER_NAME. - */ - public static final String ROOT_SESSION_MANAGER_NAME = "root.data"; - - /** - * The redis distributed lock expire time. - */ - private static long DISTRIBUTED_LOCK_EXPIRE_TIME = CONFIG.getLong(ConfigurationKeys.DISTRIBUTED_LOCK_EXPIRE_TIME, - DEFAULT_DISTRIBUTED_LOCK_EXPIRE_TIME); - - private static SessionManager ROOT_SESSION_MANAGER; - - private static volatile Map SESSION_MANAGER_MAP; - - private static DistributedLocker DISTRIBUTED_LOCKER; - - public static void init() { - init(null); - } - - /** - * Init. - * @param sessionMode the store mode: file, db, redis - * @throws IOException the io exception - */ - public static void init(SessionMode sessionMode) { - if (null == sessionMode) { - sessionMode = StoreConfig.getSessionMode(); - } - LOGGER.info("use session store mode: {}", sessionMode.getName()); - DISTRIBUTED_LOCKER = DistributedLockerFactory.getDistributedLocker(sessionMode.getName()); - if (SessionMode.DB.equals(sessionMode)) { - ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.DB.getName()); - reload(sessionMode); - } - else if (SessionMode.RAFT.equals(sessionMode) || SessionMode.FILE.equals(sessionMode)) { - RaftServerFactory.getInstance().init(); - if (CollectionUtils.isNotEmpty(RaftServerFactory.getInstance().getRaftServers())) { - sessionMode = SessionMode.RAFT; - } - if (SessionMode.RAFT.equals(sessionMode)) { - String group = CONFIG.getConfig(ConfigurationKeys.SERVER_RAFT_GROUP, DEFAULT_SEATA_GROUP); - ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.RAFT.getName(), - new Object[] { ROOT_SESSION_MANAGER_NAME }); - SESSION_MANAGER_MAP = new HashMap<>(); - SESSION_MANAGER_MAP.put(group, ROOT_SESSION_MANAGER); - RaftServerFactory.getInstance().start(); - } - else { - String sessionStorePath = CONFIG.getConfig(ConfigurationKeys.STORE_FILE_DIR, - DEFAULT_SESSION_STORE_FILE_DIR) + separator + System.getProperty(SERVER_SERVICE_PORT_CAMEL); - if (StringUtils.isBlank(sessionStorePath)) { - throw new StoreException("the {store.file.dir} is empty."); - } - ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.FILE.getName(), - new Object[] { ROOT_SESSION_MANAGER_NAME, sessionStorePath }); - reload(sessionMode); - } - } - else if (SessionMode.REDIS.equals(sessionMode)) { - ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.REDIS.getName()); - reload(sessionMode); - } - else { - // unknown store - throw new IllegalArgumentException("unknown store mode:" + sessionMode.getName()); - } - } - - /** - * Reload. - * @param sessionMode the mode of store - */ - protected static void reload(SessionMode sessionMode) { - if (sessionMode == SessionMode.FILE) { - ((Reloadable) ROOT_SESSION_MANAGER).reload(); - reload(ROOT_SESSION_MANAGER.allSessions(), sessionMode); - } - else { - reload(null, sessionMode); - } - } - - public static void reload(Collection allSessions, SessionMode storeMode) { - reload(allSessions, storeMode, true); - } - - public static void reload(Collection allSessions, SessionMode storeMode, boolean acquireLock) { - if ((SessionMode.FILE == storeMode || SessionMode.RAFT == storeMode) - && CollectionUtils.isNotEmpty(allSessions)) { - for (GlobalSession globalSession : allSessions) { - GlobalStatus globalStatus = globalSession.getStatus(); - switch (globalStatus) { - case TimeoutRollbacked: - case Rollbacked: - try { - SessionHelper.endRollbacked(globalSession, true); - } - catch (TransactionException e) { - LOGGER.error("Could not handle the global session, xid: {},error: {}", - globalSession.getXid(), e.getMessage()); - } - break; - case Committed: - try { - SessionHelper.endCommitted(globalSession, true); - } - catch (TransactionException e) { - LOGGER.error("Could not handle the global session, xid: {},error: {}", - globalSession.getXid(), e.getMessage()); - } - break; - case Finished: - case UnKnown: - case CommitFailed: - case RollbackFailed: - case TimeoutRollbackFailed: - removeInErrorState(globalSession); - break; - case AsyncCommitting: - case Committing: - case CommitRetrying: - if (Objects.equals(SessionMode.RAFT, storeMode)) { - // When a state change occurs, re-electing the leader may - // result in the lock not being unlocked yet - // so a COMMIT unlock operation needs to be performed at the - // time of re-election - try { - globalSession.clean(); - } - catch (TransactionException e) { - throw new RuntimeException(e); - } - } - break; - default: { - if (acquireLock) { - lockBranchSessions(globalSession.getSortedBranches()); - if (GlobalStatus.Rollbacking.equals(globalSession.getStatus()) - || GlobalStatus.TimeoutRollbacking.equals(globalSession.getStatus())) { - globalSession.getBranchSessions() - .parallelStream() - .forEach(branchSession -> branchSession.setLockStatus(LockStatus.Rollbacking)); - } - } - switch (globalStatus) { - case Rollbacking: - case RollbackRetrying: - case TimeoutRollbacking: - case TimeoutRollbackRetrying: - break; - case Begin: - if (Objects.equals(storeMode, SessionMode.RAFT)) { - try { - globalSession.changeGlobalStatus(GlobalStatus.RollbackRetrying); - LOGGER.info("change global status: {}, xid: {}", globalSession.getStatus(), - globalSession.getXid()); - } - catch (TransactionException e) { - LOGGER.error("change global status fail: {}", e.getMessage(), e); - } - } - else { - globalSession.setActive(true); - } - break; - default: - LOGGER.error("Could not handle the global session, xid: {}", globalSession.getXid()); - throw new ShouldNeverHappenException("NOT properly handled " + globalStatus); - } - break; - } - } - } - } - else { - // Redis, db and so on - CompletableFuture.runAsync(() -> { - SessionCondition searchCondition = new SessionCondition(GlobalStatus.UnKnown, GlobalStatus.Committed, - GlobalStatus.Rollbacked, GlobalStatus.TimeoutRollbacked, GlobalStatus.Finished); - searchCondition.setLazyLoadBranch(true); - - long now = System.currentTimeMillis(); - List errorStatusGlobalSessions = ROOT_SESSION_MANAGER - .findGlobalSessions(searchCondition); - while (!CollectionUtils.isEmpty(errorStatusGlobalSessions)) { - for (GlobalSession errorStatusGlobalSession : errorStatusGlobalSessions) { - if (errorStatusGlobalSession.getBeginTime() >= now) { - // Exit when the global transaction begin after the instance - // started - return; - } - - removeInErrorState(errorStatusGlobalSession); - } - - // Load the next part - errorStatusGlobalSessions = ROOT_SESSION_MANAGER.findGlobalSessions(searchCondition); - } - }); - } - } - - private static void removeInErrorState(GlobalSession globalSession) { - try { - LOGGER.warn("The global session should NOT be {}, remove it. xid = {}", globalSession.getStatus(), - globalSession.getXid()); - getRootSessionManager().removeGlobalSession(globalSession); - if (LOGGER.isInfoEnabled()) { - LOGGER.info("Remove global session succeed, xid = {}, status = {}", globalSession.getXid(), - globalSession.getStatus()); - } - } - catch (Exception e) { - LOGGER.error("Remove global session failed, xid = {}, status = {}", globalSession.getXid(), - globalSession.getStatus(), e); - } - } - - private static void lockBranchSessions(List branchSessions) { - branchSessions.forEach(branchSession -> { - try { - branchSession.lock(); - } - catch (TransactionException e) { - throw new ShouldNeverHappenException(e); - } - }); - } - - // endregion - - // region get session manager - - /** - * Gets root session manager. - * @return the root session manager - */ - public static SessionManager getRootSessionManager() { - String group = SeataClusterContext.getGroup(); - return getRootSessionManager(group); - } - - public static SessionManager getRootSessionManager(String group) { - return StringUtils.isNotBlank(group) && SESSION_MANAGER_MAP != null - ? SESSION_MANAGER_MAP.computeIfAbsent(group, k -> ROOT_SESSION_MANAGER) : ROOT_SESSION_MANAGER; - } - - // endregion - - /** - * Find global session. - * @param xid the xid - * @return the global session - */ - public static GlobalSession findGlobalSession(String xid) { - return findGlobalSession(xid, true); - } - - /** - * Find global session. - * @param xid the xid - * @param withBranchSessions the withBranchSessions - * @return the global session - */ - public static GlobalSession findGlobalSession(String xid, boolean withBranchSessions) { - return getRootSessionManager().findGlobalSession(xid, withBranchSessions); - } - - /** - * lock and execute - * @param globalSession the global session - * @param lockCallable the lock Callable - * @return the value - */ - public static T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable lockCallable) - throws TransactionException { - return getRootSessionManager().lockAndExecute(globalSession, lockCallable); - } - - /** - * acquire lock - * @param lockKey the lock key, should be distinct for each lock - * @return the boolean - */ - public static boolean acquireDistributedLock(String lockKey) { - return DISTRIBUTED_LOCKER - .acquireLock(new DistributedLockDO(lockKey, XID.getIpAddressAndPort(), DISTRIBUTED_LOCK_EXPIRE_TIME)); - } - - /** - * release lock - * @return the boolean - */ - public static boolean releaseDistributedLock(String lockKey) { - return DISTRIBUTED_LOCKER - .releaseLock(new DistributedLockDO(lockKey, XID.getIpAddressAndPort(), DISTRIBUTED_LOCK_EXPIRE_TIME)); - } - - /** - * Execute the function after get the distribute lock - * @param key the distribute lock key - * @param func the function to be call - * @return whether the func be call - */ - public static boolean distributedLockAndExecute(String key, NoArgsFunc func) { - boolean lock = false; - try { - if (lock == acquireDistributedLock(key)) { - func.call(); - } - } - catch (Exception e) { - LOGGER.error("Exception running function with key = {}", key, e); - } - finally { - if (lock) { - try { - SessionHolder.releaseDistributedLock(key); - } - catch (Exception ex) { - LOGGER.warn("release distribute lock failure, message = {}", ex.getMessage(), ex); - } - } - } - return lock; - } - - public static void destroy() { - RaftServerFactory.getInstance().destroy(); - if (ROOT_SESSION_MANAGER != null) { - ROOT_SESSION_MANAGER.destroy(); - } - SESSION_MANAGER_MAP = null; - } - - @FunctionalInterface - public interface NoArgsFunc { - - void call(); - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionLifecycle.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionLifecycle.java deleted file mode 100644 index 9ab5ed9f55..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionLifecycle.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import io.seata.core.exception.TransactionException; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.GlobalStatus; - -/** - * The interface Session lifecycle. - * - * @author sharajava - */ -public interface SessionLifecycle { - - /** - * Begin. - * @throws TransactionException the transaction exception - */ - void begin() throws TransactionException; - - /** - * Change status. - * @param status the status - * @throws TransactionException the transaction exception - */ - void changeGlobalStatus(GlobalStatus status) throws TransactionException; - - /** - * Change branch status. - * @param branchSession the branch session - * @param status the status - * @throws TransactionException the transaction exception - */ - void changeBranchStatus(BranchSession branchSession, BranchStatus status) throws TransactionException; - - /** - * Add branch. - * @param branchSession the branch session - * @throws TransactionException the transaction exception - */ - void addBranch(BranchSession branchSession) throws TransactionException; - - /** - * Release the lock of branch. - * @param branchSession the branch session - * @throws TransactionException the transaction exception - */ - void unlockBranch(BranchSession branchSession) throws TransactionException; - - /** - * Remove branch. - * @param branchSession the branch session - * @throws TransactionException the transaction exception - */ - void removeBranch(BranchSession branchSession) throws TransactionException; - - /** - * Remove branch and release the lock of branch. - * @param branchSession the branchSession - * @throws TransactionException the TransactionException - */ - void removeAndUnlockBranch(BranchSession branchSession) throws TransactionException; - - /** - * Is active boolean. - * @return the boolean - */ - boolean isActive(); - - /** - * Close. - * @throws TransactionException the transaction exception - */ - void close() throws TransactionException; - - /** - * end. - * @throws TransactionException the transaction exception - */ - void end() throws TransactionException; - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionLifecycleListener.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionLifecycleListener.java deleted file mode 100644 index 5dd444c288..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionLifecycleListener.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import io.seata.core.exception.TransactionException; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.GlobalStatus; - -/** - * The interface Session lifecycle listener. - * - * @author sharajava - */ -public interface SessionLifecycleListener { - - /** - * On begin. - * @param globalSession the global session - * @throws TransactionException the transaction exception - */ - void onBegin(GlobalSession globalSession) throws TransactionException; - - /** - * On status change. - * @param globalSession the global session - * @param status the status - * @throws TransactionException the transaction exception - */ - void onStatusChange(GlobalSession globalSession, GlobalStatus status) throws TransactionException; - - /** - * On branch status change. - * @param globalSession the global session - * @param branchSession the branch session - * @param status the status - * @throws TransactionException the transaction exception - */ - void onBranchStatusChange(GlobalSession globalSession, BranchSession branchSession, BranchStatus status) - throws TransactionException; - - /** - * On add branch. - * @param globalSession the global session - * @param branchSession the branch session - * @throws TransactionException the transaction exception - */ - void onAddBranch(GlobalSession globalSession, BranchSession branchSession) throws TransactionException; - - /** - * On remove branch. - * @param globalSession the global session - * @param branchSession the branch session - * @throws TransactionException the transaction exception - */ - void onRemoveBranch(GlobalSession globalSession, BranchSession branchSession) throws TransactionException; - - /** - * On close. - * @param globalSession the global session - * @throws TransactionException the transaction exception - */ - void onClose(GlobalSession globalSession) throws TransactionException; - - /** - * On end. - * @param globalSession the global session - * @throws TransactionException the transaction exception - */ - void onSuccessEnd(GlobalSession globalSession) throws TransactionException; - - /** - * On fail end. - * @param globalSession the global session - * @throws TransactionException the transaction exception - */ - void onFailEnd(GlobalSession globalSession) throws TransactionException; - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionManager.java deleted file mode 100644 index 40785cabc5..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionManager.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import java.util.Collection; -import java.util.List; -import io.seata.core.exception.TransactionException; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.GlobalStatus; -import io.seata.core.rpc.Disposable; - -/** - * The interface Session manager. - * - * @author sharajava - */ -public interface SessionManager extends Disposable { - - /** - * Add global session. - * @param session the session - * @throws TransactionException the transaction exception - */ - void addGlobalSession(GlobalSession session) throws TransactionException; - - /** - * Find global session global session. - * @param xid the xid - * @return the global session - */ - GlobalSession findGlobalSession(String xid); - - /** - * Find global session global session. - * @param xid the xid - * @param withBranchSessions the withBranchSessions - * @return the global session - */ - GlobalSession findGlobalSession(String xid, boolean withBranchSessions); - - /** - * Update global session status. - * @param session the session - * @param status the status - * @throws TransactionException the transaction exception - */ - void updateGlobalSessionStatus(GlobalSession session, GlobalStatus status) throws TransactionException; - - /** - * Remove global session. - * @param session the session - * @throws TransactionException the transaction exception - */ - void removeGlobalSession(GlobalSession session) throws TransactionException; - - /** - * Add branch session. - * @param globalSession the global session - * @param session the session - * @throws TransactionException the transaction exception - */ - void addBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException; - - /** - * Update branch session status. - * @param session the session - * @param status the status - * @throws TransactionException the transaction exception - */ - void updateBranchSessionStatus(BranchSession session, BranchStatus status) throws TransactionException; - - /** - * Remove branch session. - * @param globalSession the global session - * @param session the session - * @throws TransactionException the transaction exception - */ - void removeBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException; - - /** - * All sessions collection. - * @return the collection - */ - Collection allSessions(); - - /** - * Find global sessions list. - * @param condition the condition - * @return the list - */ - List findGlobalSessions(SessionCondition condition); - - /** - * lock and execute - * @param globalSession the global session - * @param lockCallable the lock Callable - * @return the value - * @throws TransactionException the transaction exception - */ - @Deprecated - T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable lockCallable) - throws TransactionException; - - /** - * On begin. - * @param globalSession the global session - * @throws TransactionException the transaction exception - */ - @Deprecated - void onBegin(GlobalSession globalSession) throws TransactionException; - - /** - * On status change. - * @param globalSession the global session - * @param status the status - * @throws TransactionException the transaction exception - */ - @Deprecated - void onStatusChange(GlobalSession globalSession, GlobalStatus status) throws TransactionException; - - /** - * On branch status change. - * @param globalSession the global session - * @param branchSession the branch session - * @param status the status - * @throws TransactionException the transaction exception - */ - @Deprecated - void onBranchStatusChange(GlobalSession globalSession, BranchSession branchSession, BranchStatus status) - throws TransactionException; - - /** - * On add branch. - * @param globalSession the global session - * @param branchSession the branch session - * @throws TransactionException the transaction exception - */ - @Deprecated - void onAddBranch(GlobalSession globalSession, BranchSession branchSession) throws TransactionException; - - /** - * On remove branch. - * @param globalSession the global session - * @param branchSession the branch session - * @throws TransactionException the transaction exception - */ - @Deprecated - void onRemoveBranch(GlobalSession globalSession, BranchSession branchSession) throws TransactionException; - - /** - * On close. - * @param globalSession the global session - * @throws TransactionException the transaction exception - */ - @Deprecated - void onClose(GlobalSession globalSession) throws TransactionException; - - /** - * On end. - * @param globalSession the global session - * @throws TransactionException the transaction exception - */ - @Deprecated - void onSuccessEnd(GlobalSession globalSession) throws TransactionException; - - /** - * On fail end. - * @param globalSession the global session - * @throws TransactionException the transaction exception - */ - @Deprecated - void onFailEnd(GlobalSession globalSession) throws TransactionException; - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionStatusValidator.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionStatusValidator.java deleted file mode 100644 index 9601a6b59b..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/session/SessionStatusValidator.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.session; - -import io.seata.core.model.GlobalStatus; - -/** - * The type change status validator. - * - * @author Bughue - */ -public class SessionStatusValidator { - - /** - * is timeout global status - * @param status the global session - */ - public static boolean isTimeoutGlobalStatus(GlobalStatus status) { - return status == GlobalStatus.TimeoutRollbacked || status == GlobalStatus.TimeoutRollbackFailed - || status == GlobalStatus.TimeoutRollbacking || status == GlobalStatus.TimeoutRollbackRetrying; - } - - /** - * is rollback global status - * @param status the global session - */ - public static boolean isRollbackGlobalStatus(GlobalStatus status) { - return status == GlobalStatus.Rollbacking || status == GlobalStatus.RollbackRetrying - || status == GlobalStatus.Rollbacked || status == GlobalStatus.RollbackFailed - || status == GlobalStatus.RollbackRetryTimeout; - } - - /** - * is commit global status - * @param status the global session - */ - public static boolean isCommitGlobalStatus(GlobalStatus status) { - return status == GlobalStatus.Committing || status == GlobalStatus.AsyncCommitting - || status == GlobalStatus.CommitRetrying || status == GlobalStatus.Committed - || status == GlobalStatus.CommitFailed || status == GlobalStatus.CommitRetryTimeout; - } - - /** - * check the relation of before status and after status - * @param before the global session - * @param after the global session - */ - public static boolean validateUpdateStatus(GlobalStatus before, GlobalStatus after) { - if (isTimeoutGlobalStatus(before) && isCommitGlobalStatus(after)) { - return false; - } - if (isCommitGlobalStatus(before) && isTimeoutGlobalStatus(after)) { - return false; - } - if (isRollbackGlobalStatus(before) && isCommitGlobalStatus(after)) { - return false; - } - if (isCommitGlobalStatus(before) && isRollbackGlobalStatus(after)) { - return false; - } - return true; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/spring/listener/SeataPropertiesLoader.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/spring/listener/SeataPropertiesLoader.java deleted file mode 100644 index c435744b97..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/spring/listener/SeataPropertiesLoader.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.spring.listener; - -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.StringUtils; -import io.seata.config.ConfigurationFactory; -import io.seata.config.FileConfiguration; -import io.seata.config.file.FileConfig; -import io.seata.server.store.StoreConfig; -import org.springframework.context.ApplicationContextInitializer; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.PropertiesPropertySource; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Properties; - -import static io.seata.common.ConfigurationKeys.FILE_ROOT_PREFIX_CONFIG; -import static io.seata.common.ConfigurationKeys.FILE_ROOT_PREFIX_REGISTRY; -import static io.seata.common.ConfigurationKeys.METRICS_PREFIX; -import static io.seata.common.ConfigurationKeys.SEATA_FILE_PREFIX_ROOT_CONFIG; -import static io.seata.common.ConfigurationKeys.SERVER_PREFIX; -import static io.seata.common.ConfigurationKeys.STORE_PREFIX; -import static io.seata.common.ConfigurationKeys.TRANSPORT_PREFIX; - -@Order(Ordered.HIGHEST_PRECEDENCE) -public class SeataPropertiesLoader implements ApplicationContextInitializer { - - List prefixList = Arrays.asList(FILE_ROOT_PREFIX_CONFIG, FILE_ROOT_PREFIX_REGISTRY, SERVER_PREFIX, - STORE_PREFIX, METRICS_PREFIX, TRANSPORT_PREFIX); - - @Override - public void initialize(ConfigurableApplicationContext applicationContext) { - ConfigurableEnvironment environment = applicationContext.getEnvironment(); - FileConfiguration configuration = ConfigurationFactory.getOriginFileInstanceRegistry(); - FileConfig fileConfig = configuration.getFileConfig(); - Map configs = fileConfig.getAllConfig(); - if (CollectionUtils.isNotEmpty(configs)) { - Optional originFileInstance = ConfigurationFactory.getOriginFileInstance(); - originFileInstance - .ifPresent(fileConfiguration -> configs.putAll(fileConfiguration.getFileConfig().getAllConfig())); - Properties properties = new Properties(); - configs.forEach((k, v) -> { - if (v instanceof String) { - if (StringUtils.isEmpty((String) v)) { - return; - } - } - // Convert the configuration name to the configuration name under Spring - // Boot - if (prefixList.stream().anyMatch(k::startsWith)) { - properties.put(SEATA_FILE_PREFIX_ROOT_CONFIG + k, v); - } - }); - environment.getPropertySources().addLast(new PropertiesPropertySource("seataOldConfig", properties)); - } - // Load by priority - System.setProperty("sessionMode", StoreConfig.getSessionMode().getName()); - System.setProperty("lockMode", StoreConfig.getLockMode().getName()); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/spring/listener/ServerApplicationListener.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/spring/listener/ServerApplicationListener.java deleted file mode 100644 index bdb73b9507..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/spring/listener/ServerApplicationListener.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.spring.listener; - -import io.seata.common.holder.ObjectHolder; -import io.seata.common.util.StringUtils; -import io.seata.spring.boot.autoconfigure.SeataCoreEnvironmentPostProcessor; -import io.seata.spring.boot.autoconfigure.SeataServerEnvironmentPostProcessor; -import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; -import org.springframework.boot.context.logging.LoggingApplicationListener; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.event.GenericApplicationListener; -import org.springframework.core.ResolvableType; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.PropertiesPropertySource; - -import java.util.Properties; - -import static io.seata.common.Constants.OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT; -import static io.seata.common.DefaultValues.SERVICE_OFFSET_SPRING_BOOT; -import static io.seata.core.constants.ConfigurationKeys.*; - -/** - * @author slievrly - * @author funkye - */ -public class ServerApplicationListener implements GenericApplicationListener { - - @Override - public boolean supportsEventType(ResolvableType eventType) { - return eventType.getRawClass() != null - && ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(eventType.getRawClass()); - } - - @Override - public void onApplicationEvent(ApplicationEvent event) { - if (!(event instanceof ApplicationEnvironmentPreparedEvent environmentPreparedEvent)) { - return; - } - ConfigurableEnvironment environment = environmentPreparedEvent.getEnvironment(); - ObjectHolder.INSTANCE.setObject(OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT, environment); - SeataCoreEnvironmentPostProcessor.init(); - SeataServerEnvironmentPostProcessor.init(); - - String[] args = environmentPreparedEvent.getArgs(); - - // port: -p > -D > env > yml > default - - // -p 8091 - if (args != null && args.length >= 2) { - for (int i = 0; i < args.length; ++i) { - if ("-p".equalsIgnoreCase(args[i]) && i < args.length - 1) { - setTargetPort(environment, args[i + 1], true); - return; - } - } - } - - // -Dserver.servicePort=8091 - String dPort = environment.getProperty(SERVER_SERVICE_PORT_CAMEL, String.class); - if (StringUtils.isNotBlank(dPort)) { - setTargetPort(environment, dPort, true); - return; - } - - // docker -e SEATA_PORT=8091 - String envPort = environment.getProperty(ENV_SEATA_PORT_KEY, String.class); - if (StringUtils.isNotBlank(envPort)) { - setTargetPort(environment, envPort, true); - return; - } - - // yml properties server.service-port=8091 - String configPort = environment.getProperty(SERVER_SERVICE_PORT_CONFIG, String.class); - if (StringUtils.isNotBlank(configPort)) { - setTargetPort(environment, configPort, false); - return; - } - - // server.port=7091 - String serverPort = environment.getProperty("server.port", String.class); - if (StringUtils.isBlank(serverPort)) { - serverPort = "8080"; - } - String servicePort = String.valueOf(Integer.parseInt(serverPort) + SERVICE_OFFSET_SPRING_BOOT); - setTargetPort(environment, servicePort, true); - } - - private void setTargetPort(ConfigurableEnvironment environment, String port, boolean needAddPropertySource) { - // get rpc port first, use to logback-spring.xml, @see the class named - // `SystemPropertyLoggerContextListener` - System.setProperty(SERVER_SERVICE_PORT_CAMEL, port); - if (needAddPropertySource) { - // add property source to the first position - Properties pro = new Properties(); - pro.setProperty(SERVER_SERVICE_PORT_CONFIG, port); - environment.getPropertySources().addFirst(new PropertiesPropertySource("serverProperties", pro)); - } - } - - /** - * higher than LoggingApplicationListener. - * @return the order - */ - @Override - public int getOrder() { - return LoggingApplicationListener.DEFAULT_ORDER - 1; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/SessionConverter.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/SessionConverter.java deleted file mode 100644 index d1614e840e..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/SessionConverter.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage; - -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.StringUtils; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.BranchType; -import io.seata.core.model.GlobalStatus; -import io.seata.core.store.BranchTransactionDO; -import io.seata.core.store.GlobalTransactionDO; -import io.seata.server.cluster.raft.sync.msg.dto.BranchTransactionDTO; -import io.seata.server.console.vo.BranchSessionVO; -import io.seata.server.console.vo.GlobalSessionVO; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.store.SessionStorable; -import org.springframework.beans.BeanUtils; - -import java.util.*; - -/** - * The session converter. - * - * @author wangzhongxiang - * @author doubleDimple - */ -public class SessionConverter { - - public static GlobalSession convertGlobalSession(GlobalTransactionDO globalTransactionDO, boolean lazyLoadBranch) { - if (globalTransactionDO == null) { - return null; - } - GlobalSession session = new GlobalSession(globalTransactionDO.getApplicationId(), - globalTransactionDO.getTransactionServiceGroup(), globalTransactionDO.getTransactionName(), - globalTransactionDO.getTimeout(), lazyLoadBranch); - session.setXid(globalTransactionDO.getXid()); - session.setTransactionId(globalTransactionDO.getTransactionId()); - session.setStatus(GlobalStatus.get(globalTransactionDO.getStatus())); - session.setApplicationData(globalTransactionDO.getApplicationData()); - session.setBeginTime(globalTransactionDO.getBeginTime()); - return session; - } - - public static GlobalSession convertGlobalSession(GlobalTransactionDO globalTransactionDO) { - return convertGlobalSession(globalTransactionDO, false); - } - - public static BranchSession convertBranchSession(BranchTransactionDO branchTransactionDO) { - if (branchTransactionDO == null) { - return null; - } - BranchSession branchSession = new BranchSession(); - branchSession.setXid(branchTransactionDO.getXid()); - branchSession.setTransactionId(branchTransactionDO.getTransactionId()); - branchSession.setApplicationData(branchTransactionDO.getApplicationData()); - branchSession.setBranchId(branchTransactionDO.getBranchId()); - branchSession.setBranchType(BranchType.valueOf(branchTransactionDO.getBranchType())); - branchSession.setResourceId(branchTransactionDO.getResourceId()); - branchSession.setClientId(branchTransactionDO.getClientId()); - branchSession.setResourceGroupId(branchTransactionDO.getResourceGroupId()); - branchSession.setStatus(BranchStatus.get(branchTransactionDO.getStatus())); - if (branchTransactionDO instanceof BranchTransactionDTO) { - branchSession.setLockKey(((BranchTransactionDTO) branchTransactionDO).getLockKey()); - } - return branchSession; - } - - public static GlobalTransactionDO convertGlobalTransactionDO(SessionStorable session) { - GlobalTransactionDO globalTransactionDO = new GlobalTransactionDO(); - convertGlobalTransactionDO(globalTransactionDO, session); - return globalTransactionDO; - } - - public static void convertGlobalTransactionDO(GlobalTransactionDO globalTransactionDO, SessionStorable session) { - if (!(session instanceof GlobalSession)) { - throw new IllegalArgumentException("The parameter of SessionStorable is not available, SessionStorable:" - + StringUtils.toString(session)); - } - GlobalSession globalSession = (GlobalSession) session; - globalTransactionDO.setXid(globalSession.getXid()); - globalTransactionDO.setStatus(globalSession.getStatus().getCode()); - globalTransactionDO.setApplicationId(globalSession.getApplicationId()); - globalTransactionDO.setBeginTime(globalSession.getBeginTime()); - globalTransactionDO.setTimeout(globalSession.getTimeout()); - globalTransactionDO.setTransactionId(globalSession.getTransactionId()); - globalTransactionDO.setTransactionName(globalSession.getTransactionName()); - globalTransactionDO.setTransactionServiceGroup(globalSession.getTransactionServiceGroup()); - globalTransactionDO.setApplicationData(globalSession.getApplicationData()); - } - - public static BranchTransactionDO convertBranchTransactionDO(SessionStorable session) { - if (!(session instanceof BranchSession)) { - throw new IllegalArgumentException("The parameter of SessionStorable is not available, SessionStorable:" - + StringUtils.toString(session)); - } - BranchTransactionDO branchTransactionDO = new BranchTransactionDO(); - convertBranchTransaction(branchTransactionDO, session); - return branchTransactionDO; - } - - public static BranchTransactionDTO convertBranchTransactionDTO(SessionStorable session) { - if (!(session instanceof BranchSession)) { - throw new IllegalArgumentException("The parameter of SessionStorable is not available, SessionStorable:" - + StringUtils.toString(session)); - } - BranchTransactionDTO branchTransactionDTO = new BranchTransactionDTO(); - convertBranchTransaction(branchTransactionDTO, session); - return branchTransactionDTO; - } - - public static void convertBranchTransaction(BranchTransactionDO branchTransactionDO, SessionStorable session) { - BranchSession branchSession = (BranchSession) session; - branchTransactionDO.setXid(branchSession.getXid()); - branchTransactionDO.setBranchId(branchSession.getBranchId()); - branchTransactionDO.setBranchType(branchSession.getBranchType().name()); - branchTransactionDO.setClientId(branchSession.getClientId()); - branchTransactionDO.setResourceGroupId(branchSession.getResourceGroupId()); - branchTransactionDO.setTransactionId(branchSession.getTransactionId()); - branchTransactionDO.setApplicationData(branchSession.getApplicationData()); - branchTransactionDO.setResourceId(branchSession.getResourceId()); - branchTransactionDO.setStatus(branchSession.getStatus().getCode()); - if (branchTransactionDO instanceof BranchTransactionDTO) { - ((BranchTransactionDTO) branchTransactionDO).setLockKey(branchSession.getLockKey()); - } - } - - public static void convertToGlobalSessionVo(List result, List globalSessions) { - if (CollectionUtils.isNotEmpty(globalSessions)) { - for (GlobalSession globalSession : globalSessions) { - GlobalSessionVO globalSessionVO = new GlobalSessionVO(); - BeanUtils.copyProperties(globalSession, globalSessionVO); - globalSessionVO.setStatus(globalSession.getStatus().getCode()); - globalSessionVO.setTimeout(Long.valueOf(globalSession.getTimeout())); - globalSessionVO.setBranchSessionVOs(converToBranchSession(globalSession.getBranchSessions())); - result.add(globalSessionVO); - } - } - } - - public static Set converToBranchSession(List branchSessions) { - Set branchSessionVOs = new HashSet<>(branchSessions.size()); - if (CollectionUtils.isNotEmpty(branchSessions)) { - for (BranchSession branchSession : branchSessions) { - BranchSessionVO branchSessionVONew = new BranchSessionVO(); - BeanUtils.copyProperties(branchSession, branchSessionVONew); - - branchSessionVONew.setBranchType(branchSession.getBranchType().name()); - branchSessionVONew.setStatus(branchSession.getStatus().getCode()); - branchSessionVOs.add(branchSessionVONew); - } - } - return branchSessionVOs; - } - - /** - * convert GlobalSession to GlobalSessionVO. - * @param filteredSessions the GlobalSession list - * @return the GlobalSessionVO list - */ - public static List convertGlobalSession(List filteredSessions) { - - if (CollectionUtils.isEmpty(filteredSessions)) { - return Collections.emptyList(); - } - - final ArrayList result = new ArrayList<>(filteredSessions.size()); - - for (GlobalSession session : filteredSessions) { - result.add(new GlobalSessionVO(session.getXid(), session.getTransactionId(), session.getStatus().getCode(), - session.getApplicationId(), session.getTransactionServiceGroup(), session.getTransactionName(), - (long) session.getTimeout(), session.getBeginTime(), session.getApplicationData(), - convertBranchSession(session.getBranchSessions()))); - } - return result; - } - - /** - * convert BranchSession to BranchSessionVO. - * @param branchSessions the BranchSession list - * @return the BranchSessionVO list - */ - public static Set convertBranchSession(List branchSessions) { - - if (CollectionUtils.isEmpty(branchSessions)) { - return Collections.emptySet(); - } - - final Set result = new HashSet<>(branchSessions.size()); - - for (BranchSession session : branchSessions) { - result.add(new BranchSessionVO(session.getXid(), session.getTransactionId(), session.getBranchId(), - session.getResourceGroupId(), session.getResourceId(), session.getBranchType().name(), - session.getStatus().getCode(), session.getClientId(), session.getApplicationData())); - } - return result; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/lock/DataBaseDistributedLocker.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/lock/DataBaseDistributedLocker.java deleted file mode 100644 index 84cb402c4a..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/lock/DataBaseDistributedLocker.java +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.db.lock; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; - -import javax.sql.DataSource; - -import io.seata.common.exception.ShouldNeverHappenException; -import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.common.loader.LoadLevel; -import io.seata.common.loader.Scope; -import io.seata.common.util.IOUtil; -import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationCache; -import io.seata.config.ConfigurationChangeEvent; -import io.seata.config.ConfigurationChangeListener; -import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; -import io.seata.core.constants.ServerTableColumnsName; -import io.seata.core.store.DistributedLockDO; -import io.seata.core.store.DistributedLocker; -import io.seata.core.store.db.DataSourceProvider; -import io.seata.core.store.db.sql.distributed.lock.DistributedLockSqlFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static io.seata.core.constants.ConfigurationKeys.DISTRIBUTED_LOCK_DB_TABLE; - -/** - * @author chd - */ -@LoadLevel(name = "db", scope = Scope.SINGLETON) -public class DataBaseDistributedLocker implements DistributedLocker { - - private static final Logger LOGGER = LoggerFactory.getLogger(DataBaseDistributedLocker.class); - - private final String dbType; - - private final String datasourceType; - - private volatile String distributedLockTable; - - private DataSource distributedLockDataSource; - - private static final String LOCK_WAIT_TIMEOUT_MYSQL_MESSAGE = "try restarting transaction"; - - private static final int LOCK_WAIT_TIMEOUT_MYSQL_CODE = 1205; - - private static final Set IGNORE_MYSQL_CODE = new HashSet<>(); - - private static final Set IGNORE_MYSQL_MESSAGE = new HashSet<>(); - - static { - IGNORE_MYSQL_CODE.add(LOCK_WAIT_TIMEOUT_MYSQL_CODE); - IGNORE_MYSQL_MESSAGE.add(LOCK_WAIT_TIMEOUT_MYSQL_MESSAGE); - } - - /** - * whether the distribute lock demotion using for 1.5.0 only and will remove in 1.6.0 - */ - @Deprecated - private volatile boolean demotion; - - /** - * Instantiates a new Log store data base dao. - */ - public DataBaseDistributedLocker() { - Configuration configuration = ConfigurationFactory.getInstance(); - - distributedLockTable = configuration.getConfig(DISTRIBUTED_LOCK_DB_TABLE); - dbType = configuration.getConfig(ConfigurationKeys.STORE_DB_TYPE); - datasourceType = configuration.getConfig(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE); - - if (StringUtils.isBlank(distributedLockTable)) { - demotion = true; - ConfigurationCache.addConfigListener(DISTRIBUTED_LOCK_DB_TABLE, new ConfigurationChangeListener() { - @Override - public void onChangeEvent(ConfigurationChangeEvent event) { - String newValue = event.getNewValue(); - if (StringUtils.isNotBlank(newValue)) { - distributedLockTable = newValue; - init(); - demotion = false; - ConfigurationCache.removeConfigListener(DISTRIBUTED_LOCK_DB_TABLE, this); - } - } - }); - - LOGGER.error("The distribute lock table is not config, please create the target table and config it"); - return; - } - - init(); - } - - @Override - public boolean acquireLock(DistributedLockDO distributedLockDO) { - if (demotion) { - return true; - } - - Connection connection = null; - boolean originalAutoCommit = false; - try { - connection = distributedLockDataSource.getConnection(); - originalAutoCommit = connection.getAutoCommit(); - connection.setAutoCommit(false); - - DistributedLockDO lockFromDB = getDistributedLockDO(connection, distributedLockDO.getLockKey()); - if (null == lockFromDB) { - boolean ret = insertDistribute(connection, distributedLockDO); - connection.commit(); - return ret; - } - - if (lockFromDB.getExpireTime() >= System.currentTimeMillis()) { - LOGGER.debug("the distribute lock for key :{} is holding by :{}, acquire lock failure.", - distributedLockDO.getLockKey(), lockFromDB.getLockValue()); - connection.commit(); - return false; - } - - boolean ret = updateDistributedLock(connection, distributedLockDO); - connection.commit(); - - return ret; - } - catch (SQLException ex) { - // ignore "Lock wait timeout exceeded; try restarting transaction" - // TODO: need nowait adaptation - if (!ignoreSQLException(ex)) { - LOGGER.error("execute acquire lock failure, key is: {}", distributedLockDO.getLockKey(), ex); - } - try { - if (connection != null) { - connection.rollback(); - } - } - catch (SQLException e) { - LOGGER.warn("rollback fail because of {}", e.getMessage(), e); - } - return false; - } - finally { - try { - if (originalAutoCommit) { - connection.setAutoCommit(true); - } - IOUtil.close(connection); - } - catch (SQLException ignore) { - } - } - } - - @Override - public boolean releaseLock(DistributedLockDO distributedLockDO) { - if (demotion) { - return true; - } - - Connection connection = null; - boolean originalAutoCommit = false; - try { - connection = distributedLockDataSource.getConnection(); - originalAutoCommit = connection.getAutoCommit(); - connection.setAutoCommit(false); - - DistributedLockDO distributedLockDOFromDB = getDistributedLockDO(connection, - distributedLockDO.getLockKey()); - if (null == distributedLockDOFromDB) { - throw new ShouldNeverHappenException( - "distributedLockDO would not be null when release distribute lock"); - } - - if (distributedLockDOFromDB.getExpireTime() >= System.currentTimeMillis() - && !Objects.equals(distributedLockDOFromDB.getLockValue(), distributedLockDO.getLockValue())) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("the distribute lock for key :{} is holding by :{}, skip the release lock.", - distributedLockDO.getLockKey(), distributedLockDOFromDB.getLockValue()); - } - connection.commit(); - return true; - } - - distributedLockDO.setLockValue(StringUtils.SPACE); - distributedLockDO.setExpireTime(0L); - boolean ret = updateDistributedLock(connection, distributedLockDO); - - connection.commit(); - return ret; - } - catch (SQLException ex) { - if (!ignoreSQLException(ex)) { - LOGGER.error("execute release lock failure, key is: {}", distributedLockDO.getLockKey(), ex); - } - - try { - if (connection != null) { - connection.rollback(); - } - } - catch (SQLException e) { - LOGGER.warn("rollback fail because of {}", e.getMessage(), e); - } - return false; - } - finally { - try { - if (originalAutoCommit) { - connection.setAutoCommit(true); - } - IOUtil.close(connection); - } - catch (SQLException ignore) { - } - } - } - - protected DistributedLockDO getDistributedLockDO(Connection connection, String key) throws SQLException { - try (PreparedStatement pst = connection - .prepareStatement(DistributedLockSqlFactory.getDistributedLogStoreSql(dbType) - .getSelectDistributeForUpdateSql(distributedLockTable))) { - - pst.setString(1, key); - ResultSet resultSet = pst.executeQuery(); - - if (resultSet.next()) { - DistributedLockDO distributedLock = new DistributedLockDO(); - distributedLock.setExpireTime(resultSet.getLong(ServerTableColumnsName.DISTRIBUTED_LOCK_EXPIRE)); - distributedLock.setLockValue(resultSet.getString(ServerTableColumnsName.DISTRIBUTED_LOCK_VALUE)); - distributedLock.setLockKey(key); - return distributedLock; - } - return null; - } - } - - protected boolean insertDistribute(Connection connection, DistributedLockDO distributedLockDO) throws SQLException { - try (PreparedStatement insertPst = connection.prepareStatement( - DistributedLockSqlFactory.getDistributedLogStoreSql(dbType).getInsertSql(distributedLockTable))) { - insertPst.setString(1, distributedLockDO.getLockKey()); - insertPst.setString(2, distributedLockDO.getLockValue()); - if (distributedLockDO.getExpireTime() > 0) { - distributedLockDO.setExpireTime(distributedLockDO.getExpireTime() + System.currentTimeMillis()); - } - insertPst.setLong(3, distributedLockDO.getExpireTime()); - return insertPst.executeUpdate() > 0; - } - } - - protected boolean updateDistributedLock(Connection connection, DistributedLockDO distributedLockDO) - throws SQLException { - try (PreparedStatement updatePst = connection.prepareStatement( - DistributedLockSqlFactory.getDistributedLogStoreSql(dbType).getUpdateSql(distributedLockTable))) { - updatePst.setString(1, distributedLockDO.getLockValue()); - if (distributedLockDO.getExpireTime() > 0) { - distributedLockDO.setExpireTime(distributedLockDO.getExpireTime() + System.currentTimeMillis()); - } - updatePst.setLong(2, distributedLockDO.getExpireTime()); - updatePst.setString(3, distributedLockDO.getLockKey()); - return updatePst.executeUpdate() > 0; - } - } - - private void init() { - this.distributedLockDataSource = EnhancedServiceLoader.load(DataSourceProvider.class, datasourceType).provide(); - } - - private boolean ignoreSQLException(SQLException exception) { - if (IGNORE_MYSQL_CODE.contains(exception.getErrorCode())) { - return true; - } - if (StringUtils.isNotBlank(exception.getMessage())) { - return IGNORE_MYSQL_MESSAGE.stream().anyMatch(message -> exception.getMessage().contains(message)); - } - return false; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/lock/DataBaseLockManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/lock/DataBaseLockManager.java deleted file mode 100644 index 8b822a7796..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/lock/DataBaseLockManager.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.db.lock; - -import javax.sql.DataSource; -import io.seata.common.executor.Initialize; -import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.common.loader.LoadLevel; -import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; -import io.seata.core.exception.TransactionException; -import io.seata.core.lock.Locker; -import io.seata.core.store.db.DataSourceProvider; -import io.seata.server.lock.AbstractLockManager; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; - -/** - * The type db lock manager. - * - * @author zjinlei - */ -@LoadLevel(name = "db") -public class DataBaseLockManager extends AbstractLockManager implements Initialize { - - /** - * The locker. - */ - private Locker locker; - - @Override - public void init() { - // init dataSource - String datasourceType = ConfigurationFactory.getInstance() - .getConfig(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE); - DataSource lockStoreDataSource = EnhancedServiceLoader.load(DataSourceProvider.class, datasourceType).provide(); - locker = new DataBaseLocker(lockStoreDataSource); - } - - @Override - public boolean releaseLock(BranchSession branchSession) throws TransactionException { - try { - return getLocker().releaseLock(branchSession.getXid(), branchSession.getBranchId()); - } - catch (Exception t) { - LOGGER.error("unLock error, xid {}, branchId:{}", branchSession.getXid(), branchSession.getBranchId(), t); - return false; - } - } - - @Override - public Locker getLocker(BranchSession branchSession) { - return locker; - } - - @Override - public boolean releaseGlobalSessionLock(GlobalSession globalSession) throws TransactionException { - try { - return getLocker().releaseLock(globalSession.getXid()); - } - catch (Exception t) { - LOGGER.error("unLock globalSession error, xid:{}", globalSession.getXid(), t); - return false; - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/lock/DataBaseLocker.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/lock/DataBaseLocker.java deleted file mode 100644 index 8df4b0c350..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/lock/DataBaseLocker.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.db.lock; - -import java.util.List; -import javax.sql.DataSource; -import io.seata.common.exception.DataAccessException; -import io.seata.common.exception.StoreException; -import io.seata.common.util.CollectionUtils; -import io.seata.core.lock.AbstractLocker; -import io.seata.core.lock.RowLock; -import io.seata.core.model.LockStatus; -import io.seata.core.store.LockStore; - -/** - * The type Data base locker. - * - * @author zhangsen - */ -public class DataBaseLocker extends AbstractLocker { - - private LockStore lockStore; - - /** - * Instantiates a new Data base locker. - */ - public DataBaseLocker() { - } - - /** - * Instantiates a new Data base locker. - * @param logStoreDataSource the log store data source - */ - public DataBaseLocker(DataSource logStoreDataSource) { - lockStore = new LockStoreDataBaseDAO(logStoreDataSource); - } - - @Override - public boolean acquireLock(List locks) { - return acquireLock(locks, true, false); - } - - @Override - public boolean acquireLock(List locks, boolean autoCommit, boolean skipCheckLock) { - if (CollectionUtils.isEmpty(locks)) { - // no lock - return true; - } - try { - return lockStore.acquireLock(convertToLockDO(locks), autoCommit, skipCheckLock); - } - catch (StoreException e) { - throw e; - } - catch (Exception t) { - LOGGER.error("AcquireLock error, locks:{}", CollectionUtils.toString(locks), t); - return false; - } - } - - @Override - public boolean releaseLock(List locks) { - if (CollectionUtils.isEmpty(locks)) { - // no lock - return true; - } - try { - return lockStore.unLock(convertToLockDO(locks)); - } - catch (StoreException e) { - throw e; - } - catch (Exception t) { - LOGGER.error("unLock error, locks:{}", CollectionUtils.toString(locks), t); - return false; - } - } - - @Override - public boolean releaseLock(String xid, Long branchId) { - try { - return lockStore.unLock(branchId); - } - catch (StoreException e) { - throw e; - } - catch (Exception t) { - LOGGER.error("unLock by branchId error, xid {}, branchId:{}", xid, branchId, t); - return false; - } - } - - @Override - public boolean releaseLock(String xid) { - try { - return lockStore.unLock(xid); - } - catch (StoreException e) { - throw e; - } - catch (Exception t) { - LOGGER.error("unLock by branchIds error, xid {}", xid, t); - return false; - } - } - - @Override - public boolean isLockable(List locks) { - if (CollectionUtils.isEmpty(locks)) { - // no lock - return true; - } - try { - return lockStore.isLockable(convertToLockDO(locks)); - } - catch (DataAccessException e) { - throw e; - } - catch (Exception t) { - LOGGER.error("isLockable error, locks:{}", CollectionUtils.toString(locks), t); - return false; - } - } - - @Override - public void updateLockStatus(String xid, LockStatus lockStatus) { - lockStore.updateLockStatus(xid, lockStatus); - } - - /** - * Sets lock store. - * @param lockStore the lock store - */ - public void setLockStore(LockStore lockStore) { - this.lockStore = lockStore; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/lock/LockStoreDataBaseDAO.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/lock/LockStoreDataBaseDAO.java deleted file mode 100644 index c4085d5a78..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/lock/LockStoreDataBaseDAO.java +++ /dev/null @@ -1,464 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.db.lock; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.SQLIntegrityConstraintViolationException; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import javax.sql.DataSource; -import io.seata.common.exception.DataAccessException; -import io.seata.common.exception.StoreException; -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.IOUtil; -import io.seata.common.util.LambdaUtils; -import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; -import io.seata.core.constants.ServerTableColumnsName; -import io.seata.core.exception.BranchTransactionException; -import io.seata.core.model.LockStatus; -import io.seata.core.store.LockDO; -import io.seata.core.store.LockStore; -import io.seata.core.store.db.sql.lock.LockStoreSqlFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static io.seata.common.DefaultValues.DEFAULT_LOCK_DB_TABLE; -import static io.seata.core.exception.TransactionExceptionCode.LockKeyConflictFailFast; - -/** - * The type Data base lock store. - * - * @author zhangsen - */ -public class LockStoreDataBaseDAO implements LockStore { - - private static final Logger LOGGER = LoggerFactory.getLogger(LockStoreDataBaseDAO.class); - - /** - * The constant CONFIG. - */ - protected static final Configuration CONFIG = ConfigurationFactory.getInstance(); - - /** - * The Lock store data source. - */ - protected DataSource lockStoreDataSource; - - /** - * The Lock table. - */ - protected String lockTable; - - /** - * The Db type. - */ - protected String dbType; - - /** - * Instantiates a new Data base lock store dao. - * @param lockStoreDataSource the log store data source - */ - public LockStoreDataBaseDAO(DataSource lockStoreDataSource) { - this.lockStoreDataSource = lockStoreDataSource; - lockTable = CONFIG.getConfig(ConfigurationKeys.LOCK_DB_TABLE, DEFAULT_LOCK_DB_TABLE); - dbType = CONFIG.getConfig(ConfigurationKeys.STORE_DB_TYPE); - if (StringUtils.isBlank(dbType)) { - throw new StoreException("there must be db type."); - } - if (lockStoreDataSource == null) { - throw new StoreException("there must be lockStoreDataSource."); - } - } - - @Override - public boolean acquireLock(LockDO lockDO) { - return acquireLock(Collections.singletonList(lockDO)); - } - - @Override - public boolean acquireLock(List lockDOs) { - return acquireLock(lockDOs, true, false); - } - - @Override - public boolean acquireLock(List lockDOs, boolean autoCommit, boolean skipCheckLock) { - Connection conn = null; - PreparedStatement ps = null; - ResultSet rs = null; - Set dbExistedRowKeys = new HashSet<>(); - boolean originalAutoCommit = true; - if (lockDOs.size() > 1) { - lockDOs = lockDOs.stream() - .filter(LambdaUtils.distinctByKey(LockDO::getRowKey)) - .collect(Collectors.toList()); - } - try { - conn = lockStoreDataSource.getConnection(); - if (originalAutoCommit = conn.getAutoCommit()) { - conn.setAutoCommit(false); - } - List unrepeatedLockDOs = lockDOs; - - // check lock - if (!skipCheckLock) { - - boolean canLock = true; - // query - String checkLockSQL = LockStoreSqlFactory.getLogStoreSql(dbType) - .getCheckLockableSql(lockTable, lockDOs.size()); - ps = conn.prepareStatement(checkLockSQL); - for (int i = 0; i < lockDOs.size(); i++) { - ps.setString(i + 1, lockDOs.get(i).getRowKey()); - } - rs = ps.executeQuery(); - String currentXID = lockDOs.get(0).getXid(); - boolean failFast = false; - while (rs.next()) { - String dbXID = rs.getString(ServerTableColumnsName.LOCK_TABLE_XID); - if (!StringUtils.equals(dbXID, currentXID)) { - if (LOGGER.isInfoEnabled()) { - String dbPk = rs.getString(ServerTableColumnsName.LOCK_TABLE_PK); - String dbTableName = rs.getString(ServerTableColumnsName.LOCK_TABLE_TABLE_NAME); - long dbBranchId = rs.getLong(ServerTableColumnsName.LOCK_TABLE_BRANCH_ID); - LOGGER.info("Global lock on [{}:{}] is holding by xid {} branchId {}", dbTableName, dbPk, - dbXID, dbBranchId); - } - if (!autoCommit) { - int status = rs.getInt(ServerTableColumnsName.LOCK_TABLE_STATUS); - if (status == LockStatus.Rollbacking.getCode()) { - failFast = true; - } - } - canLock = false; - break; - } - - dbExistedRowKeys.add(rs.getString(ServerTableColumnsName.LOCK_TABLE_ROW_KEY)); - } - if (!canLock) { - conn.rollback(); - if (failFast) { - throw new StoreException(new BranchTransactionException(LockKeyConflictFailFast)); - } - return false; - } - // If the lock has been exists in db, remove it from the lockDOs - if (CollectionUtils.isNotEmpty(dbExistedRowKeys)) { - unrepeatedLockDOs = lockDOs.stream() - .filter(lockDO -> !dbExistedRowKeys.contains(lockDO.getRowKey())) - .collect(Collectors.toList()); - } - if (CollectionUtils.isEmpty(unrepeatedLockDOs)) { - conn.rollback(); - return true; - } - } - - // lock - if (unrepeatedLockDOs.size() == 1) { - LockDO lockDO = unrepeatedLockDOs.get(0); - if (!doAcquireLock(conn, lockDO)) { - if (LOGGER.isInfoEnabled()) { - LOGGER.info("Global lock acquire failed, xid {} branchId {} pk {}", lockDO.getXid(), - lockDO.getBranchId(), lockDO.getPk()); - } - conn.rollback(); - return false; - } - } - else { - if (!doAcquireLocks(conn, unrepeatedLockDOs)) { - if (LOGGER.isInfoEnabled()) { - LOGGER.info("Global lock batch acquire failed, xid {} branchId {} pks {}", - unrepeatedLockDOs.get(0).getXid(), unrepeatedLockDOs.get(0).getBranchId(), - unrepeatedLockDOs.stream().map(lockDO -> lockDO.getPk()).collect(Collectors.toList())); - } - conn.rollback(); - return false; - } - } - conn.commit(); - return true; - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(rs, ps); - if (conn != null) { - try { - if (originalAutoCommit) { - conn.setAutoCommit(true); - } - conn.close(); - } - catch (SQLException e) { - } - } - } - } - - @Override - public boolean unLock(LockDO lockDO) { - return unLock(Collections.singletonList(lockDO)); - } - - @Override - public boolean unLock(List lockDOs) { - Connection conn = null; - PreparedStatement ps = null; - try { - conn = lockStoreDataSource.getConnection(); - conn.setAutoCommit(true); - - // batch release lock - String batchDeleteSQL = LockStoreSqlFactory.getLogStoreSql(dbType) - .getBatchDeleteLockSql(lockTable, lockDOs.size()); - ps = conn.prepareStatement(batchDeleteSQL); - ps.setString(1, lockDOs.get(0).getXid()); - for (int i = 0; i < lockDOs.size(); i++) { - ps.setString(i + 2, lockDOs.get(i).getRowKey()); - } - ps.executeUpdate(); - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(ps, conn); - } - return true; - } - - @Override - public boolean unLock(String xid) { - Connection conn = null; - PreparedStatement ps = null; - try { - conn = lockStoreDataSource.getConnection(); - conn.setAutoCommit(true); - // batch release lock by branch list - String batchDeleteSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getBatchDeleteLockSqlByXid(lockTable); - ps = conn.prepareStatement(batchDeleteSQL); - ps.setString(1, xid); - ps.executeUpdate(); - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(ps, conn); - } - return true; - } - - @Override - public boolean unLock(Long branchId) { - Connection conn = null; - PreparedStatement ps = null; - try { - conn = lockStoreDataSource.getConnection(); - conn.setAutoCommit(true); - // batch release lock by branchId - String batchDeleteSQL = LockStoreSqlFactory.getLogStoreSql(dbType) - .getBatchDeleteLockSqlByBranchId(lockTable); - ps = conn.prepareStatement(batchDeleteSQL); - ps.setLong(1, branchId); - ps.executeUpdate(); - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(ps, conn); - } - return true; - } - - @Override - public boolean isLockable(List lockDOs) { - Connection conn = null; - try { - conn = lockStoreDataSource.getConnection(); - conn.setAutoCommit(true); - if (!checkLockable(conn, lockDOs)) { - return false; - } - return true; - } - catch (SQLException e) { - throw new DataAccessException(e); - } - finally { - IOUtil.close(conn); - } - } - - @Override - public void updateLockStatus(String xid, LockStatus lockStatus) { - String updateStatusLockByGlobalSql = LockStoreSqlFactory.getLogStoreSql(dbType) - .getBatchUpdateStatusLockByGlobalSql(lockTable); - try (Connection conn = lockStoreDataSource.getConnection(); - PreparedStatement ps = conn.prepareStatement(updateStatusLockByGlobalSql)) { - conn.setAutoCommit(true); - ps.setInt(1, lockStatus.getCode()); - ps.setString(2, xid); - ps.executeUpdate(); - } - catch (SQLException e) { - throw new DataAccessException(e); - } - } - - /** - * Do acquire lock boolean. - * @param conn the conn - * @param lockDO the lock do - * @return the boolean - */ - protected boolean doAcquireLock(Connection conn, LockDO lockDO) { - PreparedStatement ps = null; - try { - // insert - String insertLockSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getInsertLockSQL(lockTable); - ps = conn.prepareStatement(insertLockSQL); - ps.setString(1, lockDO.getXid()); - ps.setLong(2, lockDO.getTransactionId()); - ps.setLong(3, lockDO.getBranchId()); - ps.setString(4, lockDO.getResourceId()); - ps.setString(5, lockDO.getTableName()); - ps.setString(6, lockDO.getPk()); - ps.setString(7, lockDO.getRowKey()); - ps.setInt(8, LockStatus.Locked.getCode()); - return ps.executeUpdate() > 0; - } - catch (SQLException e) { - if (e instanceof SQLIntegrityConstraintViolationException) { - return false; - } - throw new StoreException(e); - } - finally { - IOUtil.close(ps); - } - } - - /** - * Do acquire lock boolean. - * @param conn the conn - * @param lockDOs the lock do list - * @return the boolean - */ - protected boolean doAcquireLocks(Connection conn, List lockDOs) throws SQLException { - PreparedStatement ps = null; - try { - // insert - String insertLockSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getInsertLockSQL(lockTable); - ps = conn.prepareStatement(insertLockSQL); - for (LockDO lockDO : lockDOs) { - ps.setString(1, lockDO.getXid()); - ps.setLong(2, lockDO.getTransactionId()); - ps.setLong(3, lockDO.getBranchId()); - ps.setString(4, lockDO.getResourceId()); - ps.setString(5, lockDO.getTableName()); - ps.setString(6, lockDO.getPk()); - ps.setString(7, lockDO.getRowKey()); - ps.setInt(8, lockDO.getStatus()); - ps.addBatch(); - } - return ps.executeBatch().length == lockDOs.size(); - } - catch (SQLIntegrityConstraintViolationException e) { - LOGGER.error("Global lock batch acquire error: {}", e.getMessage(), e); - // return false,let the caller go to conn.rollabck() - return false; - } - catch (SQLException e) { - throw e; - } - finally { - IOUtil.close(ps); - } - } - - /** - * Check lock boolean. - * @param conn the conn - * @param lockDOs the lock do - * @return the boolean - */ - protected boolean checkLockable(Connection conn, List lockDOs) { - PreparedStatement ps = null; - ResultSet rs = null; - try { - // query - String checkLockSQL = LockStoreSqlFactory.getLogStoreSql(dbType) - .getCheckLockableSql(lockTable, lockDOs.size()); - ps = conn.prepareStatement(checkLockSQL); - for (int i = 0; i < lockDOs.size(); i++) { - ps.setString(i + 1, lockDOs.get(i).getRowKey()); - } - rs = ps.executeQuery(); - while (rs.next()) { - String xid = rs.getString("xid"); - if (!StringUtils.equals(xid, lockDOs.get(0).getXid())) { - return false; - } - } - return true; - } - catch (SQLException e) { - throw new DataAccessException(e); - } - finally { - IOUtil.close(rs, ps); - } - } - - /** - * Sets lock table. - * @param lockTable the lock table - */ - public void setLockTable(String lockTable) { - this.lockTable = lockTable; - } - - /** - * Sets db type. - * @param dbType the db type - */ - public void setDbType(String dbType) { - this.dbType = dbType; - } - - /** - * Sets log store data source. - * @param lockStoreDataSource the log store data source - */ - public void setLogStoreDataSource(DataSource lockStoreDataSource) { - this.lockStoreDataSource = lockStoreDataSource; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/session/DataBaseSessionManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/session/DataBaseSessionManager.java deleted file mode 100644 index fc6a912eb0..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/session/DataBaseSessionManager.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.db.session; - -import java.util.Collection; -import java.util.List; -import io.seata.common.exception.StoreException; -import io.seata.common.executor.Initialize; -import io.seata.common.loader.LoadLevel; -import io.seata.common.loader.Scope; -import io.seata.core.exception.TransactionException; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.GlobalStatus; -import io.seata.server.session.AbstractSessionManager; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionCondition; -import io.seata.server.storage.db.store.DataBaseTransactionStoreManager; -import io.seata.server.store.TransactionStoreManager.LogOperation; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * The Data base session manager. - * - * @author zhangsen - */ -@LoadLevel(name = "db", scope = Scope.PROTOTYPE) -public class DataBaseSessionManager extends AbstractSessionManager implements Initialize { - - /** - * The constant LOGGER. - */ - protected static final Logger LOGGER = LoggerFactory.getLogger(DataBaseSessionManager.class); - - /** - * Instantiates a new Data base session manager. - */ - public DataBaseSessionManager() { - super(); - } - - @Override - public void init() { - transactionStoreManager = DataBaseTransactionStoreManager.getInstance(); - } - - @Override - public void addGlobalSession(GlobalSession session) throws TransactionException { - boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_ADD, session); - if (!ret) { - throw new StoreException("addGlobalSession failed."); - } - - } - - @Override - public void updateGlobalSessionStatus(GlobalSession session, GlobalStatus status) throws TransactionException { - try { - // set expected status threadlocal - session.setExpectedStatusFromCurrent(); - session.setStatus(status); - boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_UPDATE, session); - if (!ret) { - throw new StoreException("updateGlobalSessionStatus failed."); - } - } - finally { - // remove expected status threadlocal - session.cleanExpectedStatus(); - } - } - - /** - * remove globalSession 1. rootSessionManager remove normal globalSession 2. - * retryCommitSessionManager and retryRollbackSessionManager remove retry expired - * globalSession - * @param session the session - * @throws TransactionException the transaction exception - */ - @Override - public void removeGlobalSession(GlobalSession session) throws TransactionException { - boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_REMOVE, session); - if (!ret) { - throw new StoreException("removeGlobalSession failed."); - } - } - - @Override - public void addBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException { - boolean ret = transactionStoreManager.writeSession(LogOperation.BRANCH_ADD, session); - if (!ret) { - throw new StoreException("addBranchSession failed."); - } - } - - @Override - public void updateBranchSessionStatus(BranchSession session, BranchStatus status) throws TransactionException { - boolean ret = transactionStoreManager.writeSession(LogOperation.BRANCH_UPDATE, session); - if (!ret) { - throw new StoreException("updateBranchSessionStatus failed."); - } - } - - @Override - public void removeBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException { - boolean ret = transactionStoreManager.writeSession(LogOperation.BRANCH_REMOVE, session); - if (!ret) { - throw new StoreException("removeBranchSession failed."); - } - } - - @Override - public GlobalSession findGlobalSession(String xid) { - return this.findGlobalSession(xid, true); - } - - @Override - public GlobalSession findGlobalSession(String xid, boolean withBranchSessions) { - return transactionStoreManager.readSession(xid, withBranchSessions); - } - - @Override - public Collection allSessions() { - // all data - return findGlobalSessions(new SessionCondition(GlobalStatus.UnKnown, GlobalStatus.Begin, - GlobalStatus.Committing, GlobalStatus.CommitRetrying, GlobalStatus.Rollbacking, - GlobalStatus.RollbackRetrying, GlobalStatus.TimeoutRollbacking, GlobalStatus.TimeoutRollbackRetrying, - GlobalStatus.AsyncCommitting)); - } - - @Override - public List findGlobalSessions(SessionCondition condition) { - // nothing need to do - return transactionStoreManager.readSession(condition); - } - - @Override - public T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable lockCallable) - throws TransactionException { - return lockCallable.call(); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/store/DataBaseTransactionStoreManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/store/DataBaseTransactionStoreManager.java deleted file mode 100644 index 97d4e5d93e..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/store/DataBaseTransactionStoreManager.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.db.store; - -import io.seata.common.exception.StoreException; -import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; -import io.seata.core.model.GlobalStatus; -import io.seata.core.store.BranchTransactionDO; -import io.seata.core.store.GlobalTransactionDO; -import io.seata.core.store.LogStore; -import io.seata.core.store.db.DataSourceProvider; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionCondition; -import io.seata.server.storage.SessionConverter; -import io.seata.server.store.AbstractTransactionStoreManager; -import io.seata.server.store.SessionStorable; -import io.seata.server.store.TransactionStoreManager; -import lombok.Setter; - -import javax.sql.DataSource; -import java.util.*; -import java.util.stream.Collectors; - -import static io.seata.common.DefaultValues.DEFAULT_QUERY_LIMIT; - -/** - * The type Database transaction store manager. - * - * @author zhangsen - */ -@Setter -public class DataBaseTransactionStoreManager extends AbstractTransactionStoreManager - implements TransactionStoreManager { - - /** - * The constant CONFIG. - */ - protected static final Configuration CONFIG = ConfigurationFactory.getInstance(); - - private static volatile DataBaseTransactionStoreManager instance; - - /** - * The Log store. -- SETTER -- Sets log store. - * @param logStore the log store - */ - protected LogStore logStore; - - /** - * The Log query limit. -- SETTER -- Sets log query limit. - * @param logQueryLimit the log query limit - */ - protected int logQueryLimit; - - /** - * Instantiates a new Database transaction store manager. - */ - private DataBaseTransactionStoreManager() { - logQueryLimit = CONFIG.getInt(ConfigurationKeys.STORE_DB_LOG_QUERY_LIMIT, DEFAULT_QUERY_LIMIT); - String datasourceType = CONFIG.getConfig(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE); - // init dataSource - DataSource logStoreDataSource = EnhancedServiceLoader.load(DataSourceProvider.class, datasourceType).provide(); - logStore = new LogStoreDataBaseDAO(logStoreDataSource); - } - - /** - * Get the instance. - */ - public static DataBaseTransactionStoreManager getInstance() { - if (instance == null) { - synchronized (DataBaseTransactionStoreManager.class) { - if (instance == null) { - instance = new DataBaseTransactionStoreManager(); - } - } - } - return instance; - } - - @Override - public boolean writeSession(LogOperation logOperation, SessionStorable session) { - if (LogOperation.GLOBAL_ADD.equals(logOperation)) { - return logStore.insertGlobalTransactionDO(SessionConverter.convertGlobalTransactionDO(session)); - } - else if (LogOperation.GLOBAL_UPDATE.equals(logOperation)) { - GlobalSession globalSession = (GlobalSession) session; - if (globalSession.getExpectedStatus() != null) { - return logStore.updateGlobalTransactionDO(SessionConverter.convertGlobalTransactionDO(session), - globalSession.getExpectedStatus().getCode()); - } - else { - return logStore.updateGlobalTransactionDO(SessionConverter.convertGlobalTransactionDO(session)); - } - } - else if (LogOperation.GLOBAL_REMOVE.equals(logOperation)) { - return logStore.deleteGlobalTransactionDO(SessionConverter.convertGlobalTransactionDO(session)); - } - else if (LogOperation.BRANCH_ADD.equals(logOperation)) { - return logStore.insertBranchTransactionDO(SessionConverter.convertBranchTransactionDO(session)); - } - else if (LogOperation.BRANCH_UPDATE.equals(logOperation)) { - return logStore.updateBranchTransactionDO(SessionConverter.convertBranchTransactionDO(session)); - } - else if (LogOperation.BRANCH_REMOVE.equals(logOperation)) { - return logStore.deleteBranchTransactionDO(SessionConverter.convertBranchTransactionDO(session)); - } - else { - throw new StoreException("Unknown LogOperation:" + logOperation.name()); - } - } - - /** - * Read session global session. - * @param transactionId the transaction id - * @return the global session - */ - public GlobalSession readSession(Long transactionId) { - // global transaction - GlobalTransactionDO globalTransactionDO = logStore.queryGlobalTransactionDO(transactionId); - if (globalTransactionDO == null) { - return null; - } - // branch transactions - List branchTransactionDOs = logStore - .queryBranchTransactionDO(globalTransactionDO.getXid()); - return getGlobalSession(globalTransactionDO, branchTransactionDOs); - } - - /** - * Read session global session. - * @param xid the xid - * @return the global session - */ - @Override - public GlobalSession readSession(String xid) { - return this.readSession(xid, true); - } - - /** - * Read session global session. - * @param xid the xid - * @param withBranchSessions the withBranchSessions - * @return the global session - */ - @Override - public GlobalSession readSession(String xid, boolean withBranchSessions) { - // global transaction - GlobalTransactionDO globalTransactionDO = logStore.queryGlobalTransactionDO(xid); - if (globalTransactionDO == null) { - return null; - } - // branch transactions - List branchTransactionDOs = null; - // reduce rpc with db when branchRegister and getGlobalStatus - if (withBranchSessions) { - branchTransactionDOs = logStore.queryBranchTransactionDO(globalTransactionDO.getXid()); - } - return getGlobalSession(globalTransactionDO, branchTransactionDOs); - } - - @Override - public List readSortByTimeoutBeginSessions(boolean withBranchSessions) { - return readSession(new GlobalStatus[] { GlobalStatus.Begin }, withBranchSessions); - } - - /** - * Read session list. - * @param statuses the statuses - * @return the list - */ - @Override - public List readSession(GlobalStatus[] statuses, boolean withBranchSessions) { - int[] states = new int[statuses.length]; - for (int i = 0; i < statuses.length; i++) { - states[i] = statuses[i].getCode(); - } - // global transaction - List globalTransactionDOs = logStore.queryGlobalTransactionDO(states, logQueryLimit); - Map> branchTransactionDOsMap = Collections.emptyMap(); - if (CollectionUtils.isNotEmpty(globalTransactionDOs)) { - List xids = globalTransactionDOs.stream() - .map(GlobalTransactionDO::getXid) - .collect(Collectors.toList()); - if (withBranchSessions) { - List branchTransactionDOs = logStore.queryBranchTransactionDO(xids); - branchTransactionDOsMap = branchTransactionDOs.stream() - .collect(Collectors.groupingBy(BranchTransactionDO::getXid, LinkedHashMap::new, - Collectors.toList())); - } - } - Map> finalBranchTransactionDOsMap = branchTransactionDOsMap; - return globalTransactionDOs.stream() - .map(globalTransactionDO -> getGlobalSession(globalTransactionDO, - finalBranchTransactionDOsMap.get(globalTransactionDO.getXid()), withBranchSessions)) - .collect(Collectors.toList()); - } - - @Override - public List readSession(SessionCondition sessionCondition) { - if (StringUtils.isNotBlank(sessionCondition.getXid())) { - GlobalSession globalSession = readSession(sessionCondition.getXid()); - if (globalSession != null) { - List globalSessions = new ArrayList<>(); - globalSessions.add(globalSession); - return globalSessions; - } - } - else if (sessionCondition.getTransactionId() != null) { - GlobalSession globalSession = readSession(sessionCondition.getTransactionId()); - if (globalSession != null) { - List globalSessions = new ArrayList<>(); - globalSessions.add(globalSession); - return globalSessions; - } - } - else if (CollectionUtils.isNotEmpty(sessionCondition.getStatuses())) { - return readSession(sessionCondition.getStatuses(), !sessionCondition.isLazyLoadBranch()); - } - return null; - } - - private GlobalSession getGlobalSession(GlobalTransactionDO globalTransactionDO, - List branchTransactionDOs) { - return getGlobalSession(globalTransactionDO, branchTransactionDOs, true); - } - - private GlobalSession getGlobalSession(GlobalTransactionDO globalTransactionDO, - List branchTransactionDOs, boolean withBranchSessions) { - GlobalSession globalSession = SessionConverter.convertGlobalSession(globalTransactionDO, !withBranchSessions); - // branch transactions - if (CollectionUtils.isNotEmpty(branchTransactionDOs)) { - for (BranchTransactionDO branchTransactionDO : branchTransactionDOs) { - globalSession.add(SessionConverter.convertBranchSession(branchTransactionDO)); - } - } - return globalSession; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/store/LogStoreDataBaseDAO.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/store/LogStoreDataBaseDAO.java deleted file mode 100644 index 76ad4d7c37..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/db/store/LogStoreDataBaseDAO.java +++ /dev/null @@ -1,667 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.db.store; - -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import javax.sql.DataSource; - -import io.seata.common.exception.DataAccessException; -import io.seata.common.exception.StoreException; -import io.seata.common.util.IOUtil; -import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; -import io.seata.core.constants.ServerTableColumnsName; -import io.seata.core.store.BranchTransactionDO; -import io.seata.core.store.GlobalTransactionDO; -import io.seata.core.store.LogStore; -import io.seata.core.store.db.sql.log.LogStoreSqlsFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static io.seata.common.DefaultValues.DEFAULT_STORE_DB_BRANCH_TABLE; -import static io.seata.common.DefaultValues.DEFAULT_STORE_DB_GLOBAL_TABLE; - -/** - * The type Log store data base dao. - * - * @author zhangsen - */ -public class LogStoreDataBaseDAO implements LogStore { - - private static final Logger LOGGER = LoggerFactory.getLogger(LogStoreDataBaseDAO.class); - - /** - * The transaction name key - */ - private static final String TRANSACTION_NAME_KEY = "TRANSACTION_NAME"; - - /** - * The transaction name default size is 128 - */ - private static final int TRANSACTION_NAME_DEFAULT_SIZE = 128; - - /** - * The constant CONFIG. - */ - protected static final Configuration CONFIG = ConfigurationFactory.getInstance(); - - /** - * The Log store data source. - */ - protected DataSource logStoreDataSource = null; - - /** - * The Global table. - */ - protected String globalTable; - - /** - * The Branch table. - */ - protected String branchTable; - - private String dbType; - - private int transactionNameColumnSize = TRANSACTION_NAME_DEFAULT_SIZE; - - /** - * Instantiates a new Log store data base dao. - * @param logStoreDataSource the log store data source - */ - public LogStoreDataBaseDAO(DataSource logStoreDataSource) { - this.logStoreDataSource = logStoreDataSource; - globalTable = CONFIG.getConfig(ConfigurationKeys.STORE_DB_GLOBAL_TABLE, DEFAULT_STORE_DB_GLOBAL_TABLE); - branchTable = CONFIG.getConfig(ConfigurationKeys.STORE_DB_BRANCH_TABLE, DEFAULT_STORE_DB_BRANCH_TABLE); - dbType = CONFIG.getConfig(ConfigurationKeys.STORE_DB_TYPE); - if (StringUtils.isBlank(dbType)) { - throw new StoreException("there must be db type."); - } - if (logStoreDataSource == null) { - throw new StoreException("there must be logStoreDataSource."); - } - // init transaction_name size - initTransactionNameSize(); - } - - @Override - public GlobalTransactionDO queryGlobalTransactionDO(String xid) { - String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getQueryGlobalTransactionSQL(globalTable); - Connection conn = null; - PreparedStatement ps = null; - ResultSet rs = null; - try { - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - ps = conn.prepareStatement(sql); - ps.setString(1, xid); - rs = ps.executeQuery(); - if (rs.next()) { - return convertGlobalTransactionDO(rs); - } - else { - return null; - } - } - catch (SQLException e) { - throw new DataAccessException(e); - } - finally { - IOUtil.close(rs, ps, conn); - } - } - - @Override - public GlobalTransactionDO queryGlobalTransactionDO(long transactionId) { - String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType) - .getQueryGlobalTransactionSQLByTransactionId(globalTable); - Connection conn = null; - PreparedStatement ps = null; - ResultSet rs = null; - try { - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - ps = conn.prepareStatement(sql); - ps.setLong(1, transactionId); - rs = ps.executeQuery(); - if (rs.next()) { - return convertGlobalTransactionDO(rs); - } - else { - return null; - } - } - catch (SQLException e) { - throw new DataAccessException(e); - } - finally { - IOUtil.close(rs, ps, conn); - } - } - - @Override - public List queryGlobalTransactionDO(int[] statuses, int limit) { - List ret = new ArrayList<>(); - Connection conn = null; - PreparedStatement ps = null; - ResultSet rs = null; - try { - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - - String paramsPlaceHolder = org.apache.commons.lang.StringUtils.repeat("?", ",", statuses.length); - - String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType) - .getQueryGlobalTransactionSQLByStatus(globalTable, paramsPlaceHolder); - ps = conn.prepareStatement(sql); - for (int i = 0; i < statuses.length; i++) { - int status = statuses[i]; - ps.setInt(i + 1, status); - } - ps.setInt(statuses.length + 1, limit); - - // modify for the change of limit position in sqlserver - if ("sqlserver".equalsIgnoreCase(dbType)) { - ps.setInt(1, limit); - ps.setInt(statuses.length + 1, statuses[0]); - } - rs = ps.executeQuery(); - while (rs.next()) { - ret.add(convertGlobalTransactionDO(rs)); - } - return ret; - } - catch (SQLException e) { - throw new DataAccessException(e); - } - finally { - IOUtil.close(rs, ps, conn); - } - } - - @Override - public boolean insertGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) { - String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getInsertGlobalTransactionSQL(globalTable); - Connection conn = null; - PreparedStatement ps = null; - try { - int index = 1; - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - ps = conn.prepareStatement(sql); - ps.setString(index++, globalTransactionDO.getXid()); - ps.setLong(index++, globalTransactionDO.getTransactionId()); - ps.setInt(index++, globalTransactionDO.getStatus()); - ps.setString(index++, globalTransactionDO.getApplicationId()); - ps.setString(index++, globalTransactionDO.getTransactionServiceGroup()); - String transactionName = globalTransactionDO.getTransactionName(); - transactionName = transactionName.length() > transactionNameColumnSize - ? transactionName.substring(0, transactionNameColumnSize) : transactionName; - ps.setString(index++, transactionName); - ps.setInt(index++, globalTransactionDO.getTimeout()); - ps.setLong(index++, globalTransactionDO.getBeginTime()); - ps.setString(index++, globalTransactionDO.getApplicationData()); - return ps.executeUpdate() > 0; - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(ps, conn); - } - } - - @Override - public boolean updateGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) { - String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getUpdateGlobalTransactionStatusSQL(globalTable); - Connection conn = null; - PreparedStatement ps = null; - try { - int index = 1; - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - ps = conn.prepareStatement(sql); - ps.setInt(index++, globalTransactionDO.getStatus()); - ps.setString(index++, globalTransactionDO.getXid()); - return ps.executeUpdate() > 0; - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(ps, conn); - } - } - - @Override - public boolean updateGlobalTransactionDO(GlobalTransactionDO globalTransactionDO, Integer expectedStatus) { - String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType) - .getUpdateGlobalTransactionStatusByStatusSQL(globalTable); - Connection conn = null; - PreparedStatement ps = null; - try { - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - ps = conn.prepareStatement(sql); - ps.setInt(1, globalTransactionDO.getStatus()); - ps.setString(2, globalTransactionDO.getXid()); - ps.setInt(3, expectedStatus); - return ps.executeUpdate() > 0; - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(ps, conn); - } - } - - @Override - public boolean deleteGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) { - String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getDeleteGlobalTransactionSQL(globalTable); - Connection conn = null; - PreparedStatement ps = null; - try { - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - ps = conn.prepareStatement(sql); - ps.setString(1, globalTransactionDO.getXid()); - ps.executeUpdate(); - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(ps, conn); - } - return true; - } - - @Override - public List queryBranchTransactionDO(String xid) { - List rets = new ArrayList<>(); - String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getQueryBranchTransaction(branchTable); - Connection conn = null; - PreparedStatement ps = null; - ResultSet rs = null; - try { - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - - ps = conn.prepareStatement(sql); - ps.setString(1, xid); - - rs = ps.executeQuery(); - while (rs.next()) { - rets.add(convertBranchTransactionDO(rs)); - } - return rets; - } - catch (SQLException e) { - throw new DataAccessException(e); - } - finally { - IOUtil.close(rs, ps, conn); - } - } - - @Override - public List queryBranchTransactionDO(List xids) { - int length = xids.size(); - List rets = new ArrayList<>(length * 3); - String paramsPlaceHolder = org.apache.commons.lang.StringUtils.repeat("?", ",", length); - String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType) - .getQueryBranchTransaction(branchTable, paramsPlaceHolder); - Connection conn = null; - PreparedStatement ps = null; - ResultSet rs = null; - try { - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - ps = conn.prepareStatement(sql); - for (int i = 0; i < length; i++) { - ps.setString(i + 1, xids.get(i)); - } - rs = ps.executeQuery(); - while (rs.next()) { - rets.add(convertBranchTransactionDO(rs)); - } - return rets; - } - catch (SQLException e) { - throw new DataAccessException(e); - } - finally { - IOUtil.close(rs, ps, conn); - } - } - - @Override - public boolean insertBranchTransactionDO(BranchTransactionDO branchTransactionDO) { - String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getInsertBranchTransactionSQL(branchTable); - Connection conn = null; - PreparedStatement ps = null; - try { - int index = 1; - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - ps = conn.prepareStatement(sql); - ps.setString(index++, branchTransactionDO.getXid()); - ps.setLong(index++, branchTransactionDO.getTransactionId()); - ps.setLong(index++, branchTransactionDO.getBranchId()); - ps.setString(index++, branchTransactionDO.getResourceGroupId()); - ps.setString(index++, branchTransactionDO.getResourceId()); - ps.setString(index++, branchTransactionDO.getBranchType()); - ps.setInt(index++, branchTransactionDO.getStatus()); - ps.setString(index++, branchTransactionDO.getClientId()); - ps.setString(index++, branchTransactionDO.getApplicationData()); - return ps.executeUpdate() > 0; - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(ps, conn); - } - } - - @Override - public boolean updateBranchTransactionDO(BranchTransactionDO branchTransactionDO) { - boolean shouldUpdateAppData = StringUtils.isNotBlank(branchTransactionDO.getApplicationData()); - String sql = shouldUpdateAppData - ? LogStoreSqlsFactory.getLogStoreSqls(dbType).getUpdateBranchTransactionStatusAppDataSQL(branchTable) - : LogStoreSqlsFactory.getLogStoreSqls(dbType).getUpdateBranchTransactionStatusSQL(branchTable); - Connection conn = null; - PreparedStatement ps = null; - try { - int index = 1; - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - ps = conn.prepareStatement(sql); - ps.setInt(index++, branchTransactionDO.getStatus()); - if (shouldUpdateAppData) { - ps.setString(index++, branchTransactionDO.getApplicationData()); - } - ps.setString(index++, branchTransactionDO.getXid()); - ps.setLong(index++, branchTransactionDO.getBranchId()); - return ps.executeUpdate() > 0; - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(ps, conn); - } - } - - @Override - public boolean deleteBranchTransactionDO(BranchTransactionDO branchTransactionDO) { - String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getDeleteBranchTransactionByBranchIdSQL(branchTable); - Connection conn = null; - PreparedStatement ps = null; - try { - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - ps = conn.prepareStatement(sql); - ps.setString(1, branchTransactionDO.getXid()); - ps.setLong(2, branchTransactionDO.getBranchId()); - ps.executeUpdate(); - } - catch (SQLException e) { - throw new StoreException(e); - } - finally { - IOUtil.close(ps, conn); - } - return true; - } - - @Override - public long getCurrentMaxSessionId(long high, long low) { - String transMaxSql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getQueryGlobalMax(globalTable); - String branchMaxSql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getQueryBranchMax(branchTable); - long maxTransId = getCurrentMaxSessionId(transMaxSql, high, low); - long maxBranchId = getCurrentMaxSessionId(branchMaxSql, high, low); - return Math.max(maxBranchId, maxTransId); - } - - private long getCurrentMaxSessionId(String sql, long high, long low) { - long max = 0; - Connection conn = null; - PreparedStatement ps = null; - ResultSet rs = null; - try { - int index = 1; - conn = logStoreDataSource.getConnection(); - conn.setAutoCommit(true); - ps = conn.prepareStatement(sql); - ps.setLong(index++, high); - ps.setLong(index++, low); - - rs = ps.executeQuery(); - while (rs.next()) { - max = rs.getLong(1); - } - } - catch (SQLException e) { - throw new DataAccessException(e); - } - finally { - IOUtil.close(rs, ps, conn); - } - return max; - } - - private GlobalTransactionDO convertGlobalTransactionDO(ResultSet rs) throws SQLException { - GlobalTransactionDO globalTransactionDO = new GlobalTransactionDO(); - globalTransactionDO.setXid(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_XID)); - globalTransactionDO.setStatus(rs.getInt(ServerTableColumnsName.GLOBAL_TABLE_STATUS)); - globalTransactionDO.setApplicationId(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_APPLICATION_ID)); - globalTransactionDO.setBeginTime(rs.getLong(ServerTableColumnsName.GLOBAL_TABLE_BEGIN_TIME)); - globalTransactionDO.setTimeout(rs.getInt(ServerTableColumnsName.GLOBAL_TABLE_TIMEOUT)); - globalTransactionDO.setTransactionId(rs.getLong(ServerTableColumnsName.GLOBAL_TABLE_TRANSACTION_ID)); - globalTransactionDO.setTransactionName(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_TRANSACTION_NAME)); - globalTransactionDO - .setTransactionServiceGroup(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_TRANSACTION_SERVICE_GROUP)); - globalTransactionDO.setApplicationData(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_APPLICATION_DATA)); - globalTransactionDO.setGmtCreate(rs.getTimestamp(ServerTableColumnsName.GLOBAL_TABLE_GMT_CREATE)); - globalTransactionDO.setGmtModified(rs.getTimestamp(ServerTableColumnsName.GLOBAL_TABLE_GMT_MODIFIED)); - return globalTransactionDO; - } - - private BranchTransactionDO convertBranchTransactionDO(ResultSet rs) throws SQLException { - BranchTransactionDO branchTransactionDO = new BranchTransactionDO(); - branchTransactionDO.setResourceGroupId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_RESOURCE_GROUP_ID)); - branchTransactionDO.setStatus(rs.getInt(ServerTableColumnsName.BRANCH_TABLE_STATUS)); - branchTransactionDO.setApplicationData(rs.getString(ServerTableColumnsName.BRANCH_TABLE_APPLICATION_DATA)); - branchTransactionDO.setClientId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_CLIENT_ID)); - branchTransactionDO.setXid(rs.getString(ServerTableColumnsName.BRANCH_TABLE_XID)); - branchTransactionDO.setResourceId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_RESOURCE_ID)); - branchTransactionDO.setBranchId(rs.getLong(ServerTableColumnsName.BRANCH_TABLE_BRANCH_ID)); - branchTransactionDO.setBranchType(rs.getString(ServerTableColumnsName.BRANCH_TABLE_BRANCH_TYPE)); - branchTransactionDO.setTransactionId(rs.getLong(ServerTableColumnsName.BRANCH_TABLE_TRANSACTION_ID)); - branchTransactionDO.setGmtCreate(rs.getTimestamp(ServerTableColumnsName.BRANCH_TABLE_GMT_CREATE)); - branchTransactionDO.setGmtModified(rs.getTimestamp(ServerTableColumnsName.BRANCH_TABLE_GMT_MODIFIED)); - return branchTransactionDO; - } - - /** - * the public modifier only for test - */ - public void initTransactionNameSize() { - ColumnInfo columnInfo = queryTableStructure(globalTable, TRANSACTION_NAME_KEY); - if (columnInfo == null) { - LOGGER.warn("{} table or {} column not found", globalTable, TRANSACTION_NAME_KEY); - return; - } - this.transactionNameColumnSize = columnInfo.getColumnSize(); - } - - /** - * query column info from table - * @param tableName the table name - * @param colName the column name - * @return the column info - */ - private ColumnInfo queryTableStructure(final String tableName, String colName) { - try (Connection conn = logStoreDataSource.getConnection()) { - DatabaseMetaData dbmd = conn.getMetaData(); - String schema = getSchema(conn); - ResultSet tableRs = dbmd.getTables(null, schema, "%", new String[] { "TABLE" }); - while (tableRs.next()) { - String table = tableRs.getString("TABLE_NAME"); - if (StringUtils.equalsIgnoreCase(table, tableName)) { - ResultSet columnRs = conn.getMetaData().getColumns(null, schema, table, null); - while (columnRs.next()) { - ColumnInfo info = new ColumnInfo(); - String columnName = columnRs.getString("COLUMN_NAME"); - info.setColumnName(columnName); - String typeName = columnRs.getString("TYPE_NAME"); - info.setTypeName(typeName); - int columnSize = columnRs.getInt("COLUMN_SIZE"); - info.setColumnSize(columnSize); - String remarks = columnRs.getString("REMARKS"); - info.setRemarks(remarks); - if (StringUtils.equalsIgnoreCase(columnName, colName)) { - return info; - } - } - break; - } - } - } - catch (SQLException e) { - LOGGER.error("query transaction_name size fail, {}", e.getMessage(), e); - } - return null; - } - - private String getSchema(Connection conn) throws SQLException { - if ("h2".equalsIgnoreCase(dbType)) { - return null; - } - else if ("postgresql".equalsIgnoreCase(dbType)) { - String sql = "select current_schema"; - try (PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { - String schema = null; - if (rs.next()) { - schema = rs.getString(1); - } - return schema; - } - catch (SQLException e) { - throw new StoreException(e); - } - } - else if ("sqlserver".equalsIgnoreCase(dbType)) { - return conn.getSchema(); - } - else { - return conn.getMetaData().getUserName(); - } - } - - /** - * Sets log store data source. - * @param logStoreDataSource the log store data source - */ - public void setLogStoreDataSource(DataSource logStoreDataSource) { - this.logStoreDataSource = logStoreDataSource; - } - - /** - * Sets global table. - * @param globalTable the global table - */ - public void setGlobalTable(String globalTable) { - this.globalTable = globalTable; - } - - /** - * Sets branch table. - * @param branchTable the branch table - */ - public void setBranchTable(String branchTable) { - this.branchTable = branchTable; - } - - /** - * Sets db type. - * @param dbType the db type - */ - public void setDbType(String dbType) { - this.dbType = dbType; - } - - public int getTransactionNameColumnSize() { - return transactionNameColumnSize; - } - - /** - * column info - */ - private static class ColumnInfo { - - private String columnName; - - private String typeName; - - private int columnSize; - - private String remarks; - - public String getColumnName() { - return columnName; - } - - public void setColumnName(String columnName) { - this.columnName = columnName; - } - - public String getTypeName() { - return typeName; - } - - public void setTypeName(String typeName) { - this.typeName = typeName; - } - - public int getColumnSize() { - return columnSize; - } - - public void setColumnSize(int columnSize) { - this.columnSize = columnSize; - } - - public String getRemarks() { - return remarks; - } - - public void setRemarks(String remarks) { - this.remarks = remarks; - } - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/FlushDiskMode.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/FlushDiskMode.java deleted file mode 100644 index cab554b167..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/FlushDiskMode.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.file; - -/** - * @author lizhao - */ -public enum FlushDiskMode { - - /** - * sync flush disk - */ - SYNC_MODEL("sync"), - /** - * async flush disk - */ - ASYNC_MODEL("async"); - - private String modeStr; - - FlushDiskMode(String modeStr) { - this.modeStr = modeStr; - } - - public static FlushDiskMode findDiskMode(String modeStr) { - if (SYNC_MODEL.modeStr.equals(modeStr)) { - return SYNC_MODEL; - } - return ASYNC_MODEL; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/ReloadableStore.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/ReloadableStore.java deleted file mode 100644 index 90e822bdcf..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/ReloadableStore.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.file; - -import java.util.List; - -/** - * The interface Reloadable store. - * - * @author zhangsen - */ -public interface ReloadableStore { - - /** - * Read write store. - * @param readSize the read size - * @param isHistory the is history - * @return the list - */ - List readWriteStore(int readSize, boolean isHistory); - - /** - * Has remaining boolean. - * @param isHistory the is history - * @return the boolean - */ - boolean hasRemaining(boolean isHistory); - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/TransactionWriteStore.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/TransactionWriteStore.java deleted file mode 100644 index 315d21dace..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/TransactionWriteStore.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.file; - -import java.nio.ByteBuffer; - -import io.seata.common.exception.ShouldNeverHappenException; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.store.SessionStorable; -import io.seata.server.store.TransactionStoreManager.LogOperation; - -/** - * The type Transaction write store. - * - * @author slievrly - */ -public class TransactionWriteStore implements SessionStorable { - - private SessionStorable sessionRequest; - - private LogOperation operate; - - /** - * Instantiates a new Transaction write store. - * @param sessionRequest the session request - * @param operate the operate - */ - public TransactionWriteStore(SessionStorable sessionRequest, LogOperation operate) { - this.sessionRequest = sessionRequest; - this.operate = operate; - } - - /** - * Instantiates a new Transaction write store. - */ - public TransactionWriteStore() { - } - - /** - * Gets session request. - * @return the session request - */ - public SessionStorable getSessionRequest() { - return sessionRequest; - } - - /** - * Sets session request. - * @param sessionRequest the session request - */ - public void setSessionRequest(SessionStorable sessionRequest) { - this.sessionRequest = sessionRequest; - } - - /** - * Gets operate. - * @return the operate - */ - public LogOperation getOperate() { - return operate; - } - - /** - * Sets operate. - * @param operate the operate - */ - public void setOperate(LogOperation operate) { - this.operate = operate; - } - - @Override - public byte[] encode() { - byte[] bySessionRequest = this.sessionRequest.encode(); - byte byOpCode = this.getOperate().getCode(); - int len = bySessionRequest.length + 1; - byte[] byResult = new byte[len]; - ByteBuffer byteBuffer = ByteBuffer.wrap(byResult); - byteBuffer.put(bySessionRequest); - byteBuffer.put(byOpCode); - return byResult; - } - - @Override - public void decode(byte[] src) { - ByteBuffer byteBuffer = ByteBuffer.wrap(src); - byte[] bySessionRequest = new byte[src.length - 1]; - byteBuffer.get(bySessionRequest); - byte byOpCode = byteBuffer.get(); - this.operate = LogOperation.getLogOperationByCode(byOpCode); - SessionStorable tmpSessionStorable = getSessionInstanceByOperation(this.operate); - tmpSessionStorable.decode(bySessionRequest); - this.sessionRequest = tmpSessionStorable; - } - - private SessionStorable getSessionInstanceByOperation(LogOperation logOperation) { - SessionStorable sessionStorable = null; - switch (logOperation) { - case GLOBAL_ADD: - case GLOBAL_UPDATE: - case GLOBAL_REMOVE: - sessionStorable = new GlobalSession(); - break; - case BRANCH_ADD: - case BRANCH_UPDATE: - case BRANCH_REMOVE: - sessionStorable = new BranchSession(); - break; - default: - throw new ShouldNeverHappenException("incorrect logOperation"); - } - return sessionStorable; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/lock/FileLockManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/lock/FileLockManager.java deleted file mode 100644 index 705378d6dc..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/lock/FileLockManager.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.file.lock; - -import java.util.List; - -import io.seata.common.loader.LoadLevel; -import io.seata.core.exception.TransactionException; -import io.seata.core.lock.Locker; -import io.seata.server.lock.AbstractLockManager; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.storage.raft.lock.RaftLockManager; -import org.slf4j.MDC; - -import static io.seata.core.context.RootContext.MDC_KEY_BRANCH_ID; - -/** - * The type file lock manager. - * - * @author zhangsen - */ -@LoadLevel(name = "file") -public class FileLockManager extends AbstractLockManager { - - @Override - public Locker getLocker(BranchSession branchSession) { - return new FileLocker(branchSession); - } - - @Override - public boolean releaseGlobalSessionLock(GlobalSession globalSession) throws TransactionException { - List branchSessions = globalSession.getBranchSessions(); - boolean releaseLockResult = true; - for (BranchSession branchSession : branchSessions) { - try { - MDC.put(MDC_KEY_BRANCH_ID, String.valueOf(branchSession.getBranchId())); - releaseLockResult = this instanceof RaftLockManager ? super.releaseLock(branchSession) - : this.releaseLock(branchSession); - } - finally { - MDC.remove(MDC_KEY_BRANCH_ID); - } - } - return releaseLockResult; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/lock/FileLocker.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/lock/FileLocker.java deleted file mode 100644 index 0a9760422f..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/lock/FileLocker.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.file.lock; - -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -import io.seata.common.exception.FrameworkException; -import io.seata.common.exception.StoreException; -import io.seata.common.util.CollectionUtils; -import io.seata.core.exception.BranchTransactionException; -import io.seata.core.exception.TransactionException; -import io.seata.core.lock.AbstractLocker; -import io.seata.core.lock.RowLock; -import io.seata.core.model.LockStatus; -import io.seata.server.session.BranchSession; - -import static io.seata.core.exception.TransactionExceptionCode.LockKeyConflictFailFast; - -/** - * The type Memory locker. - * - * @author zhangsen - */ -public class FileLocker extends AbstractLocker { - - private static final int BUCKET_PER_TABLE = 128; - - private static final ConcurrentMap>> LOCK_MAP = new ConcurrentHashMap<>(); - - /** - * The Branch session. - */ - protected BranchSession branchSession; - - /** - * Instantiates a new Memory locker. - * @param branchSession the branch session - */ - public FileLocker(BranchSession branchSession) { - this.branchSession = branchSession; - } - - @Override - public boolean acquireLock(List rowLocks) { - return acquireLock(rowLocks, true, false); - } - - @Override - public boolean acquireLock(List rowLocks, boolean autoCommit, boolean skipCheckLock) { - if (CollectionUtils.isEmpty(rowLocks)) { - // no lock - return true; - } - String resourceId = branchSession.getResourceId(); - long transactionId = branchSession.getTransactionId(); - - Map> bucketHolder = branchSession.getLockHolder(); - Map> dbLockMap = CollectionUtils.computeIfAbsent(LOCK_MAP, - resourceId, key -> new ConcurrentHashMap<>(8)); - boolean failFast = false; - boolean canLock = true; - for (RowLock lock : rowLocks) { - String tableName = lock.getTableName(); - String pk = lock.getPk(); - ConcurrentMap tableLockMap = CollectionUtils.computeIfAbsent(dbLockMap, tableName, - key -> new ConcurrentHashMap<>(8)); - - int bucketId = pk.hashCode() % BUCKET_PER_TABLE; - BucketLockMap bucketLockMap = CollectionUtils.computeIfAbsent(tableLockMap, bucketId, - key -> new BucketLockMap()); - BranchSession previousLockBranchSession = bucketLockMap.get().putIfAbsent(pk, branchSession); - if (previousLockBranchSession == null) { - // No existing lock, and now locked by myself - Set keysInHolder = CollectionUtils.computeIfAbsent(bucketHolder, bucketLockMap, - key -> ConcurrentHashMap.newKeySet()); - keysInHolder.add(pk); - } - else if (previousLockBranchSession.getTransactionId() == transactionId) { - // Locked by me before - } - else { - LOGGER.info("Global lock on [" + tableName + ":" + pk + "] is holding by " - + previousLockBranchSession.getBranchId()); - try { - // Release all acquired locks. - branchSession.unlock(); - } - catch (TransactionException e) { - throw new FrameworkException(e); - } - if (!autoCommit && previousLockBranchSession.getLockStatus() == LockStatus.Rollbacking) { - failFast = true; - break; - } - if (canLock) { - canLock = false; - if (autoCommit) { - break; - } - } - } - } - if (failFast) { - throw new StoreException(new BranchTransactionException(LockKeyConflictFailFast)); - } - return canLock; - } - - @Override - public boolean releaseLock(List rowLock) { - if (CollectionUtils.isEmpty(rowLock)) { - // no lock - return true; - } - Map> lockHolder = branchSession.getLockHolder(); - if (CollectionUtils.isEmpty(lockHolder)) { - return true; - } - lockHolder.forEach((bucket, keys) -> { - for (String key : keys) { - // remove lock only if it locked by myself - bucket.get().remove(key, branchSession); - } - }); - lockHolder.clear(); - return true; - } - - @Override - public boolean isLockable(List rowLocks) { - if (CollectionUtils.isEmpty(rowLocks)) { - // no lock - return true; - } - Long transactionId = rowLocks.get(0).getTransactionId(); - String resourceId = rowLocks.get(0).getResourceId(); - ConcurrentMap> dbLockMap = LOCK_MAP.get(resourceId); - if (dbLockMap == null) { - return true; - } - for (RowLock rowLock : rowLocks) { - String tableName = rowLock.getTableName(); - String pk = rowLock.getPk(); - - ConcurrentMap tableLockMap = dbLockMap.get(tableName); - if (tableLockMap == null) { - continue; - } - int bucketId = pk.hashCode() % BUCKET_PER_TABLE; - BucketLockMap bucketLockMap = tableLockMap.get(bucketId); - if (bucketLockMap == null) { - continue; - } - BranchSession branchSession = bucketLockMap.get().get(pk); - Long lockingTransactionId = branchSession != null ? branchSession.getTransactionId() : null; - if (lockingTransactionId == null || lockingTransactionId.longValue() == transactionId) { - // Locked by me - continue; - } - else { - LOGGER.info("Global lock on [" + tableName + ":" + pk + "] is holding by " + lockingTransactionId); - return false; - } - } - return true; - } - - @Override - public void updateLockStatus(String xid, LockStatus lockStatus) { - } - - @Override - public void cleanAllLocks() { - LOCK_MAP.clear(); - } - - /** - * Because bucket lock map will be key of HashMap(lockHolder), however - * {@link ConcurrentHashMap} overwrites {@link Object#hashCode()} and - * {@link Object#equals(Object)}, that leads to hash key conflict in lockHolder. We - * define a {@link BucketLockMap} to hold the ConcurrentHashMap(bucketLockMap) and - * replace it as key of HashMap(lockHolder). - */ - public static class BucketLockMap { - - private final ConcurrentHashMap bucketLockMap = new ConcurrentHashMap<>(); - - ConcurrentHashMap get() { - return bucketLockMap; - } - - @Override - public int hashCode() { - return super.hashCode(); - } - - @Override - public boolean equals(Object o) { - return super.equals(o); - } - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/session/FileSessionManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/session/FileSessionManager.java deleted file mode 100644 index 51b165f8db..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/session/FileSessionManager.java +++ /dev/null @@ -1,397 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.file.session; - -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.Arrays; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -import io.seata.common.exception.ShouldNeverHappenException; -import io.seata.common.loader.LoadLevel; -import io.seata.common.loader.Scope; -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.StringUtils; -import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; -import io.seata.core.exception.TransactionException; -import io.seata.core.model.GlobalStatus; -import io.seata.server.session.AbstractSessionManager; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.Reloadable; -import io.seata.server.session.SessionCondition; -import io.seata.server.storage.file.ReloadableStore; -import io.seata.server.storage.file.TransactionWriteStore; -import io.seata.server.storage.file.store.FileTransactionStoreManager; -import io.seata.server.store.AbstractTransactionStoreManager; -import io.seata.server.store.SessionStorable; -import io.seata.server.store.TransactionStoreManager; - -import static io.seata.common.DefaultValues.DEFAULT_SERVICE_SESSION_RELOAD_READ_SIZE; - -/** - * The type File based session manager. - * - * @author slievrly - */ -@LoadLevel(name = "file", scope = Scope.PROTOTYPE) -public class FileSessionManager extends AbstractSessionManager implements Reloadable { - - private static final int READ_SIZE = ConfigurationFactory.getInstance() - .getInt(ConfigurationKeys.SERVICE_SESSION_RELOAD_READ_SIZE, DEFAULT_SERVICE_SESSION_RELOAD_READ_SIZE); - - /** - * The Session map. - */ - private Map sessionMap = new ConcurrentHashMap<>(64); - - /** - * Instantiates a new File based session manager. - * @param name the name - */ - public FileSessionManager(String name) { - super(name); - transactionStoreManager = new AbstractTransactionStoreManager() { - @Override - public boolean writeSession(LogOperation logOperation, SessionStorable session) { - return true; - } - }; - } - - /** - * Instantiates a new File based session manager. - * @param name the name - * @param sessionStoreFilePath the session store file path - * @throws IOException the io exception - */ - public FileSessionManager(String name, String sessionStoreFilePath) throws IOException { - super(name); - if (StringUtils.isNotBlank(sessionStoreFilePath)) { - transactionStoreManager = new FileTransactionStoreManager(sessionStoreFilePath + File.separator + name, - this); - } - else { - transactionStoreManager = new AbstractTransactionStoreManager() { - @Override - public boolean writeSession(LogOperation logOperation, SessionStorable session) { - return true; - } - }; - } - } - - @Override - public void reload() { - restoreSessions(); - } - - @Override - public void addGlobalSession(GlobalSession session) throws TransactionException { - CollectionUtils.computeIfAbsent(sessionMap, session.getXid(), k -> { - try { - super.addGlobalSession(session); - } - catch (TransactionException e) { - LOGGER.error("addGlobalSession fail, msg: {}", e.getMessage()); - } - return session; - }); - } - - @Override - public GlobalSession findGlobalSession(String xid) { - return sessionMap.get(xid); - } - - @Override - public GlobalSession findGlobalSession(String xid, boolean withBranchSessions) { - // withBranchSessions without process in memory - return sessionMap.get(xid); - } - - @Override - public void removeGlobalSession(GlobalSession session) throws TransactionException { - if (sessionMap.remove(session.getXid()) != null) { - super.removeGlobalSession(session); - } - } - - @Override - public Collection allSessions() { - return sessionMap.values(); - } - - @Override - public List findGlobalSessions(SessionCondition condition) { - List globalStatuses = null; - if (null != condition.getStatuses() && condition.getStatuses().length > 0) { - globalStatuses = Arrays.asList(condition.getStatuses()); - } - Collection list = sessionMap.values(); - List finalGlobalStatuses = globalStatuses; - return list.parallelStream().filter(globalSession -> { - - if (null != condition.getOverTimeAliveMills() && condition.getOverTimeAliveMills() > 0) { - if (System.currentTimeMillis() - globalSession.getBeginTime() <= condition.getOverTimeAliveMills()) { - return false; - } - } - - if (!StringUtils.isEmpty(condition.getXid())) { - // Only one will be found, just add and return - return Objects.equals(condition.getXid(), globalSession.getXid()); - } - - if (null != condition.getTransactionId() && condition.getTransactionId() > 0) { - // Only one will be found, just add and return - return Objects.equals(condition.getTransactionId(), globalSession.getTransactionId()); - } - - if (null != finalGlobalStatuses) { - return finalGlobalStatuses.contains(globalSession.getStatus()); - } - // All test pass, add to resp - return true; - }).collect(Collectors.toList()); - } - - @Override - public T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable lockCallable) - throws TransactionException { - globalSession.lock(); - try { - return lockCallable.call(); - } - finally { - globalSession.unlock(); - } - } - - private void restoreSessions() { - final Set removedGlobalBuffer = new HashSet<>(); - final Map> unhandledBranchBuffer = new HashMap<>(); - - restoreSessions(true, removedGlobalBuffer, unhandledBranchBuffer); - restoreSessions(false, removedGlobalBuffer, unhandledBranchBuffer); - - if (!unhandledBranchBuffer.isEmpty()) { - unhandledBranchBuffer.values().forEach(unhandledBranchSessions -> { - unhandledBranchSessions.values().forEach(branchSession -> { - String xid = branchSession.getXid(); - if (removedGlobalBuffer.contains(xid)) { - return; - } - - long bid = branchSession.getBranchId(); - GlobalSession found = sessionMap.get(xid); - if (found == null) { - // Ignore - if (LOGGER.isInfoEnabled()) { - LOGGER.info("GlobalSession Does Not Exists For BranchSession [" + bid + "/" + xid + "]"); - } - } - else { - BranchSession existingBranch = found.getBranch(branchSession.getBranchId()); - if (existingBranch == null) { - found.add(branchSession); - } - else { - existingBranch.setStatus(branchSession.getStatus()); - } - } - }); - }); - } - } - - private boolean checkSessionStatus(GlobalSession globalSession) { - GlobalStatus globalStatus = globalSession.getStatus(); - switch (globalStatus) { - case UnKnown: - case Committed: - case CommitFailed: - case Rollbacked: - case RollbackFailed: - case TimeoutRollbacked: - case TimeoutRollbackFailed: - case RollbackRetryTimeout: - case Finished: - return false; - default: - return true; - } - } - - private void restoreSessions(boolean isHistory, Set removedGlobalBuffer, - Map> unhandledBranchBuffer) { - if (!(transactionStoreManager instanceof ReloadableStore)) { - return; - } - while (((ReloadableStore) transactionStoreManager).hasRemaining(isHistory)) { - List stores = ((ReloadableStore) transactionStoreManager).readWriteStore(READ_SIZE, - isHistory); - restore(stores, removedGlobalBuffer, unhandledBranchBuffer); - } - } - - private void restore(List stores, Set removedGlobalBuffer, - Map> unhandledBranchBuffer) { - for (TransactionWriteStore store : stores) { - TransactionStoreManager.LogOperation logOperation = store.getOperate(); - SessionStorable sessionStorable = store.getSessionRequest(); - switch (logOperation) { - case GLOBAL_ADD: - case GLOBAL_UPDATE: { - GlobalSession globalSession = (GlobalSession) sessionStorable; - if (globalSession.getTransactionId() == 0) { - LOGGER.error("Restore globalSession from file failed, the transactionId is zero , xid:" - + globalSession.getXid()); - break; - } - if (removedGlobalBuffer.contains(globalSession.getXid())) { - break; - } - GlobalSession foundGlobalSession = sessionMap.get(globalSession.getXid()); - if (foundGlobalSession == null) { - if (this.checkSessionStatus(globalSession)) { - sessionMap.put(globalSession.getXid(), globalSession); - } - else { - removedGlobalBuffer.add(globalSession.getXid()); - unhandledBranchBuffer.remove(globalSession.getXid()); - } - } - else { - if (this.checkSessionStatus(globalSession)) { - foundGlobalSession.setStatus(globalSession.getStatus()); - } - else { - sessionMap.remove(globalSession.getXid()); - removedGlobalBuffer.add(globalSession.getXid()); - unhandledBranchBuffer.remove(globalSession.getXid()); - } - } - break; - } - case GLOBAL_REMOVE: { - GlobalSession globalSession = (GlobalSession) sessionStorable; - if (globalSession.getTransactionId() == 0) { - LOGGER.error("Restore globalSession from file failed, the transactionId is zero , xid:" - + globalSession.getXid()); - break; - } - if (removedGlobalBuffer.contains(globalSession.getXid())) { - break; - } - if (sessionMap.remove(globalSession.getXid()) == null) { - if (LOGGER.isInfoEnabled()) { - LOGGER.info("GlobalSession To Be Removed Does Not Exists [" + globalSession.getXid() + "]"); - } - } - removedGlobalBuffer.add(globalSession.getXid()); - unhandledBranchBuffer.remove(globalSession.getXid()); - break; - } - case BRANCH_ADD: - case BRANCH_UPDATE: { - BranchSession branchSession = (BranchSession) sessionStorable; - if (branchSession.getTransactionId() == 0) { - LOGGER.error("Restore branchSession from file failed, the transactionId is zero , xid:" - + branchSession.getXid()); - break; - } - if (removedGlobalBuffer.contains(branchSession.getXid())) { - break; - } - GlobalSession foundGlobalSession = sessionMap.get(branchSession.getXid()); - if (foundGlobalSession == null) { - unhandledBranchBuffer.computeIfAbsent(branchSession.getXid(), key -> new HashMap<>()) - .put(branchSession.getBranchId(), branchSession); - } - else { - BranchSession existingBranch = foundGlobalSession.getBranch(branchSession.getBranchId()); - if (existingBranch == null) { - foundGlobalSession.add(branchSession); - } - else { - existingBranch.setStatus(branchSession.getStatus()); - } - } - break; - } - case BRANCH_REMOVE: { - BranchSession branchSession = (BranchSession) sessionStorable; - String xid = branchSession.getXid(); - if (removedGlobalBuffer.contains(xid)) { - break; - } - long bid = branchSession.getBranchId(); - if (branchSession.getTransactionId() == 0) { - LOGGER.error("Restore branchSession from file failed, the transactionId is zero , xid:" - + branchSession.getXid()); - break; - } - GlobalSession found = sessionMap.get(xid); - if (found == null) { - if (LOGGER.isInfoEnabled()) { - LOGGER.info("GlobalSession To Be Updated (Remove Branch) Does Not Exists [" + bid + "/" - + xid + "]"); - } - } - else { - BranchSession theBranch = found.getBranch(bid); - if (theBranch == null) { - if (LOGGER.isInfoEnabled()) { - LOGGER.info("BranchSession To Be Updated Does Not Exists [" + bid + "/" + xid + "]"); - } - } - else { - found.remove(theBranch); - } - } - break; - } - default: - throw new ShouldNeverHappenException("Unknown Operation: " + logOperation); - } - } - - } - - public Map getSessionMap() { - return sessionMap; - } - - public void setSessionMap(Map sessionMap) { - this.sessionMap = sessionMap; - } - - @Override - public void destroy() { - transactionStoreManager.shutdown(); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/store/FileTransactionStoreManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/store/FileTransactionStoreManager.java deleted file mode 100644 index 6dc12e73cc..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/file/store/FileTransactionStoreManager.java +++ /dev/null @@ -1,685 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.file.store; - -import com.alipay.sofa.jraft.util.BufferUtils; -import io.seata.common.exception.StoreException; -import io.seata.common.thread.NamedThreadFactory; -import io.seata.common.util.CollectionUtils; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionCondition; -import io.seata.server.session.SessionManager; -import io.seata.server.storage.file.FlushDiskMode; -import io.seata.server.storage.file.ReloadableStore; -import io.seata.server.storage.file.TransactionWriteStore; -import io.seata.server.store.AbstractTransactionStoreManager; -import io.seata.server.store.SessionStorable; -import io.seata.server.store.StoreConfig; -import io.seata.server.store.TransactionStoreManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.locks.ReentrantLock; - -import static io.seata.core.context.RootContext.MDC_KEY_BRANCH_ID; - -/** - * The type File transaction store manager. - * - * @author slievrly - */ -public class FileTransactionStoreManager extends AbstractTransactionStoreManager - implements TransactionStoreManager, ReloadableStore { - - private static final Logger LOGGER = LoggerFactory.getLogger(FileTransactionStoreManager.class); - - private static final int MAX_THREAD_WRITE = 1; - - private ExecutorService fileWriteExecutor; - - private volatile boolean stopping = false; - - private static final int MAX_SHUTDOWN_RETRY = 3; - - private static final int SHUTDOWN_CHECK_INTERVAL = 1 * 1000; - - private static final int MAX_WRITE_RETRY = 5; - - private static final String HIS_DATA_FILENAME_POSTFIX = ".1"; - - private static final AtomicLong FILE_TRX_NUM = new AtomicLong(0); - - private static final AtomicLong FILE_FLUSH_NUM = new AtomicLong(0); - - private static final int MARK_SIZE = 4; - - private static final int MAX_WAIT_TIME_MILLS = 2 * 1000; - - private static final int MAX_FLUSH_TIME_MILLS = 2 * 1000; - - private static final int MAX_FLUSH_NUM = 10; - - private static final int PER_FILE_BLOCK_SIZE = 65535 * 8; - - private static final long MAX_TRX_TIMEOUT_MILLS = 30 * 60 * 1000; - - private static volatile long trxStartTimeMills = System.currentTimeMillis(); - - private File currDataFile; - - private RandomAccessFile currRaf; - - private FileChannel currFileChannel; - - private long recoverCurrOffset = 0; - - private long recoverHisOffset = 0; - - private SessionManager sessionManager; - - private String currFullFileName; - - private String hisFullFileName; - - private WriteDataFileRunnable writeDataFileRunnable; - - private ReentrantLock writeSessionLock = new ReentrantLock(); - - private volatile long lastModifiedTime; - - private static final int MAX_WRITE_BUFFER_SIZE = StoreConfig.getFileWriteBufferCacheSize(); - - private final ByteBuffer writeBuffer = ByteBuffer.allocateDirect(MAX_WRITE_BUFFER_SIZE); - - private static final FlushDiskMode FLUSH_DISK_MODE = StoreConfig.getFlushDiskMode(); - - private static final int MAX_WAIT_FOR_FLUSH_TIME_MILLS = 2 * 1000; - - private static final int MAX_WAIT_FOR_CLOSE_TIME_MILLS = 2 * 1000; - - private static final int INT_BYTE_SIZE = 4; - - /** - * Instantiates a new File transaction store manager. - * @param fullFileName the dir path - * @param sessionManager the session manager - * @throws IOException the io exception - */ - public FileTransactionStoreManager(String fullFileName, SessionManager sessionManager) throws IOException { - initFile(fullFileName); - fileWriteExecutor = new ThreadPoolExecutor(MAX_THREAD_WRITE, MAX_THREAD_WRITE, Integer.MAX_VALUE, - TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), - new NamedThreadFactory("fileTransactionStore", MAX_THREAD_WRITE, true)); - writeDataFileRunnable = new WriteDataFileRunnable(); - fileWriteExecutor.submit(writeDataFileRunnable); - this.sessionManager = sessionManager; - } - - private void initFile(String fullFileName) throws IOException { - this.currFullFileName = fullFileName; - this.hisFullFileName = fullFileName + HIS_DATA_FILENAME_POSTFIX; - try { - currDataFile = new File(currFullFileName); - if (!currDataFile.exists()) { - // create parent dir first - if (currDataFile.getParentFile() != null && !currDataFile.getParentFile().exists()) { - currDataFile.getParentFile().mkdirs(); - } - currDataFile.createNewFile(); - trxStartTimeMills = System.currentTimeMillis(); - } - else { - trxStartTimeMills = currDataFile.lastModified(); - } - lastModifiedTime = System.currentTimeMillis(); - currRaf = new RandomAccessFile(currDataFile, "rw"); - currRaf.seek(currDataFile.length()); - currFileChannel = currRaf.getChannel(); - } - catch (IOException exx) { - LOGGER.error("init file error,{}", exx.getMessage(), exx); - throw exx; - } - } - - @Override - public boolean writeSession(LogOperation logOperation, SessionStorable session) { - long curFileTrxNum; - writeSessionLock.lock(); - try { - if (!writeDataFile(new TransactionWriteStore(session, logOperation).encode())) { - return false; - } - lastModifiedTime = System.currentTimeMillis(); - curFileTrxNum = FILE_TRX_NUM.incrementAndGet(); - if (curFileTrxNum % PER_FILE_BLOCK_SIZE == 0 - && (System.currentTimeMillis() - trxStartTimeMills) > MAX_TRX_TIMEOUT_MILLS) { - return saveHistory(); - } - } - catch (Exception exx) { - LOGGER.error("writeSession error, {}", exx.getMessage(), exx); - return false; - } - finally { - writeSessionLock.unlock(); - } - flushDisk(curFileTrxNum, currFileChannel); - return true; - } - - private void flushDisk(long curFileNum, FileChannel currFileChannel) { - - if (FLUSH_DISK_MODE == FlushDiskMode.SYNC_MODEL) { - SyncFlushRequest syncFlushRequest = new SyncFlushRequest(curFileNum, currFileChannel); - writeDataFileRunnable.putRequest(syncFlushRequest); - syncFlushRequest.waitForFlush(MAX_WAIT_FOR_FLUSH_TIME_MILLS); - } - else { - writeDataFileRunnable.putRequest(new AsyncFlushRequest(curFileNum, currFileChannel)); - } - } - - /** - * get all overTimeSessionStorables merge write file - * @throws IOException - */ - private boolean saveHistory() throws IOException { - boolean result; - try { - result = findTimeoutAndSave(); - CloseFileRequest request = new CloseFileRequest(currFileChannel, currRaf); - writeDataFileRunnable.putRequest(request); - request.waitForClose(MAX_WAIT_FOR_CLOSE_TIME_MILLS); - Files.move(currDataFile.toPath(), new File(hisFullFileName).toPath(), StandardCopyOption.REPLACE_EXISTING); - } - catch (IOException exx) { - LOGGER.error("save history data file error, {}", exx.getMessage(), exx); - result = false; - } - finally { - initFile(currFullFileName); - } - return result; - } - - private boolean writeDataFrame(byte[] data) { - if (data == null || data.length <= 0) { - return true; - } - int dataLength = data.length; - int bufferRemainingSize = writeBuffer.remaining(); - if (bufferRemainingSize <= INT_BYTE_SIZE) { - if (!flushWriteBuffer(writeBuffer)) { - return false; - } - } - bufferRemainingSize = writeBuffer.remaining(); - if (bufferRemainingSize <= INT_BYTE_SIZE) { - throw new IllegalStateException( - String.format("Write buffer remaining size %d was too small", bufferRemainingSize)); - } - writeBuffer.putInt(dataLength); - bufferRemainingSize = writeBuffer.remaining(); - int dataPos = 0; - while (dataPos < dataLength) { - int dataLengthToWrite = dataLength - dataPos; - dataLengthToWrite = Math.min(dataLengthToWrite, bufferRemainingSize); - writeBuffer.put(data, dataPos, dataLengthToWrite); - bufferRemainingSize = writeBuffer.remaining(); - if (bufferRemainingSize == 0) { - if (!flushWriteBuffer(writeBuffer)) { - return false; - } - bufferRemainingSize = writeBuffer.remaining(); - } - dataPos += dataLengthToWrite; - } - return true; - } - - private boolean flushWriteBuffer(ByteBuffer writeBuffer) { - BufferUtils.flip(writeBuffer); - if (!writeDataFileByBuffer(writeBuffer)) { - return false; - } - BufferUtils.clear(writeBuffer); - return true; - } - - private boolean findTimeoutAndSave() throws IOException { - List globalSessionsOverMaxTimeout = sessionManager - .findGlobalSessions(new SessionCondition(MAX_TRX_TIMEOUT_MILLS)); - if (CollectionUtils.isEmpty(globalSessionsOverMaxTimeout)) { - return true; - } - for (GlobalSession globalSession : globalSessionsOverMaxTimeout) { - TransactionWriteStore globalWriteStore = new TransactionWriteStore(globalSession, LogOperation.GLOBAL_ADD); - byte[] data = globalWriteStore.encode(); - if (!writeDataFrame(data)) { - return false; - } - List branchSessIonsOverMaXTimeout = globalSession.getSortedBranches(); - if (branchSessIonsOverMaXTimeout != null) { - for (BranchSession branchSession : branchSessIonsOverMaXTimeout) { - try { - MDC.put(MDC_KEY_BRANCH_ID, String.valueOf(branchSession.getBranchId())); - TransactionWriteStore branchWriteStore = new TransactionWriteStore(branchSession, - LogOperation.BRANCH_ADD); - data = branchWriteStore.encode(); - if (!writeDataFrame(data)) { - return false; - } - } - finally { - MDC.remove(MDC_KEY_BRANCH_ID); - } - } - } - } - if (flushWriteBuffer(writeBuffer)) { - currFileChannel.force(false); - return true; - } - return false; - } - - @Override - public GlobalSession readSession(String xid) { - throw new StoreException("unsupport for read from file, xid:" + xid); - } - - @Override - public List readSession(SessionCondition sessionCondition) { - throw new StoreException("unsupport for read from file"); - } - - @Override - public void shutdown() { - if (fileWriteExecutor != null) { - fileWriteExecutor.shutdown(); - stopping = true; - int retry = 0; - while (!fileWriteExecutor.isTerminated() && retry < MAX_SHUTDOWN_RETRY) { - ++retry; - try { - Thread.sleep(SHUTDOWN_CHECK_INTERVAL); - } - catch (InterruptedException ignore) { - } - } - if (retry >= MAX_SHUTDOWN_RETRY) { - fileWriteExecutor.shutdownNow(); - } - } - try { - if (currFileChannel.isOpen()) { - currFileChannel.force(true); - } - } - catch (IOException e) { - LOGGER.error("fileChannel force error: {}", e.getMessage(), e); - } - closeFile(currRaf); - } - - @Override - public List readWriteStore(int readSize, boolean isHistory) { - File file = null; - long currentOffset = 0; - if (isHistory) { - file = new File(hisFullFileName); - currentOffset = recoverHisOffset; - } - else { - file = new File(currFullFileName); - currentOffset = recoverCurrOffset; - } - if (file.exists()) { - return parseDataFile(file, readSize, currentOffset, isHistory); - } - return null; - } - - @Override - public boolean hasRemaining(boolean isHistory) { - File file; - RandomAccessFile raf = null; - long currentOffset; - if (isHistory) { - file = new File(hisFullFileName); - currentOffset = recoverHisOffset; - } - else { - file = new File(currFullFileName); - currentOffset = recoverCurrOffset; - } - try { - raf = new RandomAccessFile(file, "r"); - return currentOffset < raf.length(); - - } - catch (IOException ignore) { - } - finally { - closeFile(raf); - } - return false; - } - - private List parseDataFile(File file, int readSize, long currentOffset, boolean isHistory) { - List transactionWriteStores = new ArrayList<>(readSize); - RandomAccessFile raf = null; - FileChannel fileChannel = null; - try { - raf = new RandomAccessFile(file, "r"); - raf.seek(currentOffset); - fileChannel = raf.getChannel(); - fileChannel.position(currentOffset); - long size = raf.length(); - ByteBuffer buffSize = ByteBuffer.allocate(MARK_SIZE); - while (fileChannel.position() < size) { - try { - BufferUtils.clear(buffSize); - int avilReadSize = fileChannel.read(buffSize); - if (avilReadSize != MARK_SIZE) { - break; - } - BufferUtils.flip(buffSize); - int bodySize = buffSize.getInt(); - byte[] byBody = new byte[bodySize]; - ByteBuffer buffBody = ByteBuffer.wrap(byBody); - avilReadSize = fileChannel.read(buffBody); - if (avilReadSize != bodySize) { - break; - } - TransactionWriteStore writeStore = new TransactionWriteStore(); - writeStore.decode(byBody); - transactionWriteStores.add(writeStore); - if (transactionWriteStores.size() == readSize) { - break; - } - } - catch (Exception ex) { - LOGGER.error("decode data file error:{}", ex.getMessage(), ex); - break; - } - } - return transactionWriteStores; - } - catch (IOException exx) { - LOGGER.error("parse data file error:{},file:{}", exx.getMessage(), file.getName(), exx); - return null; - } - finally { - try { - if (fileChannel != null) { - if (isHistory) { - recoverHisOffset = fileChannel.position(); - } - else { - recoverCurrOffset = fileChannel.position(); - } - } - closeFile(raf); - } - catch (IOException exx) { - LOGGER.error("file close error{}", exx.getMessage(), exx); - } - } - } - - private void closeFile(RandomAccessFile raf) { - try { - if (raf != null) { - raf.close(); - raf = null; - } - } - catch (IOException exx) { - LOGGER.error("file close error,{}", exx.getMessage(), exx); - } - } - - private boolean writeDataFile(byte[] bs) { - if (bs == null || bs.length >= Integer.MAX_VALUE - 3) { - return false; - } - if (!writeDataFrame(bs)) { - return false; - } - return flushWriteBuffer(writeBuffer); - } - - private boolean writeDataFileByBuffer(ByteBuffer byteBuffer) { - for (int retry = 0; retry < MAX_WRITE_RETRY; retry++) { - try { - while (byteBuffer.hasRemaining()) { - currFileChannel.write(byteBuffer); - } - return true; - } - catch (Exception exx) { - LOGGER.error("write data file error:{}", exx.getMessage(), exx); - } - } - LOGGER.error("write dataFile failed,retry more than :{}", MAX_WRITE_RETRY); - return false; - } - - interface StoreRequest { - - } - - abstract static class AbstractFlushRequest implements StoreRequest { - - private final long curFileTrxNum; - - private final FileChannel curFileChannel; - - protected AbstractFlushRequest(long curFileTrxNum, FileChannel curFileChannel) { - this.curFileTrxNum = curFileTrxNum; - this.curFileChannel = curFileChannel; - } - - public long getCurFileTrxNum() { - return curFileTrxNum; - } - - public FileChannel getCurFileChannel() { - return curFileChannel; - } - - } - - class SyncFlushRequest extends AbstractFlushRequest { - - private final CountDownLatch countDownLatch = new CountDownLatch(1); - - public SyncFlushRequest(long curFileTrxNum, FileChannel curFileChannel) { - super(curFileTrxNum, curFileChannel); - } - - public void wakeup() { - this.countDownLatch.countDown(); - } - - public void waitForFlush(long timeout) { - try { - this.countDownLatch.await(timeout, TimeUnit.MILLISECONDS); - } - catch (InterruptedException e) { - LOGGER.error("Interrupted", e); - } - } - - } - - class AsyncFlushRequest extends AbstractFlushRequest { - - public AsyncFlushRequest(long curFileTrxNum, FileChannel curFileChannel) { - super(curFileTrxNum, curFileChannel); - } - - } - - static class CloseFileRequest implements StoreRequest { - - private final CountDownLatch countDownLatch = new CountDownLatch(1); - - private FileChannel fileChannel; - - private RandomAccessFile file; - - public CloseFileRequest(FileChannel fileChannel, RandomAccessFile file) { - this.fileChannel = fileChannel; - this.file = file; - } - - public FileChannel getFileChannel() { - return fileChannel; - } - - public RandomAccessFile getFile() { - return file; - } - - public void wakeup() { - this.countDownLatch.countDown(); - } - - public void waitForClose(long timeout) { - try { - this.countDownLatch.await(timeout, TimeUnit.MILLISECONDS); - } - catch (InterruptedException e) { - LOGGER.error("Interrupted", e); - } - } - - } - - /** - * The type Write data file runnable. - */ - class WriteDataFileRunnable implements Runnable { - - private LinkedBlockingQueue storeRequests = new LinkedBlockingQueue<>(); - - public void putRequest(final StoreRequest request) { - storeRequests.add(request); - } - - @Override - public void run() { - while (!stopping) { - try { - StoreRequest storeRequest = storeRequests.poll(MAX_WAIT_TIME_MILLS, TimeUnit.MILLISECONDS); - handleStoreRequest(storeRequest); - } - catch (Exception exx) { - LOGGER.error("write file error: {}", exx.getMessage(), exx); - } - } - handleRestRequest(); - } - - /** - * handle the rest requests when stopping is true - */ - private void handleRestRequest() { - int remainNums = storeRequests.size(); - for (int i = 0; i < remainNums; i++) { - handleStoreRequest(storeRequests.poll()); - } - } - - private void handleStoreRequest(StoreRequest storeRequest) { - if (storeRequest == null) { - flushOnCondition(currFileChannel); - } - if (storeRequest instanceof SyncFlushRequest) { - syncFlush((SyncFlushRequest) storeRequest); - } - else if (storeRequest instanceof AsyncFlushRequest) { - async((AsyncFlushRequest) storeRequest); - } - else if (storeRequest instanceof CloseFileRequest) { - closeAndFlush((CloseFileRequest) storeRequest); - } - } - - private void closeAndFlush(CloseFileRequest req) { - long diff = FILE_TRX_NUM.get() - FILE_FLUSH_NUM.get(); - flush(req.getFileChannel()); - FILE_FLUSH_NUM.addAndGet(diff); - closeFile(req.getFile()); - req.wakeup(); - } - - private void async(AsyncFlushRequest req) { - flushOnCondition(req.getCurFileChannel()); - } - - private void syncFlush(SyncFlushRequest req) { - if (req.getCurFileTrxNum() > FILE_FLUSH_NUM.get()) { - long diff = FILE_TRX_NUM.get() - FILE_FLUSH_NUM.get(); - flush(req.getCurFileChannel()); - FILE_FLUSH_NUM.addAndGet(diff); - } - // notify - req.wakeup(); - } - - private void flushOnCondition(FileChannel fileChannel) { - if (FLUSH_DISK_MODE == FlushDiskMode.SYNC_MODEL) { - return; - } - long diff = FILE_TRX_NUM.get() - FILE_FLUSH_NUM.get(); - if (diff == 0) { - return; - } - if (diff % MAX_FLUSH_NUM == 0 || System.currentTimeMillis() - lastModifiedTime > MAX_FLUSH_TIME_MILLS) { - flush(fileChannel); - FILE_FLUSH_NUM.addAndGet(diff); - } - } - - private void flush(FileChannel fileChannel) { - try { - fileChannel.force(false); - } - catch (IOException exx) { - LOGGER.error("flush error: {}", exx.getMessage(), exx); - } - } - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/raft/lock/RaftDistributedLocker.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/raft/lock/RaftDistributedLocker.java deleted file mode 100644 index ea173a63e0..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/raft/lock/RaftDistributedLocker.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.raft.lock; - -import io.seata.common.ConfigurationKeys; -import io.seata.common.loader.LoadLevel; -import io.seata.config.ConfigurationFactory; -import io.seata.server.cluster.raft.RaftServerFactory; -import io.seata.core.store.DistributedLockDO; -import io.seata.core.store.DistributedLocker; -import io.seata.server.storage.redis.lock.RedisDistributedLocker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static io.seata.common.DefaultValues.DEFAULT_SEATA_GROUP; - -/** - * @description raft distributed lock - * @author funkye - */ -@LoadLevel(name = "raft") -public class RaftDistributedLocker implements DistributedLocker { - - protected static final Logger LOGGER = LoggerFactory.getLogger(RedisDistributedLocker.class); - - private final String group = ConfigurationFactory.getInstance() - .getConfig(ConfigurationKeys.SERVER_RAFT_GROUP, DEFAULT_SEATA_GROUP); - - /** - * Acquire the distributed lock - * @param distributedLockDO distributedLockDO - * @return boolean - */ - @Override - public boolean acquireLock(DistributedLockDO distributedLockDO) { - return RaftServerFactory.getInstance().isLeader(group); - } - - /** - * Release the distributed lock - * @param distributedLockDO distributedLockDO - * @return boolean - */ - @Override - public boolean releaseLock(DistributedLockDO distributedLockDO) { - return true; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/raft/lock/RaftLockManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/raft/lock/RaftLockManager.java deleted file mode 100644 index 8bcbc5b76e..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/raft/lock/RaftLockManager.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.raft.lock; - -import java.util.concurrent.CompletableFuture; -import com.alipay.sofa.jraft.Closure; -import io.seata.common.loader.LoadLevel; -import io.seata.core.exception.TransactionException; -import io.seata.core.exception.TransactionExceptionCode; -import io.seata.server.cluster.raft.sync.msg.RaftBranchSessionSyncMsg; -import io.seata.server.cluster.raft.sync.msg.RaftGlobalSessionSyncMsg; -import io.seata.server.cluster.raft.sync.msg.dto.BranchTransactionDTO; -import io.seata.server.cluster.raft.sync.msg.dto.GlobalTransactionDTO; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.storage.file.lock.FileLockManager; -import io.seata.server.cluster.raft.util.RaftTaskUtil; - -import static io.seata.server.cluster.raft.sync.msg.RaftSyncMsgType.RELEASE_BRANCH_SESSION_LOCK; -import static io.seata.server.cluster.raft.sync.msg.RaftSyncMsgType.RELEASE_GLOBAL_SESSION_LOCK; - -/** - * @author funkye - */ -@LoadLevel(name = "raft") -public class RaftLockManager extends FileLockManager { - - @Override - public boolean releaseGlobalSessionLock(GlobalSession globalSession) throws TransactionException { - GlobalTransactionDTO globalTransactionDTO = new GlobalTransactionDTO(); - globalTransactionDTO.setXid(globalSession.getXid()); - RaftGlobalSessionSyncMsg raftSyncMsg = new RaftGlobalSessionSyncMsg(RELEASE_GLOBAL_SESSION_LOCK, - globalTransactionDTO); - CompletableFuture completableFuture = new CompletableFuture<>(); - Closure closure = status -> { - if (status.isOk()) { - try { - completableFuture.complete(this.localReleaseGlobalSessionLock(globalSession)); - } - catch (TransactionException e) { - completableFuture.completeExceptionally(e); - } - } - else { - completableFuture.completeExceptionally(new TransactionException(TransactionExceptionCode.NotRaftLeader, - "seata raft state machine exception: " + status.getErrorMsg())); - } - }; - return RaftTaskUtil.createTask(closure, raftSyncMsg, completableFuture); - } - - @Override - public boolean releaseLock(BranchSession branchSession) throws TransactionException { - CompletableFuture completableFuture = new CompletableFuture<>(); - BranchTransactionDTO branchTransactionDTO = new BranchTransactionDTO(); - branchTransactionDTO.setBranchId(branchSession.getBranchId()); - branchTransactionDTO.setXid(branchSession.getXid()); - RaftBranchSessionSyncMsg raftSyncMsg = new RaftBranchSessionSyncMsg(RELEASE_BRANCH_SESSION_LOCK, - branchTransactionDTO); - Closure closure = status -> { - if (status.isOk()) { - try { - // ensure consistency through state machine reading - completableFuture.complete(super.releaseLock(branchSession)); - } - catch (TransactionException e) { - completableFuture.completeExceptionally(e); - } - } - else { - completableFuture.completeExceptionally(new TransactionException(TransactionExceptionCode.NotRaftLeader, - "seata raft state machine exception: " + status.getErrorMsg())); - } - }; - return RaftTaskUtil.createTask(closure, raftSyncMsg, completableFuture); - } - - public boolean localReleaseGlobalSessionLock(GlobalSession globalSession) throws TransactionException { - return super.releaseGlobalSessionLock(globalSession); - } - - public boolean localReleaseLock(BranchSession branchSession) throws TransactionException { - return super.releaseLock(branchSession); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/raft/session/RaftSessionManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/raft/session/RaftSessionManager.java deleted file mode 100644 index 8152280530..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/raft/session/RaftSessionManager.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.raft.session; - -import java.io.IOException; -import java.util.concurrent.CompletableFuture; -import com.alipay.sofa.jraft.Closure; -import io.seata.common.loader.LoadLevel; -import io.seata.common.loader.Scope; -import io.seata.core.exception.TransactionException; -import io.seata.core.exception.TransactionExceptionCode; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.GlobalStatus; -import io.seata.core.model.LockStatus; -import io.seata.server.cluster.raft.sync.msg.RaftBranchSessionSyncMsg; -import io.seata.server.cluster.raft.sync.msg.RaftGlobalSessionSyncMsg; -import io.seata.server.cluster.raft.sync.msg.dto.BranchTransactionDTO; -import io.seata.server.cluster.raft.sync.msg.dto.GlobalTransactionDTO; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.storage.SessionConverter; -import io.seata.server.storage.file.session.FileSessionManager; -import io.seata.server.cluster.raft.util.RaftTaskUtil; - -import static io.seata.server.cluster.raft.sync.msg.RaftSyncMsgType.ADD_BRANCH_SESSION; -import static io.seata.server.cluster.raft.sync.msg.RaftSyncMsgType.ADD_GLOBAL_SESSION; -import static io.seata.server.cluster.raft.sync.msg.RaftSyncMsgType.REMOVE_BRANCH_SESSION; -import static io.seata.server.cluster.raft.sync.msg.RaftSyncMsgType.REMOVE_GLOBAL_SESSION; -import static io.seata.server.cluster.raft.sync.msg.RaftSyncMsgType.UPDATE_BRANCH_SESSION_STATUS; -import static io.seata.server.cluster.raft.sync.msg.RaftSyncMsgType.UPDATE_GLOBAL_SESSION_STATUS; - -/** - * @author funkye - */ -@LoadLevel(name = "raft", scope = Scope.PROTOTYPE) -public class RaftSessionManager extends FileSessionManager { - - public RaftSessionManager(String name) throws IOException { - super(name); - } - - @Override - public void addGlobalSession(GlobalSession globalSession) throws TransactionException { - super.addGlobalSession(globalSession); - } - - @Override - public GlobalSession findGlobalSession(String xid) { - return super.findGlobalSession(xid); - } - - @Override - public void onBegin(GlobalSession globalSession) throws TransactionException { - CompletableFuture completableFuture = new CompletableFuture<>(); - Closure closure = status -> { - if (status.isOk()) { - try { - super.addGlobalSession(globalSession); - completableFuture.complete(true); - } - catch (TransactionException e) { - completableFuture.completeExceptionally(e); - } - } - else { - try { - completableFuture - .completeExceptionally(new TransactionException(TransactionExceptionCode.NotRaftLeader, - "seata raft state machine exception: " + status.getErrorMsg())); - } - finally { - try { - super.removeGlobalSession(globalSession); - } - catch (TransactionException e) { - completableFuture.completeExceptionally(e); - } - } - } - }; - GlobalTransactionDTO globalTransactionDTO = new GlobalTransactionDTO(); - SessionConverter.convertGlobalTransactionDO(globalTransactionDTO, globalSession); - RaftGlobalSessionSyncMsg raftSyncMsg = new RaftGlobalSessionSyncMsg(ADD_GLOBAL_SESSION, globalTransactionDTO); - RaftTaskUtil.createTask(closure, raftSyncMsg, completableFuture); - } - - @Override - public void onStatusChange(GlobalSession globalSession, GlobalStatus globalStatus) throws TransactionException { - CompletableFuture completableFuture = new CompletableFuture<>(); - Closure closure = closureStatus -> { - if (closureStatus.isOk()) { - globalSession.setStatus(globalStatus); - if (GlobalStatus.RollbackRetrying.equals(globalSession.getStatus()) - || GlobalStatus.Rollbacking.equals(globalSession.getStatus()) - || GlobalStatus.TimeoutRollbacking.equals(globalSession.getStatus())) { - globalSession.getBranchSessions() - .parallelStream() - .forEach(branchSession -> branchSession.setLockStatus(LockStatus.Rollbacking)); - } - completableFuture.complete(true); - } - else { - completableFuture.completeExceptionally(new TransactionException(TransactionExceptionCode.NotRaftLeader, - "seata raft state machine exception: " + closureStatus.getErrorMsg())); - } - }; - GlobalTransactionDTO globalTransactionDO = new GlobalTransactionDTO(globalSession.getXid()); - globalTransactionDO.setStatus(globalStatus.getCode()); - RaftGlobalSessionSyncMsg raftSyncMsg = new RaftGlobalSessionSyncMsg(UPDATE_GLOBAL_SESSION_STATUS, - globalTransactionDO); - RaftTaskUtil.createTask(closure, raftSyncMsg, completableFuture); - } - - @Override - public void onBranchStatusChange(GlobalSession globalSession, BranchSession branchSession, - BranchStatus branchStatus) throws TransactionException { - CompletableFuture completableFuture = new CompletableFuture<>(); - Closure closure = closureStatus -> { - if (closureStatus.isOk()) { - branchSession.setStatus(branchStatus); - completableFuture.complete(true); - } - else { - completableFuture.completeExceptionally(new TransactionException(TransactionExceptionCode.NotRaftLeader, - "seata raft state machine exception: " + closureStatus.getErrorMsg())); - } - }; - BranchTransactionDTO branchTransactionDO = new BranchTransactionDTO(globalSession.getXid(), - branchSession.getBranchId()); - branchTransactionDO.setStatus(branchStatus.getCode()); - RaftBranchSessionSyncMsg raftSyncMsg = new RaftBranchSessionSyncMsg(UPDATE_BRANCH_SESSION_STATUS, - branchTransactionDO); - RaftTaskUtil.createTask(closure, raftSyncMsg, completableFuture); - } - - @Override - public void onAddBranch(GlobalSession globalSession, BranchSession branchSession) throws TransactionException { - CompletableFuture completableFuture = new CompletableFuture<>(); - branchSession.setStatus(BranchStatus.Registered); - Closure closure = status -> { - if (status.isOk()) { - completableFuture.complete(globalSession.add(branchSession)); - } - else { - try { - completableFuture - .completeExceptionally(new TransactionException(TransactionExceptionCode.NotRaftLeader, - "seata raft state machine exception: " + status.getErrorMsg())); - } - finally { - try { - globalSession.removeBranch(branchSession); - } - catch (TransactionException e) { - completableFuture.completeExceptionally(e); - } - } - } - }; - BranchTransactionDTO branchTransactionDTO = new BranchTransactionDTO(); - SessionConverter.convertBranchTransaction(branchTransactionDTO, branchSession); - RaftBranchSessionSyncMsg raftSyncMsg = new RaftBranchSessionSyncMsg(ADD_BRANCH_SESSION, branchTransactionDTO); - RaftTaskUtil.createTask(closure, raftSyncMsg, completableFuture); - } - - @Override - public void onRemoveBranch(GlobalSession globalSession, BranchSession branchSession) throws TransactionException { - CompletableFuture completableFuture = new CompletableFuture<>(); - Closure closure = closureStatus -> { - if (closureStatus.isOk()) { - completableFuture.complete(globalSession.remove(branchSession)); - } - else { - completableFuture.completeExceptionally(new TransactionException(TransactionExceptionCode.NotRaftLeader, - "seata raft state machine exception: " + closureStatus.getErrorMsg())); - } - }; - BranchTransactionDTO branchTransactionDO = new BranchTransactionDTO(globalSession.getXid(), - branchSession.getBranchId()); - RaftBranchSessionSyncMsg raftSyncMsg = new RaftBranchSessionSyncMsg(REMOVE_BRANCH_SESSION, branchTransactionDO); - RaftTaskUtil.createTask(closure, raftSyncMsg, completableFuture); - } - - @Override - public void onSuccessEnd(GlobalSession globalSession) throws TransactionException { - CompletableFuture completableFuture = new CompletableFuture<>(); - Closure closure = status -> { - if (status.isOk()) { - try { - super.removeGlobalSession(globalSession); - completableFuture.complete(true); - } - catch (TransactionException e) { - completableFuture.completeExceptionally(e); - } - } - else { - completableFuture.completeExceptionally(new TransactionException(TransactionExceptionCode.NotRaftLeader, - "seata raft state machine exception: " + status.getErrorMsg())); - } - }; - GlobalTransactionDTO globalTransactionDO = new GlobalTransactionDTO(globalSession.getXid()); - RaftGlobalSessionSyncMsg raftSyncMsg = new RaftGlobalSessionSyncMsg(REMOVE_GLOBAL_SESSION, globalTransactionDO); - RaftTaskUtil.createTask(closure, raftSyncMsg, completableFuture); - } - - @Override - public void onFailEnd(GlobalSession globalSession) throws TransactionException { - super.onFailEnd(globalSession); - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public void destroy() { - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/JedisPooledFactory.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/JedisPooledFactory.java deleted file mode 100644 index 6bddac2ba9..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/JedisPooledFactory.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.redis; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import io.seata.common.exception.RedisException; -import io.seata.common.util.ConfigTools; -import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import redis.clients.jedis.JedisPool; -import redis.clients.jedis.JedisPoolAbstract; -import redis.clients.jedis.JedisPoolConfig; -import redis.clients.jedis.JedisSentinelPool; -import redis.clients.jedis.Protocol; -import redis.clients.jedis.Jedis; -import static io.seata.common.DefaultValues.DEFAULT_REDIS_MAX_IDLE; -import static io.seata.common.DefaultValues.DEFAULT_REDIS_MAX_TOTAL; -import static io.seata.common.DefaultValues.DEFAULT_REDIS_MIN_IDLE; - -/** - * @author funkye - */ -public class JedisPooledFactory { - - /** - * The constant LOGGER. - */ - protected static final Logger LOGGER = LoggerFactory.getLogger(JedisPooledFactory.class); - - private static volatile JedisPoolAbstract jedisPool = null; - - private static final String HOST = "127.0.0.1"; - - private static final int PORT = 6379; - - private static final int DATABASE = 0; - - private static final int SENTINEL_HOST_NUMBER = 3; - - private static final Configuration CONFIGURATION = ConfigurationFactory.getInstance(); - - /** - * get the RedisPool instance (singleton) - * @return redisPool - */ - public static JedisPoolAbstract getJedisPoolInstance(JedisPoolAbstract... jedisPools) { - if (jedisPool == null) { - synchronized (JedisPooledFactory.class) { - if (jedisPool == null) { - JedisPoolAbstract tempJedisPool = null; - if (jedisPools != null && jedisPools.length > 0) { - tempJedisPool = jedisPools[0]; - } - else { - String password = CONFIGURATION.getConfig(ConfigurationKeys.STORE_REDIS_PASSWORD); - if (StringUtils.isBlank(password)) { - password = null; - } - else { - String publicKey = CONFIGURATION.getConfig(ConfigurationKeys.STORE_PUBLIC_KEY); - if (StringUtils.isNotBlank(publicKey)) { - try { - password = ConfigTools.publicDecrypt(password, publicKey); - } - catch (Exception e) { - LOGGER.error( - "decryption failed,please confirm whether the ciphertext and secret key are correct! error msg: {}", - e.getMessage()); - } - } - } - JedisPoolConfig poolConfig = new JedisPoolConfig(); - poolConfig.setMinIdle( - CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_MIN_CONN, DEFAULT_REDIS_MIN_IDLE)); - poolConfig.setMaxIdle( - CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_MAX_CONN, DEFAULT_REDIS_MAX_IDLE)); - poolConfig.setMaxTotal( - CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_MAX_TOTAL, DEFAULT_REDIS_MAX_TOTAL)); - String mode = CONFIGURATION.getConfig(ConfigurationKeys.STORE_REDIS_MODE, - ConfigurationKeys.REDIS_SINGLE_MODE); - if (mode.equals(ConfigurationKeys.REDIS_SENTINEL_MODE)) { - String masterName = CONFIGURATION - .getConfig(ConfigurationKeys.STORE_REDIS_SENTINEL_MASTERNAME); - if (StringUtils.isBlank(masterName)) { - throw new RedisException("The masterName is null in redis sentinel mode"); - } - Set sentinels = new HashSet<>(SENTINEL_HOST_NUMBER); - String[] sentinelHosts = CONFIGURATION - .getConfig(ConfigurationKeys.STORE_REDIS_SENTINEL_HOST) - .split(","); - Arrays.asList(sentinelHosts).forEach(sentinelHost -> sentinels.add(sentinelHost)); - String sentinelPassword = CONFIGURATION - .getConfig(ConfigurationKeys.STORE_REDIS_SENTINEL_PASSWORD); - if (StringUtils.isBlank(sentinelPassword)) { - sentinelPassword = null; - } - tempJedisPool = new JedisSentinelPool(masterName, sentinels, poolConfig, 60000, 60000, - password, CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_DATABASE, DATABASE), - null, Protocol.DEFAULT_TIMEOUT, Protocol.DEFAULT_TIMEOUT, sentinelPassword, null); - } - else if (mode.equals(ConfigurationKeys.REDIS_SINGLE_MODE)) { - String host = CONFIGURATION.getConfig(ConfigurationKeys.STORE_REDIS_SINGLE_HOST); - host = StringUtils.isBlank(host) - ? CONFIGURATION.getConfig(ConfigurationKeys.STORE_REDIS_HOST, HOST) : host; - int port = CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_SINGLE_PORT); - port = port == 0 ? CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_PORT, PORT) : port; - tempJedisPool = new JedisPool(poolConfig, host, port, 60000, password, - CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_DATABASE, DATABASE)); - } - else { - throw new RedisException("Configuration error of redis cluster mode"); - } - } - if (LOGGER.isInfoEnabled()) { - LOGGER.info("initialization of the build redis connection pool is complete"); - } - jedisPool = tempJedisPool; - } - } - } - return jedisPool; - } - - /** - * get an instance of Jedis (connection) from the connection pool - * @return jedis - */ - public static Jedis getJedisInstance() { - return getJedisPoolInstance().getResource(); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/LuaParser.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/LuaParser.java deleted file mode 100644 index fcef449bcb..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/LuaParser.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.redis; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Serializable; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import io.seata.common.exception.StoreException; -import io.seata.common.io.FileLoader; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.exceptions.JedisDataException; -import redis.clients.jedis.exceptions.JedisNoScriptException; - -/** - * lua related utils - * - * @author conghuhu - */ -public class LuaParser { - - private static final Logger LOGGER = LoggerFactory.getLogger(LuaParser.class); - - private static final String WHITE_SPACE = " "; - - private static final String ANNOTATION_LUA = "--"; - - private static final Map LUA_FILE_MAP = new HashMap<>(); - - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - - public final static class LuaResult implements Serializable { - - private static final long serialVersionUID = -4160065043902060730L; - - private Boolean success; - - private String status; - - private String data; - - public Boolean getSuccess() { - return success; - } - - public void setSuccess(Boolean success) { - this.success = success; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - @Override - public String toString() { - return "LuaResult{" + "success=" + success + ", type='" + status + '\'' + ", data='" + data + '\'' + '}'; - } - - } - - public final static class LuaErrorStatus { - - public static final String ANOTHER_ROLLBACKING = "AnotherRollbackIng"; - - public static final String ANOTHER_HOLDING = "AnotherHoldIng"; - - public static final String XID_NOT_EXISTED = "NotExisted"; - - public static final String ILLEGAL_CHANGE_STATUS = "ChangeStatusFail"; - - } - - /** - * get lua string from lua file. - * @param fileName - * @return - * @throws IOException - */ - public static Map getEvalShaMapFromFile(String fileName) throws IOException { - File luaFile = FileLoader.load(fileName); - if (luaFile == null) { - throw new IOException("no lua file: " + fileName); - } - StringBuilder luaByFile = new StringBuilder(); - try (FileInputStream fis = new FileInputStream(luaFile)) { - BufferedReader br = new BufferedReader(new InputStreamReader(fis)); - String line; - while ((line = br.readLine()) != null) { - if (line.trim().startsWith(ANNOTATION_LUA)) { - continue; - } - luaByFile.append(line); - luaByFile.append(WHITE_SPACE); - } - } - catch (IOException e) { - throw new IOException(e); - } - LUA_FILE_MAP.put(fileName, luaByFile.toString()); - Map resultMap = new ConcurrentHashMap<>(1); - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - resultMap.put(fileName, jedis.scriptLoad(luaByFile.toString())); - return resultMap; - } - catch (UnsupportedOperationException | JedisDataException e) { - throw new IOException(e); - } - } - - public static T getObjectFromJson(String json, Class classz) { - try { - return OBJECT_MAPPER.readValue(json, classz); - } - catch (JsonProcessingException e) { - throw new StoreException(e.getMessage()); - } - } - - public static List getListFromJson(String json, Class classz) { - ObjectMapper objectMapper = new ObjectMapper(); - try { - return objectMapper.readValue(json, new TypeReference>() { - }); - } - catch (JsonProcessingException e) { - throw new StoreException(e.getMessage()); - } - } - - public static Object jedisEvalSha(Jedis jedis, String luaSHA, String luaFileName, List keys, - List args) { - try { - return jedis.evalsha(luaSHA, keys, args); - } - catch (JedisNoScriptException e) { - LOGGER.warn("try to reload the lua script and execute,jedis ex: " + e.getMessage()); - jedis.scriptLoad(LUA_FILE_MAP.get(luaFileName)); - return jedis.evalsha(luaSHA, keys, args); - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisDistributedLocker.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisDistributedLocker.java deleted file mode 100644 index 9d9b934706..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisDistributedLocker.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.redis.lock; - -import io.seata.common.loader.LoadLevel; -import io.seata.common.loader.Scope; -import io.seata.core.store.DistributedLockDO; -import io.seata.core.store.DistributedLocker; -import io.seata.server.storage.redis.JedisPooledFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.Transaction; -import redis.clients.jedis.params.SetParams; - -/** - * Redis distributed lock - * - * @author zhongxiang.wang - */ -@LoadLevel(name = "redis", scope = Scope.SINGLETON) -public class RedisDistributedLocker implements DistributedLocker { - - protected static final Logger LOGGER = LoggerFactory.getLogger(RedisDistributedLocker.class); - - private static final String SUCCESS = "OK"; - - /** - * Acquire the distributed lock - * @param distributedLockDO the distributed lock info - * @return the distributed lock info - */ - @Override - public boolean acquireLock(DistributedLockDO distributedLockDO) { - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - // Don't need retry,if can't acquire the lock,let the other get the lock - String result = jedis.set(distributedLockDO.getLockKey(), distributedLockDO.getLockValue(), - SetParams.setParams().nx().px(distributedLockDO.getExpireTime())); - return SUCCESS.equalsIgnoreCase(result); - } - catch (Exception ex) { - LOGGER.error("The {} acquired the {} distributed lock failed.", distributedLockDO.getLockValue(), - distributedLockDO.getLockKey(), ex); - return false; - } - } - - /** - * Release the distributed lock - * @param distributedLockDO the distributed lock info - * @return the boolean - */ - @Override - public boolean releaseLock(DistributedLockDO distributedLockDO) { - String lockKey = distributedLockDO.getLockKey(); - String lockValue = distributedLockDO.getLockValue(); - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - jedis.watch(lockKey); - // Check the value to prevent release the other's lock - if (lockValue.equals(jedis.get(lockKey))) { - Transaction multi = jedis.multi(); - multi.del(lockKey); - multi.exec(); - return true; - } - // The lock hold by others,If other one get the lock,we release lock success - // too as for current lockKey - jedis.unwatch(); - return true; - } - catch (Exception ex) { - LOGGER.error("The {} release the {} distributed lock failed.", lockValue, lockKey, ex); - return false; - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisLockManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisLockManager.java deleted file mode 100644 index a6eb3bf91e..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisLockManager.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.redis.lock; - -import io.seata.common.executor.Initialize; -import io.seata.common.loader.LoadLevel; -import io.seata.core.exception.TransactionException; -import io.seata.core.lock.Locker; -import io.seata.server.lock.AbstractLockManager; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; - -/** - * @author funkye - */ -@LoadLevel(name = "redis") -public class RedisLockManager extends AbstractLockManager implements Initialize { - - /** - * The locker. - */ - private Locker locker; - - @Override - public void init() { - locker = RedisLockerFactory.getLocker(); - } - - @Override - public Locker getLocker(BranchSession branchSession) { - return locker; - } - - @Override - public boolean releaseLock(BranchSession branchSession) throws TransactionException { - try { - return getLocker().releaseLock(branchSession.getXid(), branchSession.getBranchId()); - } - catch (Exception t) { - LOGGER.error("unLock error, xid {}, branchId:{}", branchSession.getXid(), branchSession.getBranchId(), t); - return false; - } - } - - @Override - public boolean releaseGlobalSessionLock(GlobalSession globalSession) throws TransactionException { - try { - return getLocker().releaseLock(globalSession.getXid()); - } - catch (Exception t) { - LOGGER.error("unLock globalSession error, xid:{}", globalSession.getXid(), t); - return false; - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisLocker.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisLocker.java deleted file mode 100644 index 6190c1ccd6..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisLocker.java +++ /dev/null @@ -1,314 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.redis.lock; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.StringJoiner; -import java.util.stream.Collectors; - -import io.seata.common.exception.StoreException; -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.LambdaUtils; -import io.seata.common.util.StringUtils; -import io.seata.core.exception.BranchTransactionException; -import io.seata.core.lock.AbstractLocker; -import io.seata.core.lock.RowLock; -import io.seata.core.model.LockStatus; -import io.seata.core.store.LockDO; -import io.seata.server.storage.redis.JedisPooledFactory; - -import com.google.common.collect.Lists; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.Pipeline; - -import static io.seata.common.Constants.ROW_LOCK_KEY_SPLIT_CHAR; -import static io.seata.core.constants.RedisKeyConstants.DEFAULT_REDIS_SEATA_GLOBAL_LOCK_PREFIX; -import static io.seata.core.constants.RedisKeyConstants.DEFAULT_REDIS_SEATA_ROW_LOCK_PREFIX; -import static io.seata.core.exception.TransactionExceptionCode.LockKeyConflictFailFast; - -/** - * The redis lock store operation - * - * @author funkye - * @author wangzhongxiang - * @author conghuhu - */ -public class RedisLocker extends AbstractLocker { - - private static final Logger LOGGER = LoggerFactory.getLogger(RedisLocker.class); - - private static final Integer SUCCEED = 1; - - private static final Integer FAILED = 0; - - private static final String XID = "xid"; - - private static final String TRANSACTION_ID = "transactionId"; - - private static final String BRANCH_ID = "branchId"; - - private static final String RESOURCE_ID = "resourceId"; - - private static final String TABLE_NAME = "tableName"; - - private static final String PK = "pk"; - - protected static final String STATUS = "status"; - - private static final String ROW_KEY = "rowKey"; - - /** - * Instantiates a new Redis locker. - */ - public RedisLocker() { - } - - @Override - public boolean acquireLock(List rowLocks) { - return acquireLock(rowLocks, true, false); - } - - @Override - public boolean acquireLock(List rowLocks, boolean autoCommit, boolean skipCheckLock) { - if (CollectionUtils.isEmpty(rowLocks)) { - return true; - } - - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - String needLockXid = rowLocks.get(0).getXid(); - Long branchId = rowLocks.get(0).getBranchId(); - List needLockDOS = convertToLockDO(rowLocks); - if (needLockDOS.size() > 1) { - needLockDOS = needLockDOS.stream() - .filter(LambdaUtils.distinctByKey(LockDO::getRowKey)) - .collect(Collectors.toList()); - } - List needLockKeys = new ArrayList<>(); - needLockDOS.forEach(lockDO -> needLockKeys.add(buildLockKey(lockDO.getRowKey()))); - Map needAddLock = new HashMap<>(needLockKeys.size(), 1); - - if (!skipCheckLock) { - Pipeline pipeline1 = jedis.pipelined(); - needLockKeys.stream().forEachOrdered(needLockKey -> { - pipeline1.hget(needLockKey, XID); - if (!autoCommit) { - pipeline1.hget(needLockKey, STATUS); - } - }); - List> existedLockInfos = Lists - .partition((List) (List) pipeline1.syncAndReturnAll(), autoCommit ? 1 : 2); - - // When the local transaction and the global transaction are enabled, - // the branch registration fails to acquire the global lock, - // the lock holder is in the second-stage rollback, - // and the branch registration fails to be retried quickly, - // because the retry with the local transaction does not release the - // database lock , - // resulting in a two-phase rollback wait. - // Therefore, if a global lock is found in the Rollbacking state, - // the fail-fast code is returned directly. - if (!autoCommit) { - boolean hasRollBackingLock = existedLockInfos.parallelStream() - .anyMatch(result -> StringUtils.equals(result.get(1), - String.valueOf(LockStatus.Rollbacking.getCode()))); - if (hasRollBackingLock) { - throw new StoreException(new BranchTransactionException(LockKeyConflictFailFast)); - } - } - - // The logic is executed here, there must be a lock without Rollbacking - // status when autoCommit equals false - for (int i = 0; i < needLockKeys.size(); i++) { - List results = existedLockInfos.get(i); - String existedLockXid = CollectionUtils.isEmpty(results) ? null : existedLockInfos.get(i).get(0); - if (StringUtils.isEmpty(existedLockXid)) { - // If empty,we need to lock this row - needAddLock.put(needLockKeys.get(i), needLockDOS.get(i)); - } - else { - if (!StringUtils.equals(existedLockXid, needLockXid)) { - // If not equals,means the rowkey is holding by another global - // transaction - logGlobalLockConflictInfo(needLockXid, needLockKeys.get(i), existedLockXid); - return false; - } - } - } - if (needAddLock.isEmpty()) { - return true; - } - } - - Pipeline pipeline = jedis.pipelined(); - List readyKeys = new ArrayList<>(needAddLock.keySet()); - needAddLock.forEach((key, value) -> { - pipeline.hsetnx(key, XID, value.getXid()); - pipeline.hsetnx(key, TRANSACTION_ID, value.getTransactionId().toString()); - pipeline.hsetnx(key, BRANCH_ID, value.getBranchId().toString()); - pipeline.hset(key, ROW_KEY, value.getRowKey()); - pipeline.hset(key, RESOURCE_ID, value.getResourceId()); - pipeline.hset(key, TABLE_NAME, value.getTableName()); - pipeline.hset(key, PK, value.getPk()); - }); - List results = (List) (List) pipeline.syncAndReturnAll(); - List> partitions = Lists.partition(results, 7); - - ArrayList success = new ArrayList<>(partitions.size()); - Integer status = SUCCEED; - for (int i = 0; i < partitions.size(); i++) { - if (Objects.equals(partitions.get(i).get(0), FAILED)) { - status = FAILED; - } - else { - success.add(readyKeys.get(i)); - } - } - - // If someone has failed,all the lockkey which has been added need to be - // delete. - if (FAILED.equals(status)) { - if (success.size() > 0) { - jedis.del(success.toArray(new String[0])); - } - return false; - } - String xidLockKey = buildXidLockKey(needLockXid); - StringJoiner lockKeysString = new StringJoiner(ROW_LOCK_KEY_SPLIT_CHAR); - needLockKeys.forEach(lockKeysString::add); - jedis.hset(xidLockKey, branchId.toString(), lockKeysString.toString()); - return true; - } - } - - protected void logGlobalLockConflictInfo(String needLockXid, String lockKey, String xIdOwnLock) { - LOGGER.info("tx:[{}] acquire Global lock failed. Global lock on [{}] is holding by xid {}", needLockXid, - lockKey, xIdOwnLock); - } - - @Override - public boolean releaseLock(String xid) { - return doReleaseLock(xid, null); - } - - @Override - public boolean releaseLock(String xid, Long branchId) { - if (branchId == null) { - return true; - } - return doReleaseLock(xid, branchId); - } - - @Override - public boolean isLockable(List rowLocks) { - if (CollectionUtils.isEmpty(rowLocks)) { - return true; - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - List locks = convertToLockDO(rowLocks); - Set lockKeys = new HashSet<>(); - for (LockDO rowlock : locks) { - lockKeys.add(buildLockKey(rowlock.getRowKey())); - } - - String xid = rowLocks.get(0).getXid(); - try (Pipeline pipeline = jedis.pipelined()) { - lockKeys.forEach(key -> pipeline.hget(key, XID)); - List existedXids = (List) (List) pipeline.syncAndReturnAll(); - return existedXids.stream().allMatch(existedXid -> existedXid == null || xid.equals(existedXid)); - } - } - } - - @Override - public void updateLockStatus(String xid, LockStatus lockStatus) { - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - String xidLockKey = buildXidLockKey(xid); - Map branchAndLockKeys = jedis.hgetAll(xidLockKey); - if (CollectionUtils.isEmpty(branchAndLockKeys)) { - return; - } - try (Pipeline pipeline = jedis.pipelined()) { - branchAndLockKeys.values().forEach(k -> { - if (StringUtils.isNotEmpty(k)) { - if (k.contains(ROW_LOCK_KEY_SPLIT_CHAR)) { - String[] keys = k.split(ROW_LOCK_KEY_SPLIT_CHAR); - for (String key : keys) { - pipeline.hset(key, STATUS, String.valueOf(lockStatus.getCode())); - } - } - else { - pipeline.hset(k, STATUS, String.valueOf(lockStatus.getCode())); - } - } - }); - pipeline.sync(); - } - } - } - - private boolean doReleaseLock(String xid, Long branchId) { - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - String xidLockKey = buildXidLockKey(xid); - final List rowKeys = new ArrayList<>(); - if (null == branchId) { - Map rowKeyMap = jedis.hgetAll(xidLockKey); - rowKeyMap.forEach((branch, rowKey) -> rowKeys.add(rowKey)); - } - else { - rowKeys.add(jedis.hget(xidLockKey, branchId.toString())); - } - if (CollectionUtils.isNotEmpty(rowKeys)) { - Pipeline pipelined = jedis.pipelined(); - if (null == branchId) { - pipelined.del(xidLockKey); - } - else { - pipelined.hdel(xidLockKey, branchId.toString()); - } - rowKeys.forEach(rowKeyStr -> { - if (StringUtils.isNotEmpty(rowKeyStr)) { - if (rowKeyStr.contains(ROW_LOCK_KEY_SPLIT_CHAR)) { - String[] keys = rowKeyStr.split(ROW_LOCK_KEY_SPLIT_CHAR); - pipelined.del(keys); - } - else { - pipelined.del(rowKeyStr); - } - } - }); - pipelined.sync(); - } - return true; - } - } - - protected String buildXidLockKey(String xid) { - return DEFAULT_REDIS_SEATA_GLOBAL_LOCK_PREFIX + xid; - } - - protected String buildLockKey(String rowKey) { - return DEFAULT_REDIS_SEATA_ROW_LOCK_PREFIX + rowKey; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisLockerFactory.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisLockerFactory.java deleted file mode 100644 index 27ae051849..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisLockerFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.redis.lock; - -import io.seata.common.ConfigurationKeys; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.core.lock.Locker; - -import static io.seata.common.Constants.STORE_REDIS_TYPE_PIPELINE; - -/** - * @author conghuhu - */ -public class RedisLockerFactory { - - private static final Configuration CONFIG = ConfigurationFactory.getInstance(); - - /** - * The locker. - */ - private static volatile Locker locker; - - public static Locker getLocker() { - if (locker == null) { - synchronized (RedisLockerFactory.class) { - if (locker == null) { - String storeRedisType = CONFIG.getConfig(ConfigurationKeys.STORE_REDIS_TYPE, - STORE_REDIS_TYPE_PIPELINE); - locker = STORE_REDIS_TYPE_PIPELINE.equals(storeRedisType) ? new RedisLocker() - : new RedisLuaLocker(); - } - } - } - return locker; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisLuaLocker.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisLuaLocker.java deleted file mode 100644 index 40cd3f5e56..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/lock/RedisLuaLocker.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.redis.lock; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.StringJoiner; -import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import redis.clients.jedis.Jedis; - -import io.seata.common.exception.StoreException; -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.LambdaUtils; -import io.seata.core.exception.BranchTransactionException; -import io.seata.core.lock.RowLock; -import io.seata.core.model.LockStatus; -import io.seata.core.store.LockDO; -import io.seata.server.storage.redis.JedisPooledFactory; -import io.seata.server.storage.redis.LuaParser; - -import static io.seata.common.Constants.ROW_LOCK_KEY_SPLIT_CHAR; -import static io.seata.core.exception.TransactionExceptionCode.LockKeyConflictFailFast; - -/** - * @author conghuhu - */ -public class RedisLuaLocker extends RedisLocker { - - private static final Logger LOGGER = LoggerFactory.getLogger(RedisLuaLocker.class); - - private static final String LUA_PREFIX = "lua/redislocker/"; - - private static final String ACQUIRE_LOCK_LUA_FILE_NAME = LUA_PREFIX + "acquireRedisLock.lua"; - - private static final String RELEASE_LOCK_LUA_FILE_NAME = LUA_PREFIX + "releaseRedisLock.lua"; - - private static final String UPDATE_LOCK_LUA_FILE_NAME = LUA_PREFIX + "updateLockStatus.lua"; - - private static final String LOCKABLE_LUA_FILE_NAME = LUA_PREFIX + "isLockable.lua"; - - /** - * key filename value LOCK_SHA_SCRIPT - */ - private static final Map LOCK_SHA_MAP = new HashMap<>(4); - - public RedisLuaLocker() { - if (LOCK_SHA_MAP.isEmpty()) { - loadLuaFile(ACQUIRE_LOCK_LUA_FILE_NAME, "acquire lock"); - loadLuaFile(RELEASE_LOCK_LUA_FILE_NAME, "release lock"); - loadLuaFile(UPDATE_LOCK_LUA_FILE_NAME, "update lock"); - loadLuaFile(LOCKABLE_LUA_FILE_NAME, "lockable"); - } - } - - private void loadLuaFile(String fileName, String mode) { - try { - LOCK_SHA_MAP.putAll(LuaParser.getEvalShaMapFromFile(fileName)); - } - catch (IOException e) { - // if it fails to read the file, pipeline mode is used - if (LOCK_SHA_MAP.get(fileName) != null) { - LOCK_SHA_MAP.remove(fileName); - } - if (LOGGER.isInfoEnabled()) { - LOGGER.info("redis locker: {} use pipeline mode", mode); - } - } - } - - @Override - public boolean acquireLock(List rowLocks, boolean autoCommit, boolean skipCheckLock) { - if (CollectionUtils.isEmpty(rowLocks)) { - return true; - } - - String luaSHA = LOCK_SHA_MAP.get(ACQUIRE_LOCK_LUA_FILE_NAME); - if (luaSHA == null) { - return super.acquireLock(rowLocks, autoCommit, skipCheckLock); - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - String needLockXid = rowLocks.get(0).getXid(); - Long branchId = rowLocks.get(0).getBranchId(); - List needLockDOs = rowLocks.stream() - .map(this::convertToLockDO) - .filter(LambdaUtils.distinctByKey(LockDO::getRowKey)) - .collect(Collectors.toList()); - List keys = new ArrayList<>(); - List args = new ArrayList<>(); - int size = needLockDOs.size(); - args.add(String.valueOf(size)); - // args index 2 placeholder - args.add(null); - args.add(needLockXid); - for (LockDO lockDO : needLockDOs) { - keys.add(buildLockKey(lockDO.getRowKey())); - args.add(lockDO.getTransactionId().toString()); - args.add(lockDO.getBranchId().toString()); - args.add(lockDO.getResourceId()); - args.add(lockDO.getTableName()); - args.add(lockDO.getRowKey()); - args.add(lockDO.getPk()); - } - String xidLockKey = buildXidLockKey(needLockXid); - StringJoiner lockKeysString = new StringJoiner(ROW_LOCK_KEY_SPLIT_CHAR); - needLockDOs.stream().map(lockDO -> buildLockKey(lockDO.getRowKey())).forEach(lockKeysString::add); - - keys.add(xidLockKey); - keys.add(branchId.toString()); - args.add(lockKeysString.toString()); - // reset args index 2 - args.set(1, String.valueOf(args.size())); - - String result = (String) LuaParser.jedisEvalSha(jedis, luaSHA, ACQUIRE_LOCK_LUA_FILE_NAME, keys, args); - - LuaParser.LuaResult luaResult = LuaParser.getObjectFromJson(result, LuaParser.LuaResult.class); - - // luaResult.getData() : xIdOwnLock - if (luaResult.getSuccess() && luaResult.getData().equals(needLockXid)) { - return true; - } - else { - if (LuaParser.LuaErrorStatus.ANOTHER_ROLLBACKING.equals(luaResult.getStatus())) { - // if a global lock is found in the Rollbacking state,the fail-fast - // code is returned directly. - throw new StoreException(new BranchTransactionException(LockKeyConflictFailFast)); - } - else if (LuaParser.LuaErrorStatus.ANOTHER_HOLDING.equals(luaResult.getStatus())) { - // means the rowKey is holding by another global transaction - logGlobalLockConflictInfo(needLockXid, keys.get(0), luaResult.getData()); - } - return false; - } - } - } - - @Override - public boolean releaseLock(String xid) { - String luaSHA = LOCK_SHA_MAP.get(RELEASE_LOCK_LUA_FILE_NAME); - if (luaSHA == null) { - return super.releaseLock(xid); - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - String xidLockKey = buildXidLockKey(xid); - List keys = new ArrayList<>(); - List args = Collections.emptyList(); - keys.add(xidLockKey); - LuaParser.jedisEvalSha(jedis, luaSHA, RELEASE_LOCK_LUA_FILE_NAME, keys, args); - return true; - } - } - - @Override - public boolean releaseLock(String xid, Long branchId) { - if (branchId == null) { - return true; - } - String luaSHA = LOCK_SHA_MAP.get(RELEASE_LOCK_LUA_FILE_NAME); - if (luaSHA == null) { - return super.releaseLock(xid, branchId); - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - String xidLockKey = buildXidLockKey(xid); - List keys = new ArrayList<>(); - List args = Collections.emptyList(); - keys.add(xidLockKey); - keys.add(String.valueOf(branchId)); - LuaParser.jedisEvalSha(jedis, luaSHA, RELEASE_LOCK_LUA_FILE_NAME, keys, args); - return true; - } - } - - @Override - public boolean isLockable(List rowLocks) { - if (CollectionUtils.isEmpty(rowLocks)) { - return true; - } - String luaSHA = LOCK_SHA_MAP.get(LOCKABLE_LUA_FILE_NAME); - if (luaSHA == null) { - return super.isLockable(rowLocks); - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - List locks = convertToLockDO(rowLocks); - Set lockKeys = new HashSet<>(); - for (LockDO rowlock : locks) { - lockKeys.add(buildLockKey(rowlock.getRowKey())); - } - String xid = rowLocks.get(0).getXid(); - List keys = new ArrayList<>(); - keys.add(String.valueOf(lockKeys.size())); - keys.addAll(lockKeys); - List args = new ArrayList<>(); - args.add(xid); - String res = (String) LuaParser.jedisEvalSha(jedis, luaSHA, LOCKABLE_LUA_FILE_NAME, keys, args); - return "true".equals(res); - } - } - - @Override - public void updateLockStatus(String xid, LockStatus lockStatus) { - String luaSHA = LOCK_SHA_MAP.get(UPDATE_LOCK_LUA_FILE_NAME); - if (luaSHA == null) { - super.updateLockStatus(xid, lockStatus); - return; - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - String xidLockKey = buildXidLockKey(xid); - List keys = new ArrayList<>(); - List args = new ArrayList<>(); - keys.add(xidLockKey); - keys.add(STATUS); - args.add(String.valueOf(lockStatus.getCode())); - LuaParser.jedisEvalSha(jedis, luaSHA, UPDATE_LOCK_LUA_FILE_NAME, keys, args); - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/session/RedisSessionManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/session/RedisSessionManager.java deleted file mode 100644 index ebac73e94d..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/session/RedisSessionManager.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.redis.session; - -import java.util.Collection; -import java.util.List; - -import io.seata.common.exception.StoreException; -import io.seata.common.executor.Initialize; -import io.seata.common.loader.LoadLevel; -import io.seata.common.loader.Scope; -import io.seata.core.exception.TransactionException; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.GlobalStatus; -import io.seata.server.session.AbstractSessionManager; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionCondition; -import io.seata.server.store.TransactionStoreManager.LogOperation; -import io.seata.server.storage.redis.store.RedisTransactionStoreManagerFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author funkye - */ -@LoadLevel(name = "redis", scope = Scope.PROTOTYPE) -public class RedisSessionManager extends AbstractSessionManager implements Initialize { - - /** - * The constant LOGGER. - */ - protected static final Logger LOGGER = LoggerFactory.getLogger(RedisSessionManager.class); - - /** - * Instantiates a new Data base session manager. - */ - public RedisSessionManager() { - super(); - } - - @Override - public void init() { - transactionStoreManager = RedisTransactionStoreManagerFactory.getInstance(); - } - - @Override - public void addGlobalSession(GlobalSession session) throws TransactionException { - boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_ADD, session); - if (!ret) { - throw new StoreException("addGlobalSession failed."); - } - } - - @Override - public void updateGlobalSessionStatus(GlobalSession session, GlobalStatus status) throws TransactionException { - session.setStatus(status); - boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_UPDATE, session); - if (!ret) { - throw new StoreException("updateGlobalSessionStatus failed."); - } - } - - /** - * remove globalSession 1. rootSessionManager remove normal globalSession 2. - * retryCommitSessionManager and retryRollbackSessionManager remove retry expired - * globalSession - * @param session the session - * @throws TransactionException - */ - @Override - public void removeGlobalSession(GlobalSession session) throws TransactionException { - boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_REMOVE, session); - if (!ret) { - throw new StoreException("removeGlobalSession failed."); - } - } - - @Override - public void addBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException { - boolean ret = transactionStoreManager.writeSession(LogOperation.BRANCH_ADD, session); - if (!ret) { - throw new StoreException("addBranchSession failed."); - } - } - - @Override - public void updateBranchSessionStatus(BranchSession session, BranchStatus status) throws TransactionException { - boolean ret = transactionStoreManager.writeSession(LogOperation.BRANCH_UPDATE, session); - if (!ret) { - throw new StoreException("updateBranchSessionStatus failed."); - } - } - - @Override - public void removeBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException { - boolean ret = transactionStoreManager.writeSession(LogOperation.BRANCH_REMOVE, session); - if (!ret) { - throw new StoreException("removeBranchSession failed."); - } - } - - @Override - public GlobalSession findGlobalSession(String xid) { - return this.findGlobalSession(xid, true); - } - - @Override - public GlobalSession findGlobalSession(String xid, boolean withBranchSessions) { - return transactionStoreManager.readSession(xid, withBranchSessions); - } - - @Override - public Collection allSessions() { - return findGlobalSessions(new SessionCondition(GlobalStatus.UnKnown, GlobalStatus.Begin, - GlobalStatus.Committing, GlobalStatus.CommitRetrying, GlobalStatus.Rollbacking, - GlobalStatus.RollbackRetrying, GlobalStatus.TimeoutRollbacking, GlobalStatus.TimeoutRollbackRetrying, - GlobalStatus.AsyncCommitting)); - } - - @Override - public List findGlobalSessions(SessionCondition condition) { - // nothing need to do - return transactionStoreManager.readSession(condition); - } - - @Override - public T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable lockCallable) - throws TransactionException { - return lockCallable.call(); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/store/RedisLuaTransactionStoreManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/store/RedisLuaTransactionStoreManager.java deleted file mode 100644 index 5df7c40c15..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/store/RedisLuaTransactionStoreManager.java +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.redis.store; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - -import io.seata.common.exception.RedisException; -import io.seata.common.exception.StoreException; -import io.seata.common.util.BeanUtils; -import io.seata.common.util.CollectionUtils; -import io.seata.core.model.GlobalStatus; -import io.seata.core.store.BranchTransactionDO; -import io.seata.core.store.GlobalTransactionDO; -import io.seata.server.storage.redis.JedisPooledFactory; -import io.seata.server.storage.redis.LuaParser; - -import com.google.common.collect.ImmutableMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import redis.clients.jedis.Jedis; - -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_BRANCH_APPLICATION_DATA; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_BRANCH_GMT_MODIFIED; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_BRANCH_STATUS; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_BRANCH_XID; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_GLOBAL_GMT_MODIFIED; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_GLOBAL_STATUS; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_GLOBAL_XID; - -/** - * @author conghuhu - */ -public class RedisLuaTransactionStoreManager extends RedisTransactionStoreManager { - - private static final Logger LOGGER = LoggerFactory.getLogger(RedisLuaTransactionStoreManager.class); - - private static final String LUA_PREFIX = "lua/redisStore/"; - - private static final String INSERT_TRANSACTION_DO_LUA_FILE_NAME = LUA_PREFIX + "insertTransactionDO.lua"; - - private static final String DELETE_TRANSACTION_DO_LUA_FILE_NAME = LUA_PREFIX + "deleteTransactionDO.lua"; - - private static final String UPDATE_BRANCH_TRANSACTION_DO_LUA_FILE_NAME = LUA_PREFIX - + "updateBranchTransactionDO.lua"; - - private static final String UPDATE_GLOBAL_TRANSACTION_DO_LUA_FILE_NAME = LUA_PREFIX - + "updateGlobalTransactionDO.lua"; - - private static final String ROLLBACK_GLOBAL_TRANSACTION_DO_LUA_FILE_NAME = LUA_PREFIX - + "rollbackGlobalTransactionDO.lua"; - - /** - * key filename value LOCK_SHA_SCRIPT_ID - */ - private static final Map LOCK_SHA_MAP = new HashMap<>(); - - /** - * load redis lua script - */ - private void initRedisMode() { - loadLuaFile(INSERT_TRANSACTION_DO_LUA_FILE_NAME, "insertTransactionDO"); - loadLuaFile(DELETE_TRANSACTION_DO_LUA_FILE_NAME, "deleteTransactionDO"); - loadLuaFile(UPDATE_BRANCH_TRANSACTION_DO_LUA_FILE_NAME, "updateBranchTransactionDO"); - loadLuaFile(UPDATE_GLOBAL_TRANSACTION_DO_LUA_FILE_NAME, "updateGlobalTransactionDO"); - loadLuaFile(ROLLBACK_GLOBAL_TRANSACTION_DO_LUA_FILE_NAME, "rollbackGlobalTransactionDO"); - } - - private void loadLuaFile(String fileName, String mode) { - try { - LOCK_SHA_MAP.putAll(LuaParser.getEvalShaMapFromFile(fileName)); - } - catch (IOException e) { - // if it fails to read the file, pipeline mode is used - if (LOCK_SHA_MAP.get(fileName) != null) { - LOCK_SHA_MAP.remove(fileName); - } - if (LOGGER.isInfoEnabled()) { - LOGGER.info("redis session: {} use pipeline mode", mode); - } - } - } - - public RedisLuaTransactionStoreManager() { - LOGGER.info("init redisLuaTransactionStoreManager"); - initRedisMode(); - } - - @Override - public void initGlobalMap() { - if (CollectionUtils.isEmpty(branchMap)) { - globalMap = ImmutableMap.>builder() - .put(LogOperation.GLOBAL_ADD, this::insertGlobalTransactionDO) - .put(LogOperation.GLOBAL_UPDATE, this::updateGlobalTransactionDO) - .put(LogOperation.GLOBAL_REMOVE, this::deleteGlobalTransactionDO) - .build(); - } - } - - @Override - public void initBranchMap() { - if (CollectionUtils.isEmpty(branchMap)) { - branchMap = ImmutableMap.>builder() - .put(LogOperation.BRANCH_ADD, this::insertBranchTransactionDO) - .put(LogOperation.BRANCH_UPDATE, this::updateBranchTransactionDO) - .put(LogOperation.BRANCH_REMOVE, this::deleteBranchTransactionDO) - .build(); - } - } - - @Override - protected boolean insertBranchTransactionDO(BranchTransactionDO branchTransactionDO) { - String branchKey = buildBranchKey(branchTransactionDO.getBranchId()); - String branchListKey = buildBranchListKeyByXid(branchTransactionDO.getXid()); - Date now = new Date(); - branchTransactionDO.setGmtCreate(now); - branchTransactionDO.setGmtModified(now); - Map branchTransactionDOMap = BeanUtils.objectToMap(branchTransactionDO); - String luaSHA = LOCK_SHA_MAP.get(INSERT_TRANSACTION_DO_LUA_FILE_NAME); - if (luaSHA == null) { - return super.insertBranchTransactionDO(branchTransactionDO); - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - List keys = new ArrayList() { - { - add(branchKey); - add(branchListKey); - } - }; - List args = new ArrayList() { - { - add("branch"); - add(String.valueOf(branchTransactionDOMap.size())); - } - }; - for (Map.Entry entry : branchTransactionDOMap.entrySet()) { - keys.add(entry.getKey()); - args.add(entry.getValue()); - } - LuaParser.jedisEvalSha(jedis, luaSHA, INSERT_TRANSACTION_DO_LUA_FILE_NAME, keys, args); - return true; - } - catch (Exception ex) { - throw new RedisException(ex); - } - } - - @Override - protected boolean deleteBranchTransactionDO(BranchTransactionDO branchTransactionDO) { - String branchKey = buildBranchKey(branchTransactionDO.getBranchId()); - String branchListKey = buildBranchListKeyByXid(branchTransactionDO.getXid()); - String luaSHA = LOCK_SHA_MAP.get(DELETE_TRANSACTION_DO_LUA_FILE_NAME); - if (luaSHA == null) { - return super.deleteBranchTransactionDO(branchTransactionDO); - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - List keys = new ArrayList() { - { - add(branchKey); - add(branchListKey); - add(REDIS_KEY_BRANCH_XID); - } - }; - List args = new ArrayList() { - { - add("branch"); - } - }; - LuaParser.jedisEvalSha(jedis, luaSHA, DELETE_TRANSACTION_DO_LUA_FILE_NAME, keys, args); - return true; - } - catch (Exception ex) { - throw new RedisException(ex); - } - } - - @Override - protected boolean updateBranchTransactionDO(BranchTransactionDO branchTransactionDO) { - String branchKey = buildBranchKey(branchTransactionDO.getBranchId()); - String branchStatus = String.valueOf(branchTransactionDO.getStatus()); - String applicationData = String.valueOf(branchTransactionDO.getApplicationData()); - String luaSHA = LOCK_SHA_MAP.get(UPDATE_BRANCH_TRANSACTION_DO_LUA_FILE_NAME); - if (luaSHA == null) { - return super.updateBranchTransactionDO(branchTransactionDO); - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - List keys = new ArrayList() { - { - add(branchKey); - add(REDIS_KEY_BRANCH_STATUS); - add(REDIS_KEY_BRANCH_GMT_MODIFIED); - add(REDIS_KEY_BRANCH_APPLICATION_DATA); - } - }; - List args = new ArrayList() { - { - add(branchStatus); - add(String.valueOf((new Date()).getTime())); - add(applicationData); - } - }; - String result = (String) LuaParser.jedisEvalSha(jedis, luaSHA, UPDATE_BRANCH_TRANSACTION_DO_LUA_FILE_NAME, - keys, args); - LuaParser.LuaResult luaResult = LuaParser.getObjectFromJson(result, LuaParser.LuaResult.class); - if (!luaResult.getSuccess()) { - throw new StoreException("Branch transaction is not exist, update branch transaction failed."); - } - else { - return true; - } - } - catch (Exception ex) { - throw new RedisException(ex); - } - } - - @Override - protected boolean insertGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) { - String globalKey = buildGlobalKeyByTransactionId(globalTransactionDO.getTransactionId()); - String globalStatus = buildGlobalStatus(globalTransactionDO.getStatus()); - String xid = globalTransactionDO.getXid(); - Date now = new Date(); - globalTransactionDO.setGmtCreate(now); - globalTransactionDO.setGmtModified(now); - Map globalTransactionDOMap = BeanUtils.objectToMap(globalTransactionDO); - String luaSHA = LOCK_SHA_MAP.get(INSERT_TRANSACTION_DO_LUA_FILE_NAME); - if (luaSHA == null) { - return super.insertGlobalTransactionDO(globalTransactionDO); - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - // lua mode - List keys = new ArrayList() { - { - add(globalKey); - add(globalStatus); - } - }; - List args = new ArrayList() { - { - add("global"); - add(String.valueOf(globalTransactionDOMap.size())); - } - }; - for (Map.Entry entry : globalTransactionDOMap.entrySet()) { - keys.add(entry.getKey()); - args.add(entry.getValue()); - } - keys.add(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY); - args.add(xid); - args.add(String.valueOf(globalTransactionDO.getBeginTime() + globalTransactionDO.getTimeout())); - LuaParser.jedisEvalSha(jedis, luaSHA, INSERT_TRANSACTION_DO_LUA_FILE_NAME, keys, args); - return true; - } - catch (Exception ex) { - throw new RedisException(ex); - } - } - - @Override - protected boolean deleteGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) { - String globalKey = buildGlobalKeyByTransactionId(globalTransactionDO.getTransactionId()); - String globalStatus = buildGlobalStatus(globalTransactionDO.getStatus()); - String luaSHA = LOCK_SHA_MAP.get(DELETE_TRANSACTION_DO_LUA_FILE_NAME); - if (luaSHA == null) { - return super.deleteGlobalTransactionDO(globalTransactionDO); - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - // lua mode - List keys = new ArrayList() { - { - add(globalKey); - add(globalStatus); - add(REDIS_KEY_GLOBAL_XID); - add(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY); - } - }; - List args = new ArrayList() { - { - add("global"); - add(globalTransactionDO.getXid()); - add(String.valueOf(globalTransactionDO.getStatus())); - } - }; - LuaParser.jedisEvalSha(jedis, luaSHA, DELETE_TRANSACTION_DO_LUA_FILE_NAME, keys, args); - return true; - } - catch (Exception ex) { - throw new RedisException(ex); - } - } - - @Override - protected boolean updateGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) { - String xid = globalTransactionDO.getXid(); - String globalKey = buildGlobalKeyByTransactionId(globalTransactionDO.getTransactionId()); - Integer status = globalTransactionDO.getStatus(); - - String luaSHA = LOCK_SHA_MAP.get(UPDATE_GLOBAL_TRANSACTION_DO_LUA_FILE_NAME); - if (luaSHA == null) { - return super.updateGlobalTransactionDO(globalTransactionDO); - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - List keys = new ArrayList() { - { - add(globalKey); - add(REDIS_KEY_GLOBAL_STATUS); - add(REDIS_KEY_GLOBAL_GMT_MODIFIED); - add(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY); - } - }; - List args = new ArrayList() { - { - add(String.valueOf(status)); - add(String.valueOf((new Date()).getTime())); - add(xid); - } - }; - String result = (String) LuaParser.jedisEvalSha(jedis, luaSHA, UPDATE_GLOBAL_TRANSACTION_DO_LUA_FILE_NAME, - keys, args); - LuaParser.LuaResult luaResult = LuaParser.getObjectFromJson(result, LuaParser.LuaResult.class); - // fail - if (!luaResult.getSuccess()) { - String type = luaResult.getStatus(); - if (LuaParser.LuaErrorStatus.XID_NOT_EXISTED.equals(type)) { - throw new StoreException("Global transaction is not exist, update global transaction failed."); - } - else if (LuaParser.LuaErrorStatus.ILLEGAL_CHANGE_STATUS.equals(type)) { - String previousStatus = luaResult.getData(); - GlobalStatus before = GlobalStatus.get(Integer.parseInt(previousStatus)); - GlobalStatus after = GlobalStatus.get(status); - throw new StoreException( - "Illegal changing of global status, update global transaction failed." + " beforeStatus[" - + before.name() + "] cannot be changed to afterStatus[" + after.name() + "]"); - } - } - return true; - } - catch (Exception ex) { - throw new RedisException(ex); - } - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManager.java deleted file mode 100644 index 73aabc929e..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManager.java +++ /dev/null @@ -1,861 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.redis.store; - -import com.google.common.collect.ImmutableMap; -import io.seata.common.XID; -import io.seata.common.exception.RedisException; -import io.seata.common.exception.StoreException; -import io.seata.common.util.BeanUtils; -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.core.model.GlobalStatus; -import io.seata.core.store.BranchTransactionDO; -import io.seata.core.store.GlobalTransactionDO; -import io.seata.server.console.param.GlobalSessionParam; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionCondition; -import io.seata.server.session.SessionStatusValidator; -import io.seata.server.storage.SessionConverter; -import io.seata.server.storage.redis.JedisPooledFactory; -import io.seata.server.store.AbstractTransactionStoreManager; -import io.seata.server.store.SessionStorable; -import io.seata.server.store.TransactionStoreManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.Pipeline; -import redis.clients.jedis.Transaction; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static io.seata.common.ConfigurationKeys.STORE_REDIS_QUERY_LIMIT; -import static io.seata.common.DefaultValues.DEFAULT_QUERY_LIMIT; -import static io.seata.core.constants.RedisKeyConstants.*; - -/** - * The redis transaction store manager - * - * @author funkye - * @author wangzhongxiang - * @author doubleDimple - * @author conghuhu - */ -public class RedisTransactionStoreManager extends AbstractTransactionStoreManager implements TransactionStoreManager { - - private static final Logger LOGGER = LoggerFactory.getLogger(RedisTransactionStoreManager.class); - - /** - * the prefix of the branch transactions - */ - private static final String REDIS_SEATA_BRANCHES_PREFIX = "SEATA_BRANCHES_"; - - /** - * the prefix of the branch transaction - */ - private static final String REDIS_SEATA_BRANCH_PREFIX = "SEATA_BRANCH_"; - - /** - * the prefix of the global transaction - */ - private static final String REDIS_SEATA_GLOBAL_PREFIX = "SEATA_GLOBAL_"; - - /** - * the prefix of the global transaction status - */ - private static final String REDIS_SEATA_STATUS_PREFIX = "SEATA_STATUS_"; - - /** the key of global transaction status for begin */ - protected static final String REDIS_SEATA_BEGIN_TRANSACTIONS_KEY = "SEATA_BEGIN_TRANSACTIONS"; - - private static volatile RedisTransactionStoreManager instance; - - private static final String OK = "OK"; - - /** - * The constant CONFIG. - */ - protected static final Configuration CONFIG = ConfigurationFactory.getInstance(); - - /** - * The Log query limit. - */ - protected int logQueryLimit; - - /** - * Get the instance. - */ - public static RedisTransactionStoreManager getInstance() { - if (instance == null) { - synchronized (RedisTransactionStoreManager.class) { - if (instance == null) { - instance = new RedisTransactionStoreManager(); - } - } - } - return instance; - } - - /** - * init map to constructor - */ - public RedisTransactionStoreManager() { - super(); - initGlobalMap(); - initBranchMap(); - initLogQueryLimit(); - } - - protected void initLogQueryLimit() { - logQueryLimit = CONFIG.getInt(STORE_REDIS_QUERY_LIMIT, DEFAULT_QUERY_LIMIT); - } - - /** - * Map for LogOperation Global Operation - */ - public static volatile ImmutableMap> globalMap; - - /** - * Map for LogOperation Branch Operation - */ - public static volatile ImmutableMap> branchMap; - - /** - * init globalMap - */ - public void initGlobalMap() { - if (CollectionUtils.isEmpty(branchMap)) { - globalMap = ImmutableMap.>builder() - .put(LogOperation.GLOBAL_ADD, this::insertGlobalTransactionDO) - .put(LogOperation.GLOBAL_UPDATE, this::updateGlobalTransactionDO) - .put(LogOperation.GLOBAL_REMOVE, this::deleteGlobalTransactionDO) - .build(); - } - } - - /** - * init branchMap - */ - public void initBranchMap() { - if (CollectionUtils.isEmpty(branchMap)) { - branchMap = ImmutableMap.>builder() - .put(LogOperation.BRANCH_ADD, this::insertBranchTransactionDO) - .put(LogOperation.BRANCH_UPDATE, this::updateBranchTransactionDO) - .put(LogOperation.BRANCH_REMOVE, this::deleteBranchTransactionDO) - .build(); - } - } - - @Override - public boolean writeSession(LogOperation logOperation, SessionStorable session) { - if (globalMap.containsKey(logOperation) || branchMap.containsKey(logOperation)) { - return globalMap.containsKey(logOperation) - ? globalMap.get(logOperation).apply(SessionConverter.convertGlobalTransactionDO(session)) - : branchMap.get(logOperation).apply(SessionConverter.convertBranchTransactionDO(session)); - } - else { - throw new StoreException("Unknown LogOperation:" + logOperation.name()); - } - } - - /** - * Insert branch transaction - * @param branchTransactionDO - * @return the boolean - */ - protected boolean insertBranchTransactionDO(BranchTransactionDO branchTransactionDO) { - String branchKey = buildBranchKey(branchTransactionDO.getBranchId()); - String branchListKey = buildBranchListKeyByXid(branchTransactionDO.getXid()); - try (Jedis jedis = JedisPooledFactory.getJedisInstance(); Pipeline pipelined = jedis.pipelined()) { - Date now = new Date(); - branchTransactionDO.setGmtCreate(now); - branchTransactionDO.setGmtModified(now); - pipelined.hmset(branchKey, BeanUtils.objectToMap(branchTransactionDO)); - pipelined.rpush(branchListKey, branchKey); - pipelined.sync(); - return true; - } - catch (Exception ex) { - throw new RedisException(ex); - } - } - - /** - * Delete the branch transaction - * @param branchTransactionDO - * @return - */ - protected boolean deleteBranchTransactionDO(BranchTransactionDO branchTransactionDO) { - String branchKey = buildBranchKey(branchTransactionDO.getBranchId()); - String branchListKey = buildBranchListKeyByXid(branchTransactionDO.getXid()); - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - String xid = jedis.hget(branchKey, REDIS_KEY_BRANCH_XID); - if (StringUtils.isEmpty(xid)) { - return true; - } - try (Pipeline pipelined = jedis.pipelined()) { - pipelined.lrem(branchListKey, 0, branchKey); - pipelined.del(branchKey); - pipelined.sync(); - } - return true; - } - catch (Exception ex) { - throw new RedisException(ex); - } - } - - /** - * Update the branch transaction - * @param branchTransactionDO - * @return - */ - protected boolean updateBranchTransactionDO(BranchTransactionDO branchTransactionDO) { - String branchKey = buildBranchKey(branchTransactionDO.getBranchId()); - String branchStatus = String.valueOf(branchTransactionDO.getStatus()); - String applicationData = String.valueOf(branchTransactionDO.getApplicationData()); - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - String previousBranchStatus = jedis.hget(branchKey, REDIS_KEY_BRANCH_STATUS); - if (StringUtils.isEmpty(previousBranchStatus)) { - throw new StoreException("Branch transaction is not exist, update branch transaction failed."); - } - Map map = new HashMap<>(3, 1); - map.put(REDIS_KEY_BRANCH_STATUS, branchStatus); - map.put(REDIS_KEY_BRANCH_GMT_MODIFIED, String.valueOf((new Date()).getTime())); - if (StringUtils.isNotBlank(branchTransactionDO.getApplicationData())) { - map.put(REDIS_KEY_BRANCH_APPLICATION_DATA, applicationData); - } - jedis.hmset(branchKey, map); - return true; - } - catch (Exception ex) { - throw new RedisException(ex); - } - } - - /** - * Insert the global transaction. - * @param globalTransactionDO - * @return - */ - protected boolean insertGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) { - String globalKey = buildGlobalKeyByTransactionId(globalTransactionDO.getTransactionId()); - try (Jedis jedis = JedisPooledFactory.getJedisInstance(); Pipeline pipelined = jedis.pipelined()) { - Date now = new Date(); - globalTransactionDO.setGmtCreate(now); - globalTransactionDO.setGmtModified(now); - pipelined.hmset(globalKey, BeanUtils.objectToMap(globalTransactionDO)); - String xid = globalTransactionDO.getXid(); - pipelined.rpush(buildGlobalStatus(globalTransactionDO.getStatus()), xid); - pipelined.zadd(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, - globalTransactionDO.getBeginTime() + globalTransactionDO.getTimeout(), globalKey); - pipelined.sync(); - return true; - } - catch (Exception ex) { - throw new RedisException(ex); - } - } - - /** - * Delete the global transaction. It will operate two parts: 1.delete the global - * session map 2.remove the xid from the global status list If the operate failed,the - * succeed operates will rollback - * @param globalTransactionDO - * @return - */ - protected boolean deleteGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) { - String globalKey = buildGlobalKeyByTransactionId(globalTransactionDO.getTransactionId()); - String globalStatus = buildGlobalStatus(globalTransactionDO.getStatus()); - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - // pipeline mode - String xid = jedis.hget(globalKey, REDIS_KEY_GLOBAL_XID); - if (StringUtils.isEmpty(xid)) { - LOGGER.warn("Global transaction is not exist,xid = {}.Maybe has been deleted by another tc server", - globalTransactionDO.getXid()); - return true; - } - try (Pipeline pipelined = jedis.pipelined()) { - pipelined.lrem(globalStatus, 0, globalTransactionDO.getXid()); - pipelined.del(globalKey); - if (GlobalStatus.Begin.getCode() == globalTransactionDO.getStatus() - || GlobalStatus.UnKnown.getCode() == globalTransactionDO.getStatus()) { - pipelined.zrem(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, globalKey); - } - pipelined.sync(); - } - return true; - } - catch (Exception ex) { - throw new RedisException(ex); - } - } - - /** - * Update the global transaction. It will update two parts: 1.the global session map - * 2.the global status list If the update failed,the succeed operates will rollback - * @param globalTransactionDO 全局事务参数 - * @return 修改结果 - */ - protected boolean updateGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) { - String xid = globalTransactionDO.getXid(); - String globalKey = buildGlobalKeyByTransactionId(globalTransactionDO.getTransactionId()); - Integer status = globalTransactionDO.getStatus(); - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - // Defensive watch to prevent other TC server operating concurrently,Fail fast - jedis.watch(globalKey); - List statusAndGmtModified = jedis.hmget(globalKey, REDIS_KEY_GLOBAL_STATUS, - REDIS_KEY_GLOBAL_GMT_MODIFIED); - String previousStatus = statusAndGmtModified.get(0); - if (StringUtils.isEmpty(previousStatus)) { - jedis.unwatch(); - throw new StoreException("Global transaction is not exist, update global transaction failed."); - } - if (previousStatus.equals(String.valueOf(status))) { - jedis.unwatch(); - return true; - } - GlobalStatus before = GlobalStatus.get(Integer.parseInt(previousStatus)); - GlobalStatus after = GlobalStatus.get(status); - if (!SessionStatusValidator.validateUpdateStatus(before, after)) { - throw new StoreException( - "Illegal changing of global status, update global transaction failed." + " beforeStatus[" - + before.name() + "] cannot be changed to afterStatus[" + after.name() + "]"); - } - - String previousGmtModified = statusAndGmtModified.get(1); - Transaction multi = jedis.multi(); - Map map = new HashMap<>(2); - map.put(REDIS_KEY_GLOBAL_STATUS, String.valueOf(globalTransactionDO.getStatus())); - map.put(REDIS_KEY_GLOBAL_GMT_MODIFIED, String.valueOf((new Date()).getTime())); - multi.hmset(globalKey, map); - multi.lrem(buildGlobalStatus(Integer.valueOf(previousStatus)), 0, xid); - multi.rpush(buildGlobalStatus(globalTransactionDO.getStatus()), xid); - multi.zrem(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, globalKey); - List exec = multi.exec(); - if (CollectionUtils.isEmpty(exec)) { - // The data has changed by another tc, so we still think the modification - // is successful. - LOGGER.warn( - "The global transaction xid = {}, maybe changed by another TC. It does not affect the results", - xid); - return true; - } - String hmset = exec.get(0).toString(); - long lrem = (long) exec.get(1); - long rpush = (long) exec.get(2); - if (OK.equalsIgnoreCase(hmset) && lrem > 0 && rpush > 0) { - return true; - } - else { - // pipeline mode - if (OK.equalsIgnoreCase(hmset)) { - // Defensive watch to prevent other TC server operating - // concurrently,give up this operate - jedis.watch(globalKey); - String xid2 = jedis.hget(globalKey, REDIS_KEY_GLOBAL_XID); - if (StringUtils.isNotEmpty(xid2)) { - Map mapPrevious = new HashMap<>(2, 1); - mapPrevious.put(REDIS_KEY_GLOBAL_STATUS, previousStatus); - mapPrevious.put(REDIS_KEY_GLOBAL_GMT_MODIFIED, previousGmtModified); - Transaction multi2 = jedis.multi(); - multi2.hmset(globalKey, mapPrevious); - multi2.exec(); - } - } - if (lrem > 0) { - jedis.rpush(buildGlobalStatus(Integer.valueOf(previousStatus)), xid); - } - if (rpush > 0) { - jedis.lrem(buildGlobalStatus(status), 0, xid); - } - return false; - } - } - catch (Exception ex) { - throw new RedisException(ex); - } - } - - /** - * Read session global session. - * @param xid the xid - * @param withBranchSessions the withBranchSessions - * @return the global session - */ - @Override - public GlobalSession readSession(String xid, boolean withBranchSessions) { - String transactionId = String.valueOf(XID.getTransactionId(xid)); - String globalKey = buildGlobalKeyByTransactionId(transactionId); - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - Map map = jedis.hgetAll(globalKey); - if (CollectionUtils.isEmpty(map)) { - return null; - } - GlobalTransactionDO globalTransactionDO = (GlobalTransactionDO) BeanUtils.mapToObject(map, - GlobalTransactionDO.class); - List branchTransactionDOs = null; - if (withBranchSessions) { - branchTransactionDOs = this.readBranchSessionByXid(jedis, xid); - } - GlobalSession session = getGlobalSession(globalTransactionDO, branchTransactionDOs, withBranchSessions); - return session; - } - } - - /** - * Read session global session. - * @param xid the xid - * @return the global session - */ - @Override - public GlobalSession readSession(String xid) { - return this.readSession(xid, true); - } - - /** - * Read globalSession list by global status - * @param statuses the statuses - * @return the list - */ - @Override - public List readSession(GlobalStatus[] statuses, boolean withBranchSessions) { - List globalSessions = Collections.synchronizedList(new ArrayList<>()); - List statusKeys = convertStatusKeys(statuses); - Map targetMap = calculateStatuskeysHasData(statusKeys); - if (targetMap.size() == 0 || logQueryLimit <= 0) { - return globalSessions; - } - int perStatusLimit = resetLogQueryLimit(targetMap); - final long countGlobalSessions = targetMap.values() - .stream() - .collect(Collectors.summarizingInt(Integer::intValue)) - .getSum(); - // queryCount. - final long queryCount = Math.min(logQueryLimit, countGlobalSessions); - List> list = new ArrayList<>(); - dogetXidsForTargetMapRecursive(targetMap, 0L, perStatusLimit - 1, queryCount, list); - if (CollectionUtils.isNotEmpty(list)) { - List xids = list.stream().flatMap(Collection::stream).collect(Collectors.toList()); - xids.parallelStream().forEach(xid -> { - GlobalSession globalSession = this.readSession(xid, withBranchSessions); - if (globalSession != null) { - globalSessions.add(globalSession); - } - }); - } - return globalSessions; - } - - @Override - public List readSortByTimeoutBeginSessions(boolean withBranchSessions) { - List list = Collections.emptyList(); - List statusKeys = convertStatusKeys(GlobalStatus.Begin); - Map targetMap = calculateStatuskeysHasData(statusKeys); - if (targetMap.size() == 0 || logQueryLimit <= 0) { - return list; - } - final long countGlobalSessions = targetMap.values() - .stream() - .collect(Collectors.summarizingInt(Integer::intValue)) - .getSum(); - // queryCount - final long queryCount = Math.min(logQueryLimit, countGlobalSessions); - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - Set values = jedis.zrangeByScore(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, 0, System.currentTimeMillis(), - 0, (int) queryCount); - List> rep; - try (Pipeline pipeline = jedis.pipelined()) { - for (String value : values) { - pipeline.hgetAll(value); - } - rep = (List>) (List) pipeline.syncAndReturnAll(); - } - list = rep.stream().map(map -> { - GlobalTransactionDO globalTransactionDO = (GlobalTransactionDO) BeanUtils.mapToObject(map, - GlobalTransactionDO.class); - if (globalTransactionDO != null) { - String xid = globalTransactionDO.getXid(); - List branchTransactionDOs = new ArrayList<>(); - if (withBranchSessions) { - branchTransactionDOs = this.readBranchSessionByXid(jedis, xid); - } - return getGlobalSession(globalTransactionDO, branchTransactionDOs, withBranchSessions); - } - return null; - }).filter(Objects::nonNull).collect(Collectors.toList()); - } - return list; - } - - /** - * get everyone keys limit - * @param targetMap - * @return - */ - private int resetLogQueryLimit(Map targetMap) { - int resetLimitQuery = logQueryLimit; - if (targetMap.size() > 1) { - int size = targetMap.size(); - resetLimitQuery = (logQueryLimit / size) == 0 ? 1 : (logQueryLimit / size); - } - return resetLimitQuery; - } - - /** - * read the global session list by different condition. - * @param sessionCondition the session condition - * @return the global sessions - */ - @Override - public List readSession(SessionCondition sessionCondition) { - List globalSessions = new ArrayList<>(); - if (StringUtils.isNotEmpty(sessionCondition.getXid())) { - GlobalSession globalSession = this.readSession(sessionCondition.getXid(), - !sessionCondition.isLazyLoadBranch()); - if (globalSession != null) { - globalSessions.add(globalSession); - } - return globalSessions; - } - else if (sessionCondition.getTransactionId() != null) { - GlobalSession globalSession = this.readSessionByTransactionId( - sessionCondition.getTransactionId().toString(), !sessionCondition.isLazyLoadBranch()); - if (globalSession != null) { - globalSessions.add(globalSession); - } - return globalSessions; - } - else if (CollectionUtils.isNotEmpty(sessionCondition.getStatuses())) { - if (sessionCondition.getStatuses().length == 1 && sessionCondition.getStatuses()[0] == GlobalStatus.Begin) { - return this.readSortByTimeoutBeginSessions(!sessionCondition.isLazyLoadBranch()); - } - else { - return readSession(sessionCondition.getStatuses(), !sessionCondition.isLazyLoadBranch()); - } - } - return null; - } - - /** - * query GlobalSession by status with page - * @param param - * @return List - */ - public List readSessionStatusByPage(GlobalSessionParam param) { - List globalSessions = new ArrayList<>(); - - int pageNum = param.getPageNum(); - int pageSize = param.getPageSize(); - int start = Math.max((pageNum - 1) * pageSize, 0); - int end = pageNum * pageSize - 1; - - if (param.getStatus() != null) { - String statusKey = buildGlobalStatus(GlobalStatus.get(param.getStatus()).getCode()); - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - final List xids = jedis.lrange(statusKey, start, end); - xids.forEach(xid -> { - GlobalSession globalSession = this.readSession(xid, param.isWithBranch()); - if (globalSession != null) { - globalSessions.add(globalSession); - } - }); - } - } - return globalSessions; - } - - /** - * assemble the global session and branch session - * @param globalTransactionDO the global transactionDo - * @param branchTransactionDOs the branch transactionDos - * @param withBranchSessions if read branch sessions - * @return the global session with branch session - */ - private GlobalSession getGlobalSession(GlobalTransactionDO globalTransactionDO, - List branchTransactionDOs, boolean withBranchSessions) { - GlobalSession globalSession = SessionConverter.convertGlobalSession(globalTransactionDO, !withBranchSessions); - if (CollectionUtils.isNotEmpty(branchTransactionDOs)) { - for (BranchTransactionDO branchTransactionDO : branchTransactionDOs) { - globalSession.add(SessionConverter.convertBranchSession(branchTransactionDO)); - } - } - return globalSession; - } - - /** - * read the global session by transactionId - * @param transactionId the transaction id - * @param withBranchSessions if read branch sessions - * @return the global session - */ - private GlobalSession readSessionByTransactionId(String transactionId, boolean withBranchSessions) { - String globalKey = buildGlobalKeyByTransactionId(transactionId); - String xid = null; - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - Map map = jedis.hgetAll(globalKey); - if (CollectionUtils.isEmpty(map)) { - return null; - } - GlobalTransactionDO globalTransactionDO = (GlobalTransactionDO) BeanUtils.mapToObject(map, - GlobalTransactionDO.class); - if (globalTransactionDO != null) { - xid = globalTransactionDO.getXid(); - } - List branchTransactionDOs = new ArrayList<>(); - if (withBranchSessions) { - branchTransactionDOs = this.readBranchSessionByXid(jedis, xid); - } - return getGlobalSession(globalTransactionDO, branchTransactionDOs, withBranchSessions); - } - } - - /** - * Read the branch session list by xid - * @param jedis the jedis - * @param xid the xid - * @return the branch transactionDo list - */ - private List readBranchSessionByXid(Jedis jedis, String xid) { - List branchTransactionDOs = new ArrayList<>(); - String branchListKey = buildBranchListKeyByXid(xid); - List branchKeys = lRange(jedis, branchListKey); - if (CollectionUtils.isNotEmpty(branchKeys)) { - try (Pipeline pipeline = jedis.pipelined()) { - branchKeys.stream().forEach(branchKey -> pipeline.hgetAll(branchKey)); - List branchInfos = pipeline.syncAndReturnAll(); - for (Object branchInfo : branchInfos) { - if (branchInfo != null) { - Map branchInfoMap = (Map) branchInfo; - Optional branchTransactionDO = Optional.ofNullable( - (BranchTransactionDO) BeanUtils.mapToObject(branchInfoMap, BranchTransactionDO.class)); - branchTransactionDO.ifPresent(branchTransactionDOs::add); - } - } - } - } - if (CollectionUtils.isNotEmpty(branchTransactionDOs)) { - Collections.sort(branchTransactionDOs); - } - return branchTransactionDOs; - } - - private List lRange(Jedis jedis, String key) { - List keys = new ArrayList<>(); - List values; - int limit = 20; - int start = 0; - int stop = limit; - for (;;) { - values = jedis.lrange(key, start, stop); - keys.addAll(values); - if (CollectionUtils.isEmpty(values) || values.size() < limit) { - break; - } - start = keys.size(); - stop = start + limit; - } - return keys; - } - - public List findBranchSessionByXid(String xid) { - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - return readBranchSessionByXid(jedis, xid); - } - } - - /** - * query globalSession by page - * @param pageNum - * @param pageSize - * @param withBranchSessions - * @return List - */ - public List findGlobalSessionByPage(int pageNum, int pageSize, boolean withBranchSessions) { - List globalSessions = new ArrayList<>(); - int start = Math.max((pageNum - 1) * pageSize, 0); - int end = pageNum * pageSize - 1; - - List statusKeys = convertStatusKeys(GlobalStatus.values()); - Map stringLongMap = calculateStatuskeysHasData(statusKeys); - - List> list = dogetXidsForTargetMap(stringLongMap, start, end, pageSize); - - if (CollectionUtils.isNotEmpty(list)) { - List xids = list.stream().flatMap(Collection::stream).collect(Collectors.toList()); - xids.forEach(xid -> { - if (globalSessions.size() < pageSize) { - GlobalSession globalSession = this.readSession(xid, withBranchSessions); - if (globalSession != null) { - globalSessions.add(globalSession); - } - } - }); - } - return globalSessions; - } - - /** - * query and sort existing values - * @param statusKeys - * @return - */ - private Map calculateStatuskeysHasData(List statusKeys) { - Map resultMap = new LinkedHashMap<>(); - Map keysMap = new HashMap<>(statusKeys.size()); - try (Jedis jedis = JedisPooledFactory.getJedisInstance(); Pipeline pipelined = jedis.pipelined()) { - statusKeys.forEach(key -> pipelined.llen(key)); - List counts = (List) pipelined.syncAndReturnAll(); - for (int i = 0; i < counts.size(); i++) { - if (counts.get(i) > 0) { - keysMap.put(statusKeys.get(i), counts.get(i).intValue()); - } - } - } - - // sort - List> list = new ArrayList<>(keysMap.entrySet()); - list.sort((o1, o2) -> o2.getValue() - o1.getValue()); - list.forEach(e -> resultMap.put(e.getKey(), e.getValue())); - - return resultMap; - } - - /** - * count GlobalSession total by status - * @param values - * @return Long - */ - public Long countByGlobalSessions(GlobalStatus[] values) { - List statusKeys = new ArrayList<>(); - Long total = 0L; - for (GlobalStatus status : values) { - statusKeys.add(buildGlobalStatus(status.getCode())); - } - try (Jedis jedis = JedisPooledFactory.getJedisInstance(); Pipeline pipelined = jedis.pipelined()) { - statusKeys.stream().forEach(statusKey -> pipelined.llen(statusKey)); - List list = (List) (List) pipelined.syncAndReturnAll(); - if (list.size() > 0) { - total = list.stream().mapToLong(value -> value).sum(); - } - return total; - } - } - - private List convertStatusKeys(GlobalStatus... statuses) { - List statusKeys = new ArrayList<>(); - for (int i = 0; i < statuses.length; i++) { - statusKeys.add(buildGlobalStatus(statuses[i].getCode())); - } - return statusKeys; - } - - private void dogetXidsForTargetMapRecursive(Map targetMap, long start, long end, long queryCount, - List> listList) { - - long total = listList.stream().mapToLong(List::size).sum(); - - if (total >= queryCount) { - return; - } - // when start greater than offset(totalCount) - if (start >= queryCount) { - return; - } - - if (targetMap.size() == 0) { - return; - } - - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - Iterator> iterator = targetMap.entrySet().iterator(); - while (iterator.hasNext()) { - String key = iterator.next().getKey(); - final long sum = listList.stream().mapToLong(List::size).sum(); - final long diffCount = queryCount - sum; - if (diffCount <= 0) { - return; - } - List list; - if (end - start >= diffCount) { - long endNew = start + diffCount - 1; - list = jedis.lrange(key, start, endNew); - } - else { - list = jedis.lrange(key, start, end); - } - - if (list.size() > 0) { - listList.add(list); - } - else { - iterator.remove(); - } - } - } - long startNew = end + 1; - long endNew = startNew + end - start; - dogetXidsForTargetMapRecursive(targetMap, startNew, endNew, queryCount, listList); - } - - private List> dogetXidsForTargetMap(Map targetMap, int start, int end, - int totalCount) { - List> listList = new ArrayList<>(); - try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - for (String key : targetMap.keySet()) { - final List list = jedis.lrange(key, start, end); - final long sum = listList.stream().mapToLong(List::size).sum(); - if (list.size() > 0 && sum < totalCount) { - listList.add(list); - } - else { - start = 0; - end = totalCount - 1; - } - } - } - return listList; - } - - protected String buildBranchListKeyByXid(String xid) { - return REDIS_SEATA_BRANCHES_PREFIX + xid; - } - - protected String buildGlobalKeyByTransactionId(Object transactionId) { - return REDIS_SEATA_GLOBAL_PREFIX + transactionId; - } - - protected String buildBranchKey(Long branchId) { - return REDIS_SEATA_BRANCH_PREFIX + branchId; - } - - protected String buildGlobalStatus(Integer status) { - return REDIS_SEATA_STATUS_PREFIX + status; - } - - /** - * Sets log query limit. - * @param logQueryLimit the log query limit - */ - public void setLogQueryLimit(int logQueryLimit) { - this.logQueryLimit = logQueryLimit; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManagerFactory.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManagerFactory.java deleted file mode 100644 index c4149608e5..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManagerFactory.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.storage.redis.store; - -import io.seata.common.ConfigurationKeys; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; - -import static io.seata.common.Constants.STORE_REDIS_TYPE_PIPELINE; - -/** - * @author conghuhu - */ -public class RedisTransactionStoreManagerFactory { - - protected static final Configuration CONFIG = ConfigurationFactory.getInstance(); - - private static volatile RedisTransactionStoreManager instance; - - /** - * Get the instance. - */ - public static RedisTransactionStoreManager getInstance() { - if (instance == null) { - synchronized (RedisTransactionStoreManagerFactory.class) { - if (instance == null) { - String storeRedisType = CONFIG.getConfig(ConfigurationKeys.STORE_REDIS_TYPE, - STORE_REDIS_TYPE_PIPELINE); - instance = STORE_REDIS_TYPE_PIPELINE.equals(storeRedisType) ? new RedisTransactionStoreManager() - : new RedisLuaTransactionStoreManager(); - } - } - } - return instance; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/AbstractTransactionStoreManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/AbstractTransactionStoreManager.java deleted file mode 100644 index 1dda47e055..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/AbstractTransactionStoreManager.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.store; - -import io.seata.core.model.GlobalStatus; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionCondition; - -import java.util.Collections; -import java.util.List; - -/** - * The type Abstract transaction store manager. - * - * @author zhangsen - */ -public abstract class AbstractTransactionStoreManager implements TransactionStoreManager { - - @Override - public GlobalSession readSession(String xid) { - return null; - } - - @Override - public GlobalSession readSession(String xid, boolean withBranchSessions) { - return null; - } - - @Override - public List readSortByTimeoutBeginSessions(boolean withBranchSessions) { - return Collections.emptyList(); - } - - @Override - public List readSession(GlobalStatus[] statuses, boolean withBranchSessions) { - return Collections.emptyList(); - } - - @Override - public List readSession(SessionCondition sessionCondition) { - return Collections.emptyList(); - } - - @Override - public void shutdown() { - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/DbcpDataSourceProvider.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/DbcpDataSourceProvider.java deleted file mode 100644 index b4e10ab7e6..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/DbcpDataSourceProvider.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.store; - -import io.seata.common.loader.LoadLevel; -import io.seata.core.store.db.AbstractDataSourceProvider; -import org.apache.commons.dbcp2.BasicDataSource; - -import javax.sql.DataSource; -import java.sql.Connection; - -/** - * The dbcp datasource provider. - * - * @author zhangsen - * @author ggndnn - * @author will - */ -@LoadLevel(name = "dbcp") -public class DbcpDataSourceProvider extends AbstractDataSourceProvider { - - @Override - public DataSource generate() { - BasicDataSource ds = new BasicDataSource(); - ds.setDriverClassName(getDriverClassName()); - // DriverClassLoader works if upgrade commons-dbcp to at least 1.3.1. - // https://issues.apache.org/jira/browse/DBCP-333 - ds.setDriverClassLoader(getDriverClassLoader()); - ds.setUrl(getUrl()); - ds.setUsername(getUser()); - - ds.setPassword(getPassword()); - ds.setInitialSize(getMinConn()); - ds.setMaxTotal(getMaxConn()); - ds.setMinIdle(getMinConn()); - ds.setMaxIdle(getMinConn()); - ds.setMaxWaitMillis(getMaxWait()); - ds.setTimeBetweenEvictionRunsMillis(120000); - ds.setNumTestsPerEvictionRun(1); - ds.setTestWhileIdle(true); - ds.setValidationQuery(getValidationQuery(getDBType())); - ds.setConnectionProperties("useUnicode=yes;characterEncoding=utf8;socketTimeout=5000;connectTimeout=500"); - ds.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); - return ds; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/DruidDataSourceProvider.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/DruidDataSourceProvider.java deleted file mode 100644 index 29b8b41d70..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/DruidDataSourceProvider.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.store; - -import javax.sql.DataSource; - -import io.seata.common.loader.LoadLevel; -import io.seata.core.store.db.AbstractDataSourceProvider; -import com.alibaba.druid.pool.DruidDataSource; - -import java.sql.Connection; - -/** - * The druid datasource provider. - * - * @author zhangsen - * @author ggndnn - * @author will - */ -@LoadLevel(name = "druid") -public class DruidDataSourceProvider extends AbstractDataSourceProvider { - - @Override - public DataSource generate() { - DruidDataSource ds = new DruidDataSource(); - ds.setDriverClassName(getDriverClassName()); - ds.setDriverClassLoader(getDriverClassLoader()); - ds.setUrl(getUrl()); - ds.setUsername(getUser()); - ds.setPassword(getPassword()); - ds.setInitialSize(getMinConn()); - ds.setMaxActive(getMaxConn()); - ds.setMinIdle(getMinConn()); - ds.setMaxWait(getMaxWait()); - ds.setTimeBetweenEvictionRunsMillis(120000); - ds.setMinEvictableIdleTimeMillis(300000); - ds.setTestWhileIdle(true); - ds.setTestOnBorrow(false); - ds.setPoolPreparedStatements(true); - ds.setMaxPoolPreparedStatementPerConnectionSize(20); - ds.setValidationQuery(getValidationQuery(getDBType())); - ds.setDefaultAutoCommit(true); - // fix issue 5030 - ds.setUseOracleImplicitCache(false); - ds.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); - return ds; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/HikariDataSourceProvider.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/HikariDataSourceProvider.java deleted file mode 100644 index 8f0e2795ac..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/HikariDataSourceProvider.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.store; - -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; -import com.zaxxer.hikari.util.IsolationLevel; -import io.seata.common.loader.LoadLevel; -import io.seata.core.store.db.AbstractDataSourceProvider; - -import javax.sql.DataSource; -import java.util.Properties; - -/** - * The hikari datasource provider. - * - * @author diguage - * @author will - */ -@LoadLevel(name = "hikari") -public class HikariDataSourceProvider extends AbstractDataSourceProvider { - - @Override - public DataSource generate() { - Properties properties = new Properties(); - properties.setProperty("dataSource.cachePrepStmts", "true"); - properties.setProperty("dataSource.prepStmtCacheSize", "250"); - properties.setProperty("dataSource.prepStmtCacheSqlLimit", "2048"); - properties.setProperty("dataSource.useServerPrepStmts", "true"); - properties.setProperty("dataSource.useLocalSessionState", "true"); - properties.setProperty("dataSource.rewriteBatchedStatements", "true"); - properties.setProperty("dataSource.cacheResultSetMetadata", "true"); - properties.setProperty("dataSource.cacheServerConfiguration", "true"); - properties.setProperty("dataSource.elideSetAutoCommits", "true"); - properties.setProperty("dataSource.maintainTimeStats", "false"); - - HikariConfig config = new HikariConfig(properties); - config.setDriverClassName(getDriverClassName()); - config.setJdbcUrl(getUrl()); - config.setUsername(getUser()); - config.setPassword(getPassword()); - config.setMaximumPoolSize(getMaxConn()); - config.setMinimumIdle(getMinConn()); - config.setAutoCommit(true); - config.setConnectionTimeout(getMaxWait()); - config.setInitializationFailTimeout(-1); - config.setTransactionIsolation(IsolationLevel.TRANSACTION_READ_COMMITTED.name()); - return new HikariDataSource(config); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/SessionStorable.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/SessionStorable.java deleted file mode 100644 index 727c6f94c7..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/SessionStorable.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.store; - -/** - * The interface Session storable. - * - * @author slievrly - */ -public interface SessionStorable { - - /** - * Encode byte [ ]. - * @return the byte [ ] - */ - byte[] encode(); - - /** - * Decode. - * @param src the src - */ - void decode(byte[] src); - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/StoreConfig.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/StoreConfig.java deleted file mode 100644 index ad09993d74..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/StoreConfig.java +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.store; - -import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; -import io.seata.server.env.ContainerHelper; -import io.seata.server.storage.file.FlushDiskMode; - -import static io.seata.common.DefaultValues.SERVER_DEFAULT_STORE_MODE; -import static io.seata.core.constants.ConfigurationKeys.STORE_FILE_PREFIX; - -/** - * @author lizhao - */ -public class StoreConfig { - - private static final Configuration CONFIGURATION = ConfigurationFactory.getInstance(); - - private static StoreMode storeMode; - - private static SessionMode sessionMode; - - private static LockMode lockMode; - - /** - * set storeMode sessionMode lockMode from StartupParameter. - * @param storeMode storeMode - * @param sessionMode sessionMode - * @param lockMode lockMode - */ - public static void setStartupParameter(String storeMode, String sessionMode, String lockMode) { - if (StringUtils.isNotBlank(storeMode)) { - StoreConfig.storeMode = StoreMode.get(storeMode); - } - if (StringUtils.isNotBlank(sessionMode)) { - StoreConfig.sessionMode = SessionMode.get(sessionMode); - } - if (StringUtils.isNotBlank(lockMode)) { - StoreConfig.lockMode = LockMode.get(lockMode); - } - } - - /** - * Default 16kb. - */ - private static final int DEFAULT_MAX_BRANCH_SESSION_SIZE = 1024 * 16; - - /** - * Default 512b. - */ - private static final int DEFAULT_MAX_GLOBAL_SESSION_SIZE = 512; - - /** - * Default 16kb. - */ - private static final int DEFAULT_WRITE_BUFFER_SIZE = 1024 * 16; - - public static int getMaxBranchSessionSize() { - return CONFIGURATION.getInt(STORE_FILE_PREFIX + "maxBranchSessionSize", DEFAULT_MAX_BRANCH_SESSION_SIZE); - } - - public static int getMaxGlobalSessionSize() { - return CONFIGURATION.getInt(STORE_FILE_PREFIX + "maxGlobalSessionSize", DEFAULT_MAX_GLOBAL_SESSION_SIZE); - } - - public static int getFileWriteBufferCacheSize() { - return CONFIGURATION.getInt(STORE_FILE_PREFIX + "fileWriteBufferCacheSize", DEFAULT_WRITE_BUFFER_SIZE); - } - - public static FlushDiskMode getFlushDiskMode() { - return FlushDiskMode.findDiskMode(CONFIGURATION.getConfig(STORE_FILE_PREFIX + "flushDiskMode")); - } - - /** - * only for inner call. - * @return StoreMode - */ - private static StoreMode getStoreMode() { - // startup - if (null != storeMode) { - return storeMode; - } - // env - String storeModeEnv = ContainerHelper.getStoreMode(); - if (StringUtils.isNotBlank(storeModeEnv)) { - return StoreMode.get(storeModeEnv); - } - // config - String storeModeConfig = CONFIGURATION.getConfig(ConfigurationKeys.STORE_MODE, SERVER_DEFAULT_STORE_MODE); - return StoreMode.get(storeModeConfig); - } - - public static SessionMode getSessionMode() { - // startup - if (null != sessionMode) { - return sessionMode; - } - // env - String sessionModeEnv = ContainerHelper.getSessionStoreMode(); - if (StringUtils.isNotBlank(sessionModeEnv)) { - return SessionMode.get(sessionModeEnv); - } - // config - String sessionModeConfig = CONFIGURATION.getConfig(ConfigurationKeys.STORE_SESSION_MODE); - if (StringUtils.isNotBlank(sessionModeConfig)) { - return SessionMode.get(sessionModeConfig); - } - // complication old config - return SessionMode.get(getStoreMode().name()); - } - - public static LockMode getLockMode() { - // startup - if (null != lockMode) { - return lockMode; - } - // env - String lockModeEnv = ContainerHelper.getLockStoreMode(); - if (StringUtils.isNotBlank(lockModeEnv)) { - return LockMode.get(lockModeEnv); - } - // config - String lockModeConfig = CONFIGURATION.getConfig(ConfigurationKeys.STORE_LOCK_MODE); - if (StringUtils.isNotBlank(lockModeConfig)) { - return LockMode.get(lockModeConfig); - } - // complication old config - return LockMode.get(getStoreMode().name()); - } - - public enum StoreMode { - - /** - * The File store mode. - */ - FILE("file"), - /** - * The Db store mode. - */ - DB("db"), - /** - * The Redis store mode. - */ - REDIS("redis"), - /** - * The Raft store mode. - */ - RAFT("raft"); - - private String name; - - StoreMode(String name) { - this.name = name; - } - - public static StoreMode get(String name) { - for (StoreMode mode : StoreMode.values()) { - if (mode.getName().equalsIgnoreCase(name)) { - return mode; - } - } - throw new IllegalArgumentException("unknown store mode:" + name); - } - - public String getName() { - return name; - } - - } - - public enum SessionMode { - - /** - * The File store mode. - */ - FILE("file"), - /** - * The Db store mode. - */ - DB("db"), - /** - * The Redis store mode. - */ - REDIS("redis"), - /** - * raft store. - */ - RAFT("raft"); - - private String name; - - SessionMode(String name) { - this.name = name; - } - - public static SessionMode get(String name) { - for (SessionMode mode : SessionMode.values()) { - if (mode.getName().equalsIgnoreCase(name)) { - return mode; - } - } - throw new IllegalArgumentException("unknown session mode:" + name); - } - - public String getName() { - return name; - } - - } - - public enum LockMode { - - /** - * The File store mode. - */ - FILE("file"), - /** - * The Db store mode. - */ - DB("db"), - /** - * The Redis store mode. - */ - REDIS("redis"), - /** - * raft store. - */ - RAFT("raft"); - - private String name; - - LockMode(String name) { - this.name = name; - } - - public static LockMode get(String name) { - for (LockMode mode : LockMode.values()) { - if (mode.getName().equalsIgnoreCase(name)) { - return mode; - } - } - throw new IllegalArgumentException("unknown lock mode:" + name); - } - - public String getName() { - return name; - } - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/TransactionStoreManager.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/TransactionStoreManager.java deleted file mode 100644 index 197582ad4e..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/store/TransactionStoreManager.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.store; - -import io.seata.core.model.GlobalStatus; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionCondition; - -import java.util.List; - -/** - * The interface Transaction store manager. - * - * @author slievrly - */ -public interface TransactionStoreManager { - - /** - * Write session boolean. - * @param logOperation the log operation - * @param session the session - * @return the boolean - */ - boolean writeSession(LogOperation logOperation, SessionStorable session); - - /** - * Read global session global session. - * @param xid the xid - * @return the global session - */ - GlobalSession readSession(String xid); - - /** - * Read session global session. - * @param xid the xid - * @param withBranchSessions the withBranchSessions - * @return the global session - */ - GlobalSession readSession(String xid, boolean withBranchSessions); - - /** - * Read session global session by sort by timeout begin status. - * @param withBranchSessions the withBranchSessions - * @return the global session - */ - List readSortByTimeoutBeginSessions(boolean withBranchSessions); - - /** - * Read session global session. - * @param statuses the statuses - * @param withBranchSessions the withBranchSessions - * @return the global session list - */ - List readSession(GlobalStatus[] statuses, boolean withBranchSessions); - - /** - * Read session by status list. - * @param sessionCondition the session condition - * @return the list - */ - List readSession(SessionCondition sessionCondition); - - /** - * Shutdown. - */ - void shutdown(); - - /** - * The enum Log operation. - */ - enum LogOperation { - - /** - * Global add log operation. - */ - GLOBAL_ADD((byte) 1), - /** - * Global update log operation. - */ - GLOBAL_UPDATE((byte) 2), - /** - * Global remove log operation. - */ - GLOBAL_REMOVE((byte) 3), - /** - * Branch add log operation. - */ - BRANCH_ADD((byte) 4), - /** - * Branch update log operation. - */ - BRANCH_UPDATE((byte) 5), - /** - * Branch remove log operation. - */ - BRANCH_REMOVE((byte) 6); - - private byte code; - - LogOperation(byte code) { - this.code = code; - } - - /** - * Gets code. - * @return the code - */ - public byte getCode() { - return this.code; - } - - /** - * Gets log operation by code. - * @param code the code - * @return the log operation by code - */ - public static LogOperation getLogOperationByCode(byte code) { - for (LogOperation temp : values()) { - if (temp.getCode() == code) { - return temp; - } - } - throw new IllegalArgumentException("Unknown LogOperation[" + code + "]"); - } - - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/transaction/at/ATCore.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/transaction/at/ATCore.java deleted file mode 100644 index 2606d6a785..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/transaction/at/ATCore.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.transaction.at; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.seata.common.exception.StoreException; -import io.seata.common.util.StringUtils; -import io.seata.core.exception.BranchTransactionException; -import io.seata.core.exception.TransactionException; -import io.seata.core.model.BranchType; -import io.seata.core.rpc.RemotingServer; -import io.seata.server.coordinator.AbstractCore; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; - -import static io.seata.common.Constants.AUTO_COMMIT; -import static io.seata.common.Constants.SKIP_CHECK_LOCK; -import static io.seata.core.exception.TransactionExceptionCode.LockKeyConflict; - -/** - * The type at core. - * - * @author ph3636 - */ -public class ATCore extends AbstractCore { - - private final ObjectMapper objectMapper = new ObjectMapper(); - - public ATCore(RemotingServer remotingServer) { - super(remotingServer); - } - - @Override - public BranchType getHandleBranchType() { - return BranchType.AT; - } - - @Override - protected void branchSessionLock(GlobalSession globalSession, BranchSession branchSession) - throws TransactionException { - String applicationData = branchSession.getApplicationData(); - boolean autoCommit = true; - boolean skipCheckLock = false; - if (StringUtils.isNotBlank(applicationData)) { - try { - Map data = objectMapper.readValue(applicationData, HashMap.class); - Object clientAutoCommit = data.get(AUTO_COMMIT); - if (clientAutoCommit != null && !(boolean) clientAutoCommit) { - autoCommit = (boolean) clientAutoCommit; - } - Object clientSkipCheckLock = data.get(SKIP_CHECK_LOCK); - if (clientSkipCheckLock instanceof Boolean) { - skipCheckLock = (boolean) clientSkipCheckLock; - } - } - catch (IOException e) { - LOGGER.error("failed to get application data: {}", e.getMessage(), e); - } - } - try { - if (!branchSession.lock(autoCommit, skipCheckLock)) { - throw new BranchTransactionException(LockKeyConflict, - String.format("Global lock acquire failed xid = %s branchId = %s", globalSession.getXid(), - branchSession.getBranchId())); - } - } - catch (StoreException e) { - Throwable cause = e.getCause(); - if (cause instanceof BranchTransactionException) { - throw new BranchTransactionException(((BranchTransactionException) cause).getCode(), - String.format("Global lock acquire failed xid = %s branchId = %s", globalSession.getXid(), - branchSession.getBranchId())); - } - throw e; - } - } - - @Override - protected void branchSessionUnlock(BranchSession branchSession) throws TransactionException { - branchSession.unlock(); - } - - @Override - public boolean lockQuery(BranchType branchType, String resourceId, String xid, String lockKeys) - throws TransactionException { - return lockManager.isLockable(xid, resourceId, lockKeys); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/transaction/saga/SagaCore.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/transaction/saga/SagaCore.java deleted file mode 100644 index f96da096cc..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/transaction/saga/SagaCore.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.transaction.saga; - -import io.netty.channel.Channel; -import io.seata.common.util.CollectionUtils; -import io.seata.core.exception.GlobalTransactionException; -import io.seata.core.exception.TransactionException; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.BranchType; -import io.seata.core.model.GlobalStatus; -import io.seata.core.protocol.transaction.BranchCommitRequest; -import io.seata.core.protocol.transaction.BranchCommitResponse; -import io.seata.core.protocol.transaction.BranchRollbackRequest; -import io.seata.core.protocol.transaction.BranchRollbackResponse; -import io.seata.core.rpc.RemotingServer; -import io.seata.core.rpc.netty.ChannelManager; -import io.seata.server.coordinator.AbstractCore; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHelper; -import io.seata.server.session.SessionHolder; - -import java.io.IOException; -import java.util.Map; -import java.util.concurrent.TimeoutException; - -/** - * The type saga core. - * - * @author ph3636 - */ -public class SagaCore extends AbstractCore { - - public SagaCore(RemotingServer remotingServer) { - super(remotingServer); - } - - @Override - public BranchType getHandleBranchType() { - return BranchType.SAGA; - } - - @Override - public void globalSessionStatusCheck(GlobalSession globalSession) throws GlobalTransactionException { - // SAGA type accept forward(retry) operation on timeout or commit fail, forward - // operation will register remaining branches - } - - @Override - public BranchStatus branchCommitSend(BranchCommitRequest request, GlobalSession globalSession, - BranchSession branchSession) throws IOException, TimeoutException { - Map channels = ChannelManager.getRmChannels(); - if (CollectionUtils.isEmpty(channels)) { - LOGGER.error("Failed to commit SAGA global[" + globalSession.getXid() + ", RM channels is empty."); - return BranchStatus.PhaseTwo_CommitFailed_Retryable; - } - String sagaResourceId = getSagaResourceId(globalSession); - Channel sagaChannel = channels.get(sagaResourceId); - if (sagaChannel == null) { - LOGGER.error("Failed to commit SAGA global[" + globalSession.getXid() - + ", cannot find channel by resourceId[" + sagaResourceId + "]"); - return BranchStatus.PhaseTwo_CommitFailed_Retryable; - } - BranchCommitResponse response = (BranchCommitResponse) remotingServer.sendSyncRequest(sagaChannel, request); - return response.getBranchStatus(); - } - - @Override - public BranchStatus branchRollbackSend(BranchRollbackRequest request, GlobalSession globalSession, - BranchSession branchSession) throws IOException, TimeoutException { - Map channels = ChannelManager.getRmChannels(); - if (CollectionUtils.isEmpty(channels)) { - LOGGER.error("Failed to rollback SAGA global[" + globalSession.getXid() + ", RM channels is empty."); - return BranchStatus.PhaseTwo_RollbackFailed_Retryable; - } - String sagaResourceId = getSagaResourceId(globalSession); - Channel sagaChannel = channels.get(sagaResourceId); - if (sagaChannel == null) { - LOGGER.error("Failed to rollback SAGA global[" + globalSession.getXid() - + ", cannot find channel by resourceId[" + sagaResourceId + "]"); - return BranchStatus.PhaseTwo_RollbackFailed_Retryable; - } - BranchRollbackResponse response = (BranchRollbackResponse) remotingServer.sendSyncRequest(sagaChannel, request); - return response.getBranchStatus(); - } - - @Override - public boolean doGlobalCommit(GlobalSession globalSession, boolean retrying) throws TransactionException { - try { - BranchStatus branchStatus = branchCommit(globalSession, SessionHelper.newBranch(BranchType.SAGA, - globalSession.getXid(), -1, getSagaResourceId(globalSession), globalSession.getStatus().name())); - - switch (branchStatus) { - case PhaseTwo_Committed: - SessionHelper.removeAllBranch(globalSession, !retrying); - LOGGER.info("Successfully committed SAGA global[" + globalSession.getXid() + "]"); - break; - case PhaseTwo_Rollbacked: - LOGGER.info("Successfully rollbacked SAGA global[" + globalSession.getXid() + "]"); - SessionHelper.removeAllBranch(globalSession, !retrying); - SessionHelper.endRollbacked(globalSession, retrying); - return false; - case PhaseTwo_RollbackFailed_Retryable: - LOGGER.error("By [{}], failed to rollback SAGA global [{}], will retry later.", branchStatus, - globalSession.getXid()); - SessionHolder.getRootSessionManager().removeGlobalSession(globalSession); - globalSession.queueToRetryRollback(); - return false; - case PhaseOne_Failed: - LOGGER.error("By [{}], finish SAGA global [{}]", branchStatus, globalSession.getXid()); - SessionHelper.removeAllBranch(globalSession, !retrying); - globalSession.changeGlobalStatus(GlobalStatus.Finished); - globalSession.end(); - return false; - case PhaseTwo_CommitFailed_Unretryable: - if (globalSession.canBeCommittedAsync()) { - LOGGER.error("By [{}], failed to commit SAGA global [{}]", branchStatus, - globalSession.getXid()); - break; - } - else { - SessionHelper.endCommitFailed(globalSession, retrying); - LOGGER.error("Finally, failed to commit SAGA global[{}]", globalSession.getXid()); - return false; - } - default: - if (!retrying) { - globalSession.queueToRetryCommit(); - } - else { - LOGGER.error("Failed to commit SAGA global[{}], will retry later.", globalSession.getXid()); - } - return false; - } - } - catch (Exception ex) { - LOGGER.error("Failed to commit global[" + globalSession.getXid() + "]", ex); - - if (!retrying) { - globalSession.queueToRetryRollback(); - } - throw new TransactionException(ex); - } - return true; - } - - @Override - public boolean doGlobalRollback(GlobalSession globalSession, boolean retrying) throws TransactionException { - try { - BranchStatus branchStatus = branchRollback(globalSession, SessionHelper.newBranch(BranchType.SAGA, - globalSession.getXid(), -1, getSagaResourceId(globalSession), globalSession.getStatus().name())); - - switch (branchStatus) { - case PhaseTwo_Rollbacked: - SessionHelper.removeAllBranch(globalSession, !retrying); - LOGGER.info("Successfully rollbacked SAGA global[{}]", globalSession.getXid()); - break; - case PhaseTwo_RollbackFailed_Unretryable: - SessionHelper.endRollbackFailed(globalSession, retrying); - LOGGER.error("Failed to rollback SAGA global[{}]", globalSession.getXid()); - return false; - case PhaseTwo_CommitFailed_Retryable: - SessionHolder.getRootSessionManager().removeGlobalSession(globalSession); - globalSession.queueToRetryCommit(); - LOGGER.warn("Retry by custom recover strategy [Forward] on timeout, SAGA global[{}]", - globalSession.getXid()); - return false; - default: - LOGGER.error("Failed to rollback SAGA global[{}]", globalSession.getXid()); - if (!retrying) { - globalSession.queueToRetryRollback(); - } - return false; - } - } - catch (Exception ex) { - LOGGER.error("Failed to rollback global[{}]", globalSession.getXid(), ex); - if (!retrying) { - globalSession.queueToRetryRollback(); - } - throw new TransactionException(ex); - } - return true; - } - - @Override - public void doGlobalReport(GlobalSession globalSession, String xid, GlobalStatus globalStatus) - throws TransactionException { - if (GlobalStatus.Committed.equals(globalStatus)) { - SessionHelper.removeAllBranch(globalSession, false); - SessionHelper.endCommitted(globalSession, false); - LOGGER.info("Global[{}] committed", globalSession.getXid()); - } - else if (GlobalStatus.Rollbacked.equals(globalStatus) || GlobalStatus.Finished.equals(globalStatus)) { - SessionHelper.removeAllBranch(globalSession, false); - SessionHelper.endRollbacked(globalSession, false); - LOGGER.info("Global[{}] rollbacked", globalSession.getXid()); - } - else { - globalSession.changeGlobalStatus(globalStatus); - LOGGER.info("Global[{}] reporting is successfully done. status[{}]", globalSession.getXid(), - globalSession.getStatus()); - - if (GlobalStatus.RollbackRetrying.equals(globalStatus) - || GlobalStatus.TimeoutRollbackRetrying.equals(globalStatus) - || GlobalStatus.UnKnown.equals(globalStatus)) { - globalSession.queueToRetryRollback(); - LOGGER.info("Global[{}] will retry rollback", globalSession.getXid()); - } - else if (GlobalStatus.CommitRetrying.equals(globalStatus)) { - globalSession.queueToRetryCommit(); - LOGGER.info("Global[{}] will retry commit", globalSession.getXid()); - } - } - } - - /** - * get saga ResourceId. - * @param globalSession the globalSession - * @return sagaResourceId - */ - private String getSagaResourceId(GlobalSession globalSession) { - return globalSession.getApplicationId() + "#" + globalSession.getTransactionServiceGroup(); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/transaction/tcc/TccCore.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/transaction/tcc/TccCore.java deleted file mode 100644 index 6302c18d40..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/transaction/tcc/TccCore.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.transaction.tcc; - -import io.seata.core.model.BranchType; -import io.seata.core.rpc.RemotingServer; -import io.seata.server.coordinator.AbstractCore; - -/** - * The type tcc core. - * - * @author ph3636 - */ -public class TccCore extends AbstractCore { - - public TccCore(RemotingServer remotingServer) { - super(remotingServer); - } - - @Override - public BranchType getHandleBranchType() { - return BranchType.TCC; - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/transaction/xa/XACore.java b/laokou-cloud/laokou-seata/src/main/java/io/seata/server/transaction/xa/XACore.java deleted file mode 100644 index 5034b9cb72..0000000000 --- a/laokou-cloud/laokou-seata/src/main/java/io/seata/server/transaction/xa/XACore.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.server.transaction.xa; - -import io.seata.core.exception.TransactionException; -import io.seata.core.model.BranchStatus; -import io.seata.core.model.BranchType; -import io.seata.core.rpc.RemotingServer; -import io.seata.server.coordinator.AbstractCore; - -/** - * The type XA core. - * - * @author sharajava - */ -public class XACore extends AbstractCore { - - public XACore(RemotingServer remotingServer) { - super(remotingServer); - } - - @Override - public BranchType getHandleBranchType() { - return BranchType.XA; - } - - @Override - public void branchReport(BranchType branchType, String xid, long branchId, BranchStatus status, - String applicationData) throws TransactionException { - super.branchReport(branchType, xid, branchId, status, applicationData); - } - -} diff --git a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.core.rpc.RegisterCheckAuthHandler b/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.core.rpc.RegisterCheckAuthHandler deleted file mode 100644 index 1a54728bca..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.core.rpc.RegisterCheckAuthHandler +++ /dev/null @@ -1 +0,0 @@ -io.seata.server.auth.DefaultCheckAuthHandler \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.core.serializer.Serializer b/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.core.serializer.Serializer deleted file mode 100644 index 750cbc7d7d..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.core.serializer.Serializer +++ /dev/null @@ -1 +0,0 @@ -io.seata.server.cluster.raft.serializer.JacksonSerializer \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.core.store.DistributedLocker b/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.core.store.DistributedLocker deleted file mode 100644 index 8ce77186f8..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.core.store.DistributedLocker +++ /dev/null @@ -1,3 +0,0 @@ -io.seata.server.storage.redis.lock.RedisDistributedLocker -io.seata.server.storage.db.lock.DataBaseDistributedLocker -io.seata.server.storage.raft.lock.RaftDistributedLocker \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.core.store.db.DataSourceProvider b/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.core.store.db.DataSourceProvider deleted file mode 100644 index ac04a85e02..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.core.store.db.DataSourceProvider +++ /dev/null @@ -1,3 +0,0 @@ -io.seata.server.store.DbcpDataSourceProvider -io.seata.server.store.DruidDataSourceProvider -io.seata.server.store.HikariDataSourceProvider \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.server.coordinator.AbstractCore b/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.server.coordinator.AbstractCore deleted file mode 100644 index a80662b025..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.server.coordinator.AbstractCore +++ /dev/null @@ -1,4 +0,0 @@ -io.seata.server.transaction.at.ATCore -io.seata.server.transaction.tcc.TccCore -io.seata.server.transaction.saga.SagaCore -io.seata.server.transaction.xa.XACore \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.server.lock.LockManager b/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.server.lock.LockManager deleted file mode 100644 index 2a1cfb1acc..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.server.lock.LockManager +++ /dev/null @@ -1,4 +0,0 @@ -io.seata.server.storage.db.lock.DataBaseLockManager -io.seata.server.storage.file.lock.FileLockManager -io.seata.server.storage.redis.lock.RedisLockManager -io.seata.server.storage.raft.lock.RaftLockManager \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.server.session.SessionManager b/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.server.session.SessionManager deleted file mode 100644 index 13b37775e3..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/META-INF/services/io.seata.server.session.SessionManager +++ /dev/null @@ -1,4 +0,0 @@ -io.seata.server.storage.file.session.FileSessionManager -io.seata.server.storage.db.session.DataBaseSessionManager -io.seata.server.storage.redis.session.RedisSessionManager -io.seata.server.storage.raft.session.RaftSessionManager \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/META-INF/spring-configuration-metadata.json b/laokou-cloud/laokou-seata/src/main/resources/META-INF/spring-configuration-metadata.json deleted file mode 100644 index 0544917752..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/META-INF/spring-configuration-metadata.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "groups": [], - "properties": [ - { - "name": "logging.extend.kafka-appender.bootstrap-servers", - "type": "java.lang.String", - "defaultValue": "localhost:9092" - }, - { - "name": "logging.extend.kafka-appender.topic", - "type": "java.lang.String", - "defaultValue": "logback_to_logstash" - }, - { - "name": "logging.extend.logstash-appender.destination", - "type": "java.lang.String", - "defaultValue": "localhost:4560" - } - ], - "hints": [ - ] -} \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/META-INF/spring.factories b/laokou-cloud/laokou-seata/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 3384008bf8..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,4 +0,0 @@ -org.springframework.context.ApplicationListener=\ -io.seata.server.spring.listener.ServerApplicationListener -org.springframework.context.ApplicationContextInitializer=\ -io.seata.server.spring.listener.SeataPropertiesLoader \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/application.yml b/laokou-cloud/laokou-seata/src/main/resources/application.yml deleted file mode 100644 index 601cbe9110..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/application.yml +++ /dev/null @@ -1,92 +0,0 @@ -# Copyright 1999-2019 Seata.io Group. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or ag`reed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -server: - port: ${SERVER_PORT:7091} - ssl: - # 开启证书 - enabled: @SSL-ENABLED@ - # 证书位置 - key-store: classpath:scg-keystore.p12 - # 证书别名 - key-alias: ${spring.application.name} - # 秘钥类型 - key-store-type: PKCS12 - # 证书密码 - key-store-password: laokou - http2: - enabled: @SSL-ENABLED@ - shutdown: graceful - undertow: - threads: - # 设置IO线程数,来执行非阻塞任务,负责多个连接数 - io: 16 - # 工作线程数 - worker: 256 - # 每块buffer的空间大小 - buffer-size: 1024 - # 分配堆外内存 - direct-buffers: true - accesslog: - enabled: true -jasypt: - encryptor: - algorithm: PBEWithMD5AndDES - iv-generator-classname: org.jasypt.iv.NoIvGenerator - password: @JASYPT-ENCRYPTOR-PASSWORD@ - -spring: - application: - name: @pom.artifactId@ - profiles: - active: @PROFILE-ACTIVE@ - -logging: - # config: classpath:logback-spring.xml - file: - path: @SEATA-LOG-PATH@ - extend: - logstash-appender: - destination: 127.0.0.1:4560 - kafka-appender: - bootstrap-servers: 127.0.0.1:9092 - topic: logback_to_logstash - -console: - user: - username: @SEATA-USERNAME@ - password: @SEATA-PASSWORD@ - -seata: - config: - type: nacos - nacos: - server-addr: @NACOS-CONFIG-ADDRESS@ - namespace: @NACOS-NAMESPACE@ - group: @SEATA-GROUP@ - username: @NACOS-USERNAME@ - password: @NACOS-PASSWORD@ - data-id: seataServer.properties - registry: - type: nacos - nacos: - server-addr: @NACOS-DISCOVERY-ADDRESS@ - group: @SEATA-GROUP@ - namespace: @NACOS-NAMESPACE@ - username: @NACOS-USERNAME@ - password: @NACOS-PASSWORD@ - security: - secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017 - tokenValidityInMilliseconds: 1800000 - ignore: - urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login diff --git a/laokou-cloud/laokou-seata/src/main/resources/banner.txt b/laokou-cloud/laokou-seata/src/main/resources/banner.txt deleted file mode 100644 index e561e763b5..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/banner.txt +++ /dev/null @@ -1,7 +0,0 @@ -███████╗███████╗ █████╗ ████████╗ █████╗ -██╔════╝██╔════╝██╔══██╗╚══██╔══╝██╔══██╗ -███████╗█████╗ ███████║ ██║ ███████║ -╚════██║██╔══╝ ██╔══██║ ██║ ██╔══██║ -███████║███████╗██║ ██║ ██║ ██║ ██║ -╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ - diff --git a/laokou-cloud/laokou-seata/src/main/resources/docker/seata-server-entrypoint.sh b/laokou-cloud/laokou-seata/src/main/resources/docker/seata-server-entrypoint.sh deleted file mode 100644 index af0f6934c9..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/docker/seata-server-entrypoint.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# Copyright 1999-2019 Seata.io Group. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# entrypoint for server - -. /seata-setup.sh -JAVA_OPT=${JAVA_OPT//"//"/"/"} -echo "Affected JVM parameters:$JAVA_OPT" -exec java $JAVA_OPT \ - -cp $( cat /seata-server/jib-classpath-file ) \ - $( cat /seata-server/jib-main-class-file ) diff --git a/laokou-cloud/laokou-seata/src/main/resources/logback-spring.xml b/laokou-cloud/laokou-seata/src/main/resources/logback-spring.xml deleted file mode 100644 index 490141ac6c..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - 0 - 2048 - true - - - - - true - 0 - 2048 - true - - - - true - 0 - 1024 - true - - - - true - 0 - 1024 - true - - - - - - - - - - - - - - - - - - - diff --git a/laokou-cloud/laokou-seata/src/main/resources/logback/console-appender.xml b/laokou-cloud/laokou-seata/src/main/resources/logback/console-appender.xml deleted file mode 100644 index 542b1b46af..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/logback/console-appender.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - ${CONSOLE_LOG_PATTERN} - UTF-8 - - - diff --git a/laokou-cloud/laokou-seata/src/main/resources/logback/file-appender.xml b/laokou-cloud/laokou-seata/src/main/resources/logback/file-appender.xml deleted file mode 100644 index 9225d75efc..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/logback/file-appender.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - ${LOG_FILE_PATH}/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.all.log - true - - ${LOG_FILE_PATH}/history/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.all.%d{yyyy-MM-dd}.%i.log.gz - 2GB - 7 - 7GB - true - - - ${FILE_LOG_PATTERN} - UTF-8 - - - - - - - WARN - ACCEPT - DENY - - ${LOG_FILE_PATH}/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.warn.log - true - - ${LOG_FILE_PATH}/history/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.warn.%d{yyyy-MM-dd}.%i.log.gz - 2GB - 7 - 7GB - true - - - ${FILE_LOG_PATTERN} - UTF-8 - - - - - - - ERROR - ACCEPT - DENY - - ${LOG_FILE_PATH}/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.error.log - true - - ${LOG_FILE_PATH}/history/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.error.%d{yyyy-MM-dd}.%i.log.gz - 2GB - 7 - 7GB - true - - - ${FILE_LOG_PATTERN} - UTF-8 - - - diff --git a/laokou-cloud/laokou-seata/src/main/resources/logback/kafka-appender.xml b/laokou-cloud/laokou-seata/src/main/resources/logback/kafka-appender.xml deleted file mode 100644 index a13000a237..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/logback/kafka-appender.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - { - "@timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}", - "level":"%p", - "app_name":"${APPLICATION_NAME:-seata-server}", - "PORT": ${RPC_PORT:-0}, - "thread_name": "%t", - "logger_name": "%logger", - "X-TX-XID": "%X{X-TX-XID:-}", - "X-TX-BRANCH-ID": "%X{X-TX-BRANCH-ID:-}", - "message": "%m", - "stack_trace": "%wex" -} - - - ${KAFKA_TOPIC} - - - bootstrap.servers=${KAFKA_BOOTSTRAP_SERVERS} - acks=0 - linger.ms=1000 - max.block.ms=0 - - diff --git a/laokou-cloud/laokou-seata/src/main/resources/logback/logstash-appender.xml b/laokou-cloud/laokou-seata/src/main/resources/logback/logstash-appender.xml deleted file mode 100644 index 2c2f972157..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/logback/logstash-appender.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - ${LOGSTASH_DESTINATION} - - - - - - { - "app_name": "${APPLICATION_NAME:-seata-server}" - } - - - - net.logstash.logback.composite.LogstashVersionJsonProvider - - net.logstash.logback.composite.loggingevent.JsonMessageJsonProvider - net.logstash.logback.composite.loggingevent.TagsJsonProvider - net.logstash.logback.composite.loggingevent.LogstashMarkersJsonProvider - net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider - - - diff --git a/laokou-cloud/laokou-seata/src/main/resources/logback/metric-appender.xml b/laokou-cloud/laokou-seata/src/main/resources/logback/metric-appender.xml deleted file mode 100644 index 5527239e18..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/logback/metric-appender.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - diff --git a/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/deleteTransactionDO.lua b/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/deleteTransactionDO.lua deleted file mode 100644 index 9845198e4d..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/deleteTransactionDO.lua +++ /dev/null @@ -1,56 +0,0 @@ --- Copyright 1999-2019 Seata.io Group. --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. - --- User: conghuhu --- Date: 2022/7/25 - --- param description --- KEYS[1] branchOrGlobalKey --- KEYS[2] listKey --- KEYS[3] REDIS_KEY_BRANCH_XID/REDIS_KEY_GLOBAL_XID --- KEYS[4] REDIS_SEATA_BEGIN_TRANSACTIONS_KEY (only type is global) --- ARGV[1] type: global or branch --- ARGV[2] globalTransactionDO xid (only type is global) --- ARGV[3] globalTransactionDO status (only type is global) - --- init data -local branchOrGlobalKey = KEYS[1]; -local listKey = KEYS[2]; -local redisKeyXID = KEYS[3]; - -local type = ARGV[1]; - -local existedXid = redis.call('HGET', branchOrGlobalKey, redisKeyXID); - -if (not existedXid or string.len(tostring(existedXid)) == 0) -then - return 'true'; -end - -if (type == 'branch') then - redis.call('LREM', listKey, 0, branchOrGlobalKey); - redis.call('DEL', branchOrGlobalKey); -elseif (type == 'global') then - local xid = ARGV[2]; - local status = tonumber(ARGV[3]); - local REDIS_SEATA_BEGIN_TRANSACTIONS_KEY = KEYS[4]; - redis.call('LREM', listKey, 0, xid); - redis.call('DEL', branchOrGlobalKey); - -- GlobalStatus.Begin or GlobalStatus.UnKnown - if (status == 1 or status == 0) then - redis.call('ZREM', REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, branchOrGlobalKey); - end -end - -return 'true'; diff --git a/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/insertTransactionDO.lua b/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/insertTransactionDO.lua deleted file mode 100644 index 75388ea68a..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/insertTransactionDO.lua +++ /dev/null @@ -1,49 +0,0 @@ --- Copyright 1999-2019 Seata.io Group. --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. - --- User: conghuhu --- Date: 2022/7/25 - --- param description --- KEYS[1] branchOrGlobalKey --- KEYS[2] listKey --- KEYS[3~-2] transactionDOMap.keys --- KEYS[-1] REDIS_SEATA_BEGIN_TRANSACTIONS_KEY (only type is global) --- ARGV[1] type: global or branch --- ARGV[2] transactionDOMap.size() --- ARGV[3~-2] transactionDOMap.values --- ARGV[-2] xid (only type is global) --- ARGV[-1] beginTime+timeout (only type is global) - --- init data -local branchOrGlobalKey = KEYS[1]; -local listKey = KEYS[2]; - -local type = ARGV[1]; -local keySize = tonumber(ARGV[2]); - -for i = 1, keySize do - redis.call('HSET', branchOrGlobalKey, KEYS[i + 2], ARGV[i + 2]); -end - -if type == 'branch' then - redis.call('RPUSH', listKey, branchOrGlobalKey); -elseif type == 'global' then - local REDIS_SEATA_BEGIN_TRANSACTIONS_KEY = KEYS[keySize + 3]; - redis.call('RPUSH', listKey, ARGV[keySize + 3]); - redis.call('ZADD', REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, ARGV[keySize + 4], branchOrGlobalKey) -end - -return 'true'; - diff --git a/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/rollbackGlobalTransactionDO.lua b/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/rollbackGlobalTransactionDO.lua deleted file mode 100644 index 5e6c4a6a05..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/rollbackGlobalTransactionDO.lua +++ /dev/null @@ -1,57 +0,0 @@ --- Copyright 1999-2019 Seata.io Group. --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. - --- User: conghuhu --- Date: 2022/7/27 - --- param description --- KEYS[1] globalKey --- KEYS[2] REDIS_KEY_GLOBAL_XID --- KEYS[3] REDIS_KEY_GLOBAL_STATUS --- KEYS[4] REDIS_KEY_GLOBAL_GMT_MODIFIED --- KEYS[5] status --- ARGV[1] previousStatus --- ARGV[2] previousGmtModified --- ARGV[3] xid --- ARGV[4] hmset --- ARGV[5] lrem --- ARGV[6] rpush - --- init data -local globalKey = KEYS[1]; -local REDIS_KEY_GLOBAL_XID = KEYS[2]; -local REDIS_KEY_GLOBAL_STATUS = KEYS[3]; -local REDIS_KEY_GLOBAL_GMT_MODIFIED = KEYS[4]; -local status = KEYS[5]; -local previousStatus = ARGV[1]; -local previousGmtModified = ARGV[2]; -local xid = ARGV[3]; -local hmset = ARGV[4]; -local lrem = ARGV[5]; -local rpush = ARGV[6]; - -if string.upper(hmset) == "OK" then - local xid2 = redis.call('HGET', globalKey, REDIS_KEY_GLOBAL_XID); - if (xid2 and string.len(tostring(xid2)) ~= 0) then - redis.call('HMSET', globalKey, REDIS_KEY_GLOBAL_STATUS, previousStatus, REDIS_KEY_GLOBAL_GMT_MODIFIED, previousGmtModified); - end -end - -if tonumber(lrem) > 0 then - redis.call('RPUSH', 'SEATA_STATUS_' .. previousStatus, xid); -end - -if tonumber(rpush) then - redis.call('LREM', 'SEATA_STATUS_' .. status, 0, xid); -end \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/updateBranchTransactionDO.lua b/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/updateBranchTransactionDO.lua deleted file mode 100644 index 24e3083cde..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/updateBranchTransactionDO.lua +++ /dev/null @@ -1,55 +0,0 @@ --- Copyright 1999-2019 Seata.io Group. --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. - --- User: conghuhu --- Date: 2022/7/27 - --- param description --- KEYS[1] branchKey --- KEYS[2] REDIS_KEY_BRANCH_STATUS --- KEYS[3] REDIS_KEY_BRANCH_GMT_MODIFIED --- KEYS[4] REDIS_KEY_BRANCH_APPLICATION_DATA --- ARGV[1] branchStatus --- ARGV[2] nowTime --- ARGV[3] applicationData - --- init data -local branchKey = KEYS[1]; -local REDIS_KEY_BRANCH_STATUS = KEYS[2]; -local REDIS_KEY_BRANCH_GMT_MODIFIED = KEYS[3]; -local REDIS_KEY_BRANCH_APPLICATION_DATA = KEYS[4]; -local branchStatus = ARGV[1]; -local nowTime = ARGV[2]; -local applicationData = ARGV[3]; -local result = {}; - -local previousBranchStatus = redis.call('HGET', branchKey, REDIS_KEY_BRANCH_STATUS); -if (not previousBranchStatus or string.len(tostring(previousBranchStatus)) == 0) -then - result['success'] = false; - result['status'] = ''; - result['data'] = ''; - return cjson.encode(result); -end - -redis.call('HSET', branchKey, REDIS_KEY_BRANCH_STATUS, branchStatus); -redis.call('HSET', branchKey, REDIS_KEY_BRANCH_GMT_MODIFIED, nowTime); -if (applicationData and string.len(tostring(applicationData)) ~= 0) then - redis.call('HSET', branchKey, REDIS_KEY_BRANCH_APPLICATION_DATA, applicationData); -end - -result['success'] = true; -result['status'] = ''; -result['data'] = ''; -return cjson.encode(result); \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/updateGlobalTransactionDO.lua b/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/updateGlobalTransactionDO.lua deleted file mode 100644 index 438029625c..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/lua/redisStore/updateGlobalTransactionDO.lua +++ /dev/null @@ -1,109 +0,0 @@ --- Copyright 1999-2019 Seata.io Group. --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. - --- User: conghuhu --- Date: 2022/7/27 - --- param description --- KEYS[1] globalKey --- KEYS[2] REDIS_KEY_GLOBAL_STATUS --- KEYS[3] REDIS_KEY_GLOBAL_GMT_MODIFIED --- KEYS[4] REDIS_SEATA_BEGIN_TRANSACTIONS_KEY --- ARGV[1] status --- ARGV[2] nowTime --- ARGV[3] xid - --- init data -local globalKey = KEYS[1]; -local REDIS_KEY_GLOBAL_STATUS = KEYS[2]; -local REDIS_KEY_GLOBAL_GMT_MODIFIED = KEYS[3]; -local REDIS_SEATA_BEGIN_TRANSACTIONS_KEY = KEYS[4]; - -local status = ARGV[1]; -local nowTime = ARGV[2]; -local xid = ARGV[3]; - -local result = {}; - --- is timeout global status -local function isTimeoutGlobalStatus(s) - local globalStatus = tonumber(s); - return globalStatus == 13 or globalStatus == 14 or globalStatus == 6 or globalStatus == 7; -end - --- is rollback global status -local function isRollbackGlobalStatus(s) - local globalStatus = tonumber(s); - return globalStatus == 4 or globalStatus == 5 or globalStatus == 11 or globalStatus == 12 or globalStatus == 17; -end - -local function isCommitGlobalStatus(s) - local globalStatus = tonumber(s); - return globalStatus == 2 or globalStatus == 8 or globalStatus == 3 or globalStatus == 9 or globalStatus == 10 or globalStatus == 16; -end - --- check the relation of before status and after status -local function validateUpdateStatus(before, after) - if isTimeoutGlobalStatus(before) and isCommitGlobalStatus(after) then - return false; - end - if isCommitGlobalStatus(before) and isTimeoutGlobalStatus(after) then - return false; - end - if isRollbackGlobalStatus(before) and isCommitGlobalStatus(after) then - return false; - end - if isCommitGlobalStatus(before) and isRollbackGlobalStatus(after) then - return false; - end - return true; -end - -local statusAndGmtModified = redis.call('HMGET', globalKey, REDIS_KEY_GLOBAL_STATUS, REDIS_KEY_GLOBAL_GMT_MODIFIED); -local previousStatus = statusAndGmtModified[1]; -local previousGmtModified = statusAndGmtModified[2]; - -if (not previousStatus and string.len(tostring(previousStatus)) ~= 0) then - result['success'] = false; - result['status'] = 'NotExisted'; - result['data'] = ''; - return cjson.encode(result); -end - -if previousStatus == status then - result['success'] = true; - result['status'] = ''; - result['data'] = ''; - return cjson.encode(result); -end - -if not validateUpdateStatus(previousStatus, status) then - result['success'] = false; - result['status'] = 'ChangeStatusFail'; - result['data'] = previousGmtModified; - return cjson.encode(result); -end - -local data = {}; -data[1] = redis.call('HMSET', globalKey, REDIS_KEY_GLOBAL_STATUS, status, REDIS_KEY_GLOBAL_GMT_MODIFIED, nowTime)['ok']; -data[2] = tostring(redis.call('LREM', 'SEATA_STATUS_' .. previousStatus, 0, xid)); -data[3] = tostring(redis.call('RPUSH', 'SEATA_STATUS_' .. status, xid)); -data[4] = tostring(redis.call('ZREM', REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, globalKey)); -data[5] = previousStatus; -data[6] = previousGmtModified; - -result['success'] = true; -result['status'] = ''; -result['data'] = cjson.encode(data); -return cjson.encode(result); \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/lua/redislocker/acquireRedisLock.lua b/laokou-cloud/laokou-seata/src/main/resources/lua/redislocker/acquireRedisLock.lua deleted file mode 100644 index cb1668cf6e..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/lua/redislocker/acquireRedisLock.lua +++ /dev/null @@ -1,98 +0,0 @@ --- Copyright 1999-2019 Seata.io Group. --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. - --- User: tianyu.li;conghuhu --- Date: 2022/7/1 - --- param description --- ARGV[1] needLockDOs.size() --- ARGV[2] argSize --- ARGV[3] needLockXid --- ARGV[-1] localKeysString --- KEYS[1 ~ needLockKeys.size()] needLockKeys --- KEYS[-2] xidLockKey --- KEYS[-1] branchId - --- init data -local array = {}; -local result = {}; -local keySize = ARGV[1]; -local argSize = ARGV[2]; --- Loop through all keys to see if they can be used , when a key is not available, exit -for i = 1, keySize do - local needLockKey = KEYS[i] - -- search lock xid - local existedLockXid = redis.call('HGET', needLockKey, 'xid'); - -- query lockStatus - local status = redis.call('HGET', needLockKey, 'status'); - - -- if a global lock is found in the Rollbacking state,the fail-fast code is returned directly - if (status == '1' or tonumber(status) == 1) - then - result["success"] = false - result['status'] = 'AnotherRollbackIng' - result["data"] = existedLockXid - return cjson.encode(result) - end - - -- if lock xid is nil - if (not existedLockXid) - -- set 'no' mean There is need to store lock information - then - array[i] = 'no' - else - if (existedLockXid ~= ARGV[3]) - then - -- return fail - result['success'] = false - result['status'] = 'AnotherHoldIng' - result["data"] = existedLockXid - return cjson.encode(result) - else - -- set 'yes' mean There is not need to store lock information - array[i] = 'yes' - end - end -end --- Loop through array -for i = 1, keySize do - -- if is no ,The lock information is stored - if (array[i] == 'no') - then - -- set xid - redis.call('HSET', KEYS[i], 'xid', ARGV[3]); - -- set transactionId - redis.call('HSET', KEYS[i], 'transactionId', ARGV[(i - 1) * 6 + 4]); - -- set branchId - redis.call('HSET', KEYS[i], 'branchId', ARGV[(i - 1) * 6 + 5]); - -- set resourceId - redis.call('HSET', KEYS[i], 'resourceId', ARGV[(i - 1) * 6 + 6]); - -- set tableName - redis.call('HSET', KEYS[i], 'tableName', ARGV[(i - 1) * 6 + 7]); - -- set rowKey - redis.call('HSET', KEYS[i], 'rowKey', ARGV[(i - 1) * 6 + 8]); - -- set pk - redis.call('HSET', KEYS[i], 'pk', ARGV[(i - 1) * 6 + 9]); - -- exit if - end - -- exit for -end --- set SEATA_GLOBAL_LOCK -redis.call('HSET', KEYS[(keySize + 1)], KEYS[(keySize + 2)], ARGV[(argSize + 0)]); - --- return success -result['success'] = true -result['status'] = 'GetLock' -result['data'] = ARGV[3] -return cjson.encode(result) diff --git a/laokou-cloud/laokou-seata/src/main/resources/lua/redislocker/isLockable.lua b/laokou-cloud/laokou-seata/src/main/resources/lua/redislocker/isLockable.lua deleted file mode 100644 index 7325966f27..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/lua/redislocker/isLockable.lua +++ /dev/null @@ -1,33 +0,0 @@ --- Copyright 1999-2019 Seata.io Group. --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. - --- User: conghuhu --- Date: 2022/7/7 - --- param description --- KEYS[1] lockKeys.size() --- KEYS[2~lockKeys.size()+1] lockKey --- ARGV[1] xid - --- init data -local lockKeysSize = tonumber(KEYS[1]); -local xid = tostring(ARGV[1]); -for i = 1, lockKeysSize do - local lockKey = KEYS[i + 1] - local existedXid = redis.call('HGET', lockKey, 'xid') - if (existedXid == nil or xid == tostring(existedXid)) then - return 'true' - end -end -return 'false' \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/lua/redislocker/releaseRedisLock.lua b/laokou-cloud/laokou-seata/src/main/resources/lua/redislocker/releaseRedisLock.lua deleted file mode 100644 index 72176dcdd5..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/lua/redislocker/releaseRedisLock.lua +++ /dev/null @@ -1,117 +0,0 @@ --- Copyright 1999-2019 Seata.io Group. --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. - --- User: conghuhu --- Date: 2022/7/7 - --- param description --- KEYS[1] xidLockKey --- KEYS[2] branchId - --- init data -local xidLockKey = KEYS[1]; -local branchId = KEYS[2]; - -local rowKeys = {} - --- get table length -local function table_len(t) - local len = 0 - for _, _ in pairs(t) do - len = len + 1 - end - return len; -end - --- split -local function split(target, sep) - local str = tostring(target) - local separator = tostring(sep) - local strB, arrayIndex = 1, 1 - local targetArray = {} - if (separator == nil) - then - return false - end - local condition = true - while (condition) - do - local si, sd = string.find(str, separator, strB) - if (si) - then - targetArray[arrayIndex] = string.sub(str, strB, si - 1) - arrayIndex = arrayIndex + 1 - strB = sd + 1 - else - targetArray[arrayIndex] = string.sub(str, strB, string.len(str)) - condition = false - end - end - return targetArray -end - --- start -if (not branchId) -then - local rowKeyMap = redis.call('HGETALL', xidLockKey) - for i = 1, table_len(rowKeyMap) do - if (i % 2 == 0) - then - rowKeys[i / 2] = rowKeyMap[i] - end - end -else - local rowKey = redis.call('HGET', xidLockKey, branchId) - rowKeys[1] = rowKey -end - -if (table_len(rowKeys) == 0) --- rowKeys is empty -then - return true -end - -if (not branchId) --- branchId is null -then - redis.call('DEL', xidLockKey) -else - redis.call('HDEL', xidLockKey, branchId) -end - -for _, value in pairs(rowKeys) do - local rowKeyStr = tostring(value) - if (string.len(rowKeyStr) == 0) - -- rowKeyStr is empty - then - return true - end - - local start, _ = string.find(rowKeyStr, ';') - if (start) - -- rowKeyStr contains ';' - then - local keys = split(rowKeyStr, ';') - redis.call('DEL', unpack(keys)) - else - redis.call('DEL', rowKeyStr) - end -end - -return true - - - - - diff --git a/laokou-cloud/laokou-seata/src/main/resources/lua/redislocker/updateLockStatus.lua b/laokou-cloud/laokou-seata/src/main/resources/lua/redislocker/updateLockStatus.lua deleted file mode 100644 index d3170d3395..0000000000 --- a/laokou-cloud/laokou-seata/src/main/resources/lua/redislocker/updateLockStatus.lua +++ /dev/null @@ -1,82 +0,0 @@ --- Copyright 1999-2019 Seata.io Group. --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. - --- User: conghuhu --- Date: 2022/7/7 - --- param description --- KEYS[1] xidLockKey --- KEYS[2] status --- ARGV[1] code - --- init data -local xidLockKey = KEYS[1]; -local status = KEYS[2]; -local code = ARGV[1]; - --- get table length -local function table_len(t) - local len = 0 - for _, _ in pairs(t) do - len = len + 1 - end - return len; -end - --- split -local function split(target, sep) - local str = tostring(target) - local separator = tostring(sep) - local strB, arrayIndex = 1, 1 - local targetArray = {} - if (separator == nil) - then - return false - end - local condition = true - while (condition) - do - local si, sd = string.find(str, separator, strB) - if (si) - then - targetArray[arrayIndex] = string.sub(str, strB, si - 1) - arrayIndex = arrayIndex + 1 - strB = sd + 1 - else - targetArray[arrayIndex] = string.sub(str, strB, string.len(str)) - condition = false - end - end - return targetArray -end - -local branchAndLockKeys = redis.call('HGETALL', xidLockKey) -for i = 1, table_len(branchAndLockKeys) do - if (i % 2 == 0) - then - local k = tostring(branchAndLockKeys[i]) - local start, _ = string.find(k, ';') - if (start) - -- k contains ';' - then - local keys = split(k, ';') - for _, key in pairs(keys) - do - redis.call('HSET', key, status, code) - end - else - redis.call('HSET', k, status, code) - end - end -end \ No newline at end of file diff --git a/laokou-cloud/laokou-seata/src/main/resources/scg-keystore.p12 b/laokou-cloud/laokou-seata/src/main/resources/scg-keystore.p12 deleted file mode 100644 index fdcde6ba69..0000000000 Binary files a/laokou-cloud/laokou-seata/src/main/resources/scg-keystore.p12 and /dev/null differ diff --git a/laokou-cloud/pom.xml b/laokou-cloud/pom.xml index 26413a1a43..0903d1cb00 100644 --- a/laokou-cloud/pom.xml +++ b/laokou-cloud/pom.xml @@ -17,7 +17,7 @@ * */ --> - org.laokou @@ -33,7 +33,6 @@ laokou-gateway laokou-monitor laokou-register - laokou-seata laokou-sentinel laokou-snail-job diff --git a/laokou-common/laokou-common-bom/pom.xml b/laokou-common/laokou-common-bom/pom.xml index 6d63687bcd..533a3d293a 100644 --- a/laokou-common/laokou-common-bom/pom.xml +++ b/laokou-common/laokou-common-bom/pom.xml @@ -120,12 +120,26 @@ 5.0 - 1.65.1 + 1.64.2 + + 2.29.0 + + 2.23.0 + + com.google.errorprone + error_prone_annotations + ${error_prone_annotations.version} + + + com.google.api.grpc + proto-google-common-protos + ${proto-google-common-protos.version} + io.grpc grpc-netty @@ -599,11 +613,6 @@ laokou-common-cors ${laokou.version} - - org.laokou - laokou-common-seata - ${laokou.version} - com.google.guava guava @@ -679,11 +688,6 @@ laokou-common-openapi-doc ${laokou.version} - - org.laokou - laokou-seata - ${laokou.version} - org.laokou laokou-auth-client diff --git a/laokou-common/laokou-common-core/pom.xml b/laokou-common/laokou-common-core/pom.xml index fec37fb94d..83300ce376 100644 --- a/laokou-common/laokou-common-core/pom.xml +++ b/laokou-common/laokou-common-core/pom.xml @@ -36,6 +36,12 @@ com.google.code.gson gson + + + com.google.errorprone + error_prone_annotations + + com.fasterxml.jackson.datatype @@ -104,6 +110,12 @@ com.google.guava guava + + + com.google.errorprone + error_prone_annotations + + com.alibaba @@ -114,5 +126,9 @@ jakarta.servlet-api provided + + com.google.errorprone + error_prone_annotations + diff --git a/laokou-common/laokou-common-i18n/src/main/java/org/laokou/common/i18n/common/exception/SystemException.java b/laokou-common/laokou-common-i18n/src/main/java/org/laokou/common/i18n/common/exception/SystemException.java index 5e23df6df6..d31a913673 100644 --- a/laokou-common/laokou-common-i18n/src/main/java/org/laokou/common/i18n/common/exception/SystemException.java +++ b/laokou-common/laokou-common-i18n/src/main/java/org/laokou/common/i18n/common/exception/SystemException.java @@ -64,16 +64,6 @@ public final class SystemException extends GlobalException { */ public static final String FLOWED = "S_Sentinel_Flowed"; - /** - * 分布式事务已宕机. - */ - public static final String DISTRIBUTED_TRANSACTION_DOWNTIME = "S_Seata_TransactionDowntime"; - - /** - * 分布式事务已超时. - */ - public static final String DISTRIBUTED_TRANSACTION_TIMEOUT = "S_Seata_TransactionTimeout"; - /** * 表不存在. */ diff --git a/laokou-common/laokou-common-i18n/src/main/resources/i18n/message.properties b/laokou-common/laokou-common-i18n/src/main/resources/i18n/message.properties index 625d0324c6..299a23a4c4 100644 --- a/laokou-common/laokou-common-i18n/src/main/resources/i18n/message.properties +++ b/laokou-common/laokou-common-i18n/src/main/resources/i18n/message.properties @@ -41,8 +41,6 @@ S_Sentinel_SystemBlocked=\u7CFB\u7EDF\u89C4\u5219\u9519\u8BEF S_Sentinel_ParamFlowed=\u70ED\u70B9\u53C2\u6570\u5DF2\u9650\u6D41 S_Sentinel_Degraded=\u5DF2\u964D\u7EA7 S_Sentinel_Flowed=\u5DF2\u9650\u6D41 -S_Seata_TransactionDowntime=\u5206\u5E03\u5F0F\u4E8B\u52A1\u5DF2\u5B95\u673A -S_Seata_TransactionTimeout=\u5206\u5E03\u5F0F\u4E8B\u52A1\u5DF2\u8D85\u65F6 S_DS_TableNotExist=\u8868 {0} \u4E0D\u5B58\u5728 A_OAuth2_SourceNotExist=\u6570\u636E\u6E90\u4E0D\u5B58\u5728 S_User_AESDecryptUsernameFail=\u7528\u6237\u540D\u89E3\u5BC6\u5931\u8D25 diff --git a/laokou-common/laokou-common-i18n/src/main/resources/i18n/message_en.properties b/laokou-common/laokou-common-i18n/src/main/resources/i18n/message_en.properties index 79480854bc..1c642c0425 100644 --- a/laokou-common/laokou-common-i18n/src/main/resources/i18n/message_en.properties +++ b/laokou-common/laokou-common-i18n/src/main/resources/i18n/message_en.properties @@ -40,8 +40,6 @@ S_Sentinel_SystemBlocked=System rule error S_Sentinel_ParamFlowed=Hot spot parameters are restricted S_Sentinel_Degraded=Degraded S_Sentinel_Flowed=Flowed -S_Seata_TransactionDowntime=Distributed transaction has crashed -S_Seata_TransactionTimeout=Distributed transaction has timed out S_DS_TableNotExist=Table {0} does not exist A_OAuth2_SourceNotExist=The data source does not exist S_User_AESDecryptUsernameFail=User name decryption failed diff --git a/laokou-common/laokou-common-i18n/src/main/resources/i18n/message_en_US.properties b/laokou-common/laokou-common-i18n/src/main/resources/i18n/message_en_US.properties index 79480854bc..1c642c0425 100644 --- a/laokou-common/laokou-common-i18n/src/main/resources/i18n/message_en_US.properties +++ b/laokou-common/laokou-common-i18n/src/main/resources/i18n/message_en_US.properties @@ -40,8 +40,6 @@ S_Sentinel_SystemBlocked=System rule error S_Sentinel_ParamFlowed=Hot spot parameters are restricted S_Sentinel_Degraded=Degraded S_Sentinel_Flowed=Flowed -S_Seata_TransactionDowntime=Distributed transaction has crashed -S_Seata_TransactionTimeout=Distributed transaction has timed out S_DS_TableNotExist=Table {0} does not exist A_OAuth2_SourceNotExist=The data source does not exist S_User_AESDecryptUsernameFail=User name decryption failed diff --git a/laokou-common/laokou-common-i18n/src/main/resources/i18n/message_zh_CN.properties b/laokou-common/laokou-common-i18n/src/main/resources/i18n/message_zh_CN.properties index 7db106cfea..97bff6d32b 100644 --- a/laokou-common/laokou-common-i18n/src/main/resources/i18n/message_zh_CN.properties +++ b/laokou-common/laokou-common-i18n/src/main/resources/i18n/message_zh_CN.properties @@ -40,8 +40,6 @@ S_Sentinel_SystemBlocked=\u7CFB\u7EDF\u89C4\u5219\u9519\u8BEF S_Sentinel_ParamFlowed=\u70ED\u70B9\u53C2\u6570\u5DF2\u9650\u6D41 S_Sentinel_Degraded=\u5DF2\u964D\u7EA7 S_Sentinel_Flowed=\u5DF2\u9650\u6D41 -S_Seata_TransactionDowntime=\u5206\u5E03\u5F0F\u4E8B\u52A1\u5DF2\u5B95\u673A -S_Seata_TransactionTimeout=\u5206\u5E03\u5F0F\u4E8B\u52A1\u5DF2\u8D85\u65F6 S_DS_TableNotExist=\u8868 {0} \u4E0D\u5B58\u5728 A_OAuth2_SourceNotExist=\u6570\u636E\u6E90\u4E0D\u5B58\u5728 S_User_AESDecryptUsernameFail=\u7528\u6237\u540D\u89E3\u5BC6\u5931\u8D25 diff --git a/laokou-common/laokou-common-nacos/pom.xml b/laokou-common/laokou-common-nacos/pom.xml index b3ff71c34a..0828314421 100644 --- a/laokou-common/laokou-common-nacos/pom.xml +++ b/laokou-common/laokou-common-nacos/pom.xml @@ -76,6 +76,12 @@ com.alibaba.nacos nacos-api + + + com.google.api.grpc + proto-google-common-protos + + com.alibaba.nacos @@ -90,6 +96,11 @@ jakarta.servlet-api provided + + com.google.api.grpc + proto-google-common-protos + 2.29.0 + diff --git a/laokou-common/laokou-common-seata/pom.xml b/laokou-common/laokou-common-seata/pom.xml deleted file mode 100644 index 29b3f66859..0000000000 --- a/laokou-common/laokou-common-seata/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - laokou-common - org.laokou - 3.3.2 - - 4.0.0 - - laokou-common-seata - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-seata - - - com.alibaba - druid - - - - - org.laokou - laokou-common-i18n - - - - diff --git a/laokou-common/laokou-common-seata/src/main/java/org/laokou/common/seata/handler/SeataExceptionHandler.java b/laokou-common/laokou-common-seata/src/main/java/org/laokou/common/seata/handler/SeataExceptionHandler.java deleted file mode 100644 index 8038b5f163..0000000000 --- a/laokou-common/laokou-common-seata/src/main/java/org/laokou/common/seata/handler/SeataExceptionHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2022-2024 KCloud-Platform-IoT Author or Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.laokou.common.seata.handler; - -import io.seata.common.exception.FrameworkException; -import io.seata.core.exception.RmTransactionException; -import org.laokou.common.i18n.dto.Result; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -import static org.laokou.common.i18n.common.exception.StatusCode.INTERNAL_SERVER_ERROR; -import static org.laokou.common.i18n.common.exception.SystemException.DISTRIBUTED_TRANSACTION_DOWNTIME; -import static org.laokou.common.i18n.common.exception.SystemException.DISTRIBUTED_TRANSACTION_TIMEOUT; - -/** - * @author laokou - */ -@Component -@ResponseBody -@RestControllerAdvice -public class SeataExceptionHandler { - - @ExceptionHandler({ RmTransactionException.class, FrameworkException.class }) - public Result handle(Exception ex) { - if (ex instanceof RmTransactionException) { - return Result.fail(DISTRIBUTED_TRANSACTION_TIMEOUT); - } - else if (ex instanceof FrameworkException) { - return Result.fail(DISTRIBUTED_TRANSACTION_DOWNTIME); - } - return Result.fail(INTERNAL_SERVER_ERROR); - } - -} diff --git a/laokou-common/laokou-common-seata/src/main/java/org/laokou/common/seata/handler/package-info.java b/laokou-common/laokou-common-seata/src/main/java/org/laokou/common/seata/handler/package-info.java deleted file mode 100644 index 7d223c9fec..0000000000 --- a/laokou-common/laokou-common-seata/src/main/java/org/laokou/common/seata/handler/package-info.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2022-2024 KCloud-Platform-IoT Author or Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/** - * @author laokou - */ -package org.laokou.common.seata.handler; diff --git a/laokou-common/pom.xml b/laokou-common/pom.xml index 717e61c5c6..7f1250327e 100644 --- a/laokou-common/pom.xml +++ b/laokou-common/pom.xml @@ -17,7 +17,7 @@ * */ --> - org.laokou @@ -49,7 +49,6 @@ laokou-common-prometheus laokou-common-kafka laokou-common-cors - laokou-common-seata laokou-common-log4j2 laokou-common-trace laokou-common-algorithm diff --git a/laokou-service/laokou-admin/laokou-admin-infrastructure/pom.xml b/laokou-service/laokou-admin/laokou-admin-infrastructure/pom.xml index 97592102ac..79190cd5e6 100644 --- a/laokou-service/laokou-admin/laokou-admin-infrastructure/pom.xml +++ b/laokou-service/laokou-admin/laokou-admin-infrastructure/pom.xml @@ -1,6 +1,6 @@ - org.laokou @@ -49,16 +49,6 @@ org.laokou laokou-admin-domain - - org.laokou - laokou-common-seata - - - org.springframework.boot - spring-boot-starter-web - - - org.laokou laokou-common-openfeign diff --git a/laokou-service/laokou-admin/laokou-admin-start/src/main/resources/bootstrap.yml b/laokou-service/laokou-admin/laokou-admin-start/src/main/resources/bootstrap.yml index cbe503d752..93b4b84c68 100644 --- a/laokou-service/laokou-admin/laokou-admin-start/src/main/resources/bootstrap.yml +++ b/laokou-service/laokou-admin/laokou-admin-start/src/main/resources/bootstrap.yml @@ -48,9 +48,6 @@ spring: - data-id: application-common.yaml group: ${NACOS-GROUP} refresh: true - - data-id: application-common-seata.yaml - group: ${NACOS-GROUP} - refresh: true - data-id: application-common-elasticsearch.yaml group: ${NACOS-GROUP} refresh: true diff --git a/pom.xml b/pom.xml index 1a6953e9e4..61895c76b0 100644 --- a/pom.xml +++ b/pom.xml @@ -189,10 +189,6 @@ LAOKOU_GROUP nacos nacos - SEATA_GROUP - seata - seata - ./logs/seata sentinel sentinel dev @@ -235,10 +231,6 @@ LAOKOU_GROUP nacos nacos - SEATA_GROUP - seata - seata - ./logs/seata sentinel sentinel test @@ -310,14 +302,6 @@ ${NACOS_PASSWORD:nacos} - ${SEATA_GROUP:SEATA_GROUP} - - ${SEATA_USERNAME:seata} - - ${SEATA_PASSWORD:seata} - - ${SEATA_LOG_PATH:/opt} - ${SENTINEL_USERNAME:sentinel} ${SENTINEL_PASSWORD:sentinel} diff --git "a/src/docs/asciidoc/\345\274\200\347\257\207.adoc" "b/src/docs/asciidoc/\345\274\200\347\257\207.adoc" index fc0e5da730..2f4df88ef7 100644 --- "a/src/docs/asciidoc/\345\274\200\347\257\207.adoc" +++ "b/src/docs/asciidoc/\345\274\200\347\257\207.adoc" @@ -46,7 +46,7 @@ |负载均衡 |Spring Cloud Loadbalancer |服务熔断&降级&限流 |Sentinel |分库分表 |Mybatis Plus -|分布式事务 |Seata & RocketMQ +|分布式事务 |RocketMQ |消息队列 |RocketMQ & Kafka & MQTT |服务监控 |Spring Boot Admin & Prometheus |高亮搜索 |Elasticsearch diff --git a/test_error b/test_error index 34f30574f0..39e039cf39 100644 --- a/test_error +++ b/test_error @@ -6,9 +6,6 @@ S_Sentinel_SystemBlocked S_Sentinel_ParamFlowed S_Sentinel_Authority -S_Seata_TransactionTimeout -S_Seata_TransactionDowntime - S_Ip_Blacked S_Ip_Restricted