From 05b06dbc502da15ad9133b6cd6cc5540c774f433 Mon Sep 17 00:00:00 2001 From: SergioLangaritaBenitez Date: Mon, 22 Apr 2024 10:24:50 +0200 Subject: [PATCH 1/3] change on kafka and update documentation --- cli/dcnios-cli.py | 3 ++ cli/description.yaml | 22 +++++++++++++ cli/sources/auxiliaryFunctions.py | 10 ++++-- .../02.1.-dcache.md | 0 .../02.2.-generic.md | 0 docpage/docs/02.-Inputs/02.3.-Kafka.md | 31 +++++++++++++++++++ docpage/docs/02.-Inputs/02.4.-SQS.md | 16 ++++++++++ docpage/docs/02.-Inputs/02.5.-S3.md | 17 ++++++++++ .../03.1.-OSCAR.md} | 0 docpage/docs/04.-AWS.md | 12 +++++++ 10 files changed, 109 insertions(+), 2 deletions(-) rename docpage/docs/{02.-ProcessGroup => 02.-Inputs}/02.1.-dcache.md (100%) rename docpage/docs/{02.-ProcessGroup => 02.-Inputs}/02.2.-generic.md (100%) create mode 100644 docpage/docs/02.-Inputs/02.3.-Kafka.md create mode 100644 docpage/docs/02.-Inputs/02.4.-SQS.md create mode 100644 docpage/docs/02.-Inputs/02.5.-S3.md rename docpage/docs/{02.-ProcessGroup/02.3.-OSCAR.md => 03.-Outputs/03.1.-OSCAR.md} (100%) create mode 100644 docpage/docs/04.-AWS.md diff --git a/cli/dcnios-cli.py b/cli/dcnios-cli.py index 5ea44946..9e58b257 100644 --- a/cli/dcnios-cli.py +++ b/cli/dcnios-cli.py @@ -153,6 +153,9 @@ def newProcessInfo(name): kafkacontent=prepareforAll(kafkafile) kafkacontent=kafkaPreparefile(kafkacontent,kafka) #Set ssl context configuration + kafka["ssl_context"]["SSL_Protocol"]="TLS" + kafka["ssl_context"]["Truststore_Type"]="PKCS12" + kafka["ssl_context"]["Truststore_Filename"]="/opt/nifi/nifi-current/data/"+kafka["ssl_context"]["Truststore_Filename"] kafkacontent=ssl_context(kafkacontent,kafka["ssl_context"]) #Create object nifi.create(kafka["name"],kafkacontent) diff --git a/cli/description.yaml b/cli/description.yaml index fc4b8653..3685ed59 100644 --- a/cli/description.yaml +++ b/cli/description.yaml @@ -23,6 +23,28 @@ nifi: #components: # - name: InvokeOSCAR # seconds: 2 + Kafka: + - name: kafkaaa + bootstrap_servers: :9094 + topic: + group_id: "1" + sasl_username: + sasl_password: + #separate_by_key: "false" + #message_demarcator: ";" + ssl_context: + Truststore_Filename: + Truststore_Password: "" + SQS: + - name: SQS-events + AWS_DEFAULT_REGION: + queue_name: + S3: + - name: S3_download + AWS_ACCESS_KEY_ID: + AWS_SECRET_ACCESS_KEY: + AWS_DEFAULT_REGION: + AWS_S3_BUCKET: generic: - name: file: diff --git a/cli/sources/auxiliaryFunctions.py b/cli/sources/auxiliaryFunctions.py index e413eb06..6515353a 100644 --- a/cli/sources/auxiliaryFunctions.py +++ b/cli/sources/auxiliaryFunctions.py @@ -36,8 +36,14 @@ def prepareforAll(fileName): def kafkaPreparefile(filecontent,kafka): - filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","security.protocol",kafka["security_protocol"]) - filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","sasl.mechanism",kafka["sasl_mechanism"]) + if "security_protocol" not in kafka: + filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","security.protocol","SASL_SSL") + else: + filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","security.protocol",kafka["security_protocol"]) + if "" not in kafka: + filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","sasl.mechanism","PLAIN") + else: + filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","sasl.mechanism",kafka["sasl_mechanism"]) filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","sasl.username",kafka["sasl_username"]) filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","sasl.password",kafka["sasl_password"]) if "separate_by_key" in kafka and kafka["separate_by_key"] == "true" : diff --git a/docpage/docs/02.-ProcessGroup/02.1.-dcache.md b/docpage/docs/02.-Inputs/02.1.-dcache.md similarity index 100% rename from docpage/docs/02.-ProcessGroup/02.1.-dcache.md rename to docpage/docs/02.-Inputs/02.1.-dcache.md diff --git a/docpage/docs/02.-ProcessGroup/02.2.-generic.md b/docpage/docs/02.-Inputs/02.2.-generic.md similarity index 100% rename from docpage/docs/02.-ProcessGroup/02.2.-generic.md rename to docpage/docs/02.-Inputs/02.2.-generic.md diff --git a/docpage/docs/02.-Inputs/02.3.-Kafka.md b/docpage/docs/02.-Inputs/02.3.-Kafka.md new file mode 100644 index 00000000..5c4f96f0 --- /dev/null +++ b/docpage/docs/02.-Inputs/02.3.-Kafka.md @@ -0,0 +1,31 @@ +# Kafka + +This ProcessGroup consumes a Kafka topic. + - An identifier name of the process. It must be unique. + - Kafka endpoint, just the IP and the port with any protocol, format like this `:` + - The topic which is going to be consumed. + - The group identifier indicates the consumer group. + - In case the Kafka topics are separated by `key:value` use those arguments: + - separate_by_key + - message_demarcator + - The kafka recipe in [IM](https://www.grycap.upv.es/im/index.php) support the SASL_SSL security protocol. So, the user and password of the SASL_SSL security protocol must be set: + - sasl_username: `user` + - sasl_password: `password` + + +The connection between NiFi and Kafka uses SSL context +by default TLS is the SSL Protocol and PKCS12 is the Truststore Type. SSL context only needs the Truststore filename and Truststore password. This file must be under the directory "/opt/nifi/nifi-current/data/". + + +``` +Kafka: +- name: kafka + bootstrap_servers: 158.42.105.207:9094 + topic: test + group_id: "1" + sasl_username: user + sasl_password: pass + ssl_context: + Truststore_Filename: "file_of_pkcs12.p12" + Truststore_Password: "the-password" +``` \ No newline at end of file diff --git a/docpage/docs/02.-Inputs/02.4.-SQS.md b/docpage/docs/02.-Inputs/02.4.-SQS.md new file mode 100644 index 00000000..b6014d13 --- /dev/null +++ b/docpage/docs/02.-Inputs/02.4.-SQS.md @@ -0,0 +1,16 @@ +# SQS + + +The main purpose is to get as input the data from a SQS. So, this section will create an SQS in AWS and a processGroup in the Nifi cluster. + - An identifier name of the process. It must be unique. + - The region where the SQS is going to be deployed. AWS_DEFAULT_REGION + - The queue name. + +Here is an example of the configuration file. Check the documentation of [AWS credentials](/dcnios/docs/AWS) to define the Access Key and Secret Key. + +``` +SQS: + - name: sqs + AWS_DEFAULT_REGION: + queue_name: +``` \ No newline at end of file diff --git a/docpage/docs/02.-Inputs/02.5.-S3.md b/docpage/docs/02.-Inputs/02.5.-S3.md new file mode 100644 index 00000000..86ef550c --- /dev/null +++ b/docpage/docs/02.-Inputs/02.5.-S3.md @@ -0,0 +1,17 @@ +# S3 + +The main purpose is to get as input the new files created in a S3 bucket. Creating a ProcessGroup in Nifi and a SQS queue will be the same as [SQS](02.4.-SQS). Indeed, an event notification from the S3 bucket to SQS will be created. + - An identifier name of the process. It must be unique. + - The region where the SQS is going to be deployed. AWS_DEFAULT_REGION + - The bucket name. The queue name is not necessary. DCNiOS creates an SQS with this pattern name `-events`. + +Here is an example of the configuration file. Check the documentation of [AWS credentials](/dcnios/docs/AWS) to define the Access Key and Secret Key. + +*event notification will not be removed: do it by hand in the s3 section. + +``` +S3: + - name: S3 + AWS_DEFAULT_REGION: us-east-1 + AWS_S3_BUCKET: +``` \ No newline at end of file diff --git a/docpage/docs/02.-ProcessGroup/02.3.-OSCAR.md b/docpage/docs/03.-Outputs/03.1.-OSCAR.md similarity index 100% rename from docpage/docs/02.-ProcessGroup/02.3.-OSCAR.md rename to docpage/docs/03.-Outputs/03.1.-OSCAR.md diff --git a/docpage/docs/04.-AWS.md b/docpage/docs/04.-AWS.md new file mode 100644 index 00000000..dd17457f --- /dev/null +++ b/docpage/docs/04.-AWS.md @@ -0,0 +1,12 @@ +# AWS + +DCNiOS can use some AWS as input. In all those cases it is necesary a valid pair of AWS Access Key and AWS Secret Key. + +- DCNiOS takes the credentials from the environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. +- If those environment variables do not exist, the credentials are taken from [aws file credentials](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) with the `default` section. +- If DCNiOS does not successfully use the credentials as environment variables or in the credential file. +DCNiOS gets them from configuration files named `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. +This implementation is made to minimize the times that the credentials are written in the configuration file. + +AWS_DEFAULT_REGION is mandatory in any source that uses AWS of the configuration file. + From 402d92b3741db719fef61085121eb56bddacc732 Mon Sep 17 00:00:00 2001 From: SergioLangaritaBenitez Date: Tue, 23 Apr 2024 13:34:48 +0200 Subject: [PATCH 2/3] change to improve the pr --- cli/dcnios-cli.py | 232 +++++++++------- cli/description.yaml | 4 +- cli/sources/NifiManagement.py | 262 ++++++++++-------- cli/sources/auxiliaryFunctions.py | 69 +++-- cli/sources/aws.py | 107 ++++--- docpage/docs/02.-Inputs/02.3.-Kafka.md | 31 --- docpage/docs/02.-Inputs/Kafka.md | 33 +++ .../docs/02.-Inputs/{02.5.-S3.md => S3.md} | 8 +- .../docs/02.-Inputs/{02.4.-SQS.md => SQS.md} | 5 +- .../02.-Inputs/{02.1.-dcache.md => dcache.md} | 6 +- .../{02.2.-generic.md => generic.md} | 10 +- .../03.-Outputs/{03.1.-OSCAR.md => OSCAR.md} | 3 + docpage/docs/{04.-AWS.md => AWS.md} | 19 +- docpage/docs/{01.-Users.md => Users.md} | 3 + 14 files changed, 468 insertions(+), 324 deletions(-) delete mode 100644 docpage/docs/02.-Inputs/02.3.-Kafka.md create mode 100644 docpage/docs/02.-Inputs/Kafka.md rename docpage/docs/02.-Inputs/{02.5.-S3.md => S3.md} (58%) rename docpage/docs/02.-Inputs/{02.4.-SQS.md => SQS.md} (84%) rename docpage/docs/02.-Inputs/{02.1.-dcache.md => dcache.md} (84%) rename docpage/docs/02.-Inputs/{02.2.-generic.md => generic.md} (53%) rename docpage/docs/03.-Outputs/{03.1.-OSCAR.md => OSCAR.md} (94%) rename docpage/docs/{04.-AWS.md => AWS.md} (56%) rename docpage/docs/{01.-Users.md => Users.md} (98%) diff --git a/cli/dcnios-cli.py b/cli/dcnios-cli.py index 9e58b257..2eedaa14 100644 --- a/cli/dcnios-cli.py +++ b/cli/dcnios-cli.py @@ -1,4 +1,4 @@ -# dCNiOs +# dCNiOs # Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia # # This program is free software: you can redistribute it and/or modify @@ -19,175 +19,199 @@ from oscar_python.client import Client from sources.auxiliaryFunctions import * from sources.NifiManagement import * -from sources.aws import * +from sources.aws import * import boto3 import os import argparse -folder="template/" -dcachefile=folder+"dcache.json" -oscarfile=folder+"InvokeOSCAR.json" -sqsfile=folder+"SQS_recive.json" -kafkafile=folder+"Kafka.json" -types=["dCache","OSCAR","S3","SQS","generic","Kafka"] -typesSSL=["Kafka"] +folder = "template/" +dcachefile = folder+"dcache.json" +oscarfile = folder+"InvokeOSCAR.json" +sqsfile = folder+"SQS_recive.json" +kafkafile = folder+"Kafka.json" +types = ["dCache", "OSCAR", "S3", "SQS", "generic", "Kafka"] +typesSSL = ["Kafka"] + def updateComponent(type): if "components" in type: print("Process group: "+type["name"]) for component in type["components"]: - print("\t- Process: "+ component["name"]) + print("\t- Process: " + component["name"]) if "seconds" in component: - nifi.changeSchedule(type["name"],component["name"],component["seconds"]) - print("\t New schedule time: "+ str(component["seconds"]) +" seconds") + nifi.changeSchedule(type["name"], component["name"], + component["seconds"]) + print("\t New schedule time: " + + str(component["seconds"]) + " seconds") if "node" in component: - nifi.executionNode(type["name"],component["name"], component["node"]) - print("\t Now executing in node: "+ component["node"]) + nifi.executionNode(type["name"], + component["name"], component["node"]) + print("\t Now executing in node: " + component["node"]) -def doType(type,function): +def doType(type, function): if type in data["nifi"]: for singularoftype in data["nifi"][type]: function(singularoftype["name"]) - print(str(function.__qualname__)+ " " + singularoftype["name"]) + print(str(function.__qualname__) + " " + singularoftype["name"]) + -def makeActionWithAllType(allType,function): +def makeActionWithAllType(allType, function): for type in allType: - doType(type,function) + doType(type, function) -def newProcessInfo(name): - print("New Process group: "+ str(name)) +def newProcessInfo(name): + print("New Process group: " + str(name)) -parser = argparse.ArgumentParser(prog='ProgramName', description='What the program does', epilog='Text at the bottom of help') +parser = argparse.ArgumentParser( + prog='ProgramName', + description='What the program does', + epilog='Text at the bottom of help') parser.add_argument('option') -parser.add_argument('-f') +parser.add_argument('-f') parser.add_argument('--host') -parser.add_argument('--user',"-u") -parser.add_argument('--password',"-p") -parser.add_argument('--processGroup',"-pg") -parser.add_argument('--component',"-c") -parser.add_argument('--seconds',"-s") +parser.add_argument('--user', "-u") +parser.add_argument('--password', "-p") +parser.add_argument('--processGroup', "-pg") +parser.add_argument('--component', "-c") +parser.add_argument('--seconds', "-s") args = parser.parse_args() -if args.option is None and args.f is None: +if args.option is None and args.f is None: print("File parameter not found") exit(1) # Open the file and load the file -elif args.option is not None and args.f is not None: +elif args.option is not None and args.f is not None: with open(args.f) as f: data = yaml.load(f, Loader=SafeLoader) - nifi_endpoint=data["nifi"]["endpoint"] - nifi_user=data["nifi"]["user"] - nifi_password=data["nifi"]["password"] - nifi=Nifi(nifi_endpoint,nifi_user,nifi_password) - if args.option == "apply": + nifi_endpoint = data["nifi"]["endpoint"] + nifi_user = data["nifi"]["user"] + nifi_password = data["nifi"]["password"] + nifi = Nifi(nifi_endpoint, nifi_user, nifi_password) + if args.option == "apply": if "dCache" in data["nifi"]: for dcache in data["nifi"]["dCache"]: - dcachecontent=prepareforAll(dcachefile) - nifi.create(dcache["name"], dcachecontent ) - command="simple-client.py --state /state/"+dcache["statefile"]+" --endpoint "+ \ - dcache["endpoint"]+" --user "+dcache["user"]+" --password "+ \ - dcache["password"]+" "+ dcache["folder"] - nifi.changeVariable(dcache["name"],"command",command) + dcachecontent = prepareforAll(dcachefile) + nifi.create(dcache["name"], dcachecontent) + command = "simple-client.py --state /state/" \ + + dcache["statefile"] + " --endpoint " \ + + dcache["endpoint"] \ + + " --user "+dcache["user"] + " --password " \ + + dcache["password"] + " " + dcache["folder"] + nifi.changeVariable(dcache["name"], "command", command) newProcessInfo(dcache["name"]) updateComponent(dcache) if "OSCAR" in data["nifi"]: for oscar in data["nifi"]["OSCAR"]: - oscarcontent=prepareforAll(oscarfile) - nifi.create(oscar["name"],oscarcontent) - nifi.changeVariable(oscar["name"],"endpoint", oscar["endpoint"]) - nifi.changeVariable(oscar["name"],"service", oscar["service"]) + oscarcontent = prepareforAll(oscarfile) + nifi.create(oscar["name"], oscarcontent) + nifi.changeVariable(oscar["name"], "endpoint", + oscar["endpoint"]) + nifi.changeVariable(oscar["name"], "service", + oscar["service"]) if "user" in oscar and "password" in oscar: - client = Client("cluster-id",oscar["endpoint"], oscar["user"], oscar["password"], True) + client = Client("cluster-id", oscar["endpoint"], + oscar["user"], oscar["password"], True) service = client.get_service(oscar["service"]) - token=service.json()["token"] - nifi.changeVariable(oscar["name"],"token", token) + token = service.json()["token"] + nifi.changeVariable(oscar["name"], "token", token) else: - nifi.changeVariable(oscar["name"],"token", oscar["token"]) + nifi.changeVariable(oscar["name"], "token", + oscar["token"]) newProcessInfo(oscar["name"]) updateComponent(oscar) if "generic" in data["nifi"]: for generic in data["nifi"]["generic"]: - genericcontent=prepareforAll(generic["file"]) - nifi.create(generic["name"],genericcontent) + genericcontent = prepareforAll(generic["file"]) + nifi.create(generic["name"], genericcontent) for variable in generic["variables"]: - nifi.changeVariable(generic["name"],variable,generic["variables"][variable]) + nifi.changeVariable(generic["name"], variable, + generic["variables"][variable]) newProcessInfo(generic["name"]) updateComponent(generic) if "SQS" in data["nifi"]: for sqs in data["nifi"]["SQS"]: - #Get credentials of AWS + # Get credentials of AWS getAWSCredentials(sqs) - #Create SQS - sqsDetails=createSQS(sqs) - #Prepare config - sqscontent=prepareforAll(sqsfile) - sqscontent=sqsPreparefile(sqscontent,sqs) - #Create object - nifi.create(sqs["name"],sqscontent) - nifi.changeVariable(sqs["name"],'queueurl',sqsDetails['QueueUrl']) + # Create SQS + sqsDetails = createSQS(sqs) + # Prepare config + sqscontent = prepareforAll(sqsfile) + sqscontent = sqsPreparefile(sqscontent, sqs) + # Create object + nifi.create(sqs["name"], sqscontent) + nifi.changeVariable(sqs["name"], 'queueurl', + sqsDetails['QueueUrl']) newProcessInfo(sqs["name"]) - updateComponent(sqs) + updateComponent(sqs) if "S3" in data["nifi"]: for s3 in data["nifi"]["S3"]: - #Get credentials of AWS + # Get credentials of AWS getAWSCredentials(s3) - #Create SQS - s3["queue_name"]= s3["AWS_S3_BUCKET"]+"_events" - sqsDetails=createSQS(s3) - #Create Notification from S3 event to SQS + # Create SQS + s3["queue_name"] = s3["AWS_S3_BUCKET"] + "_events" + sqsDetails = createSQS(s3) + # Create Notification from S3 event to SQS s3NotificationSQS(s3) - #Prepare config - sqscontent=prepareforAll(sqsfile) - s3content=sqsPreparefile(sqscontent,s3) - #Create object - nifi.create(s3["name"],sqscontent) - nifi.changeVariable(s3["name"],'queueurl',sqsDetails['QueueUrl']) + # Prepare config + sqscontent = prepareforAll(sqsfile) + s3content = sqsPreparefile(sqscontent, s3) + # Create object + nifi.create(s3["name"], sqscontent) + nifi.changeVariable(s3["name"], 'queueurl', + sqsDetails['QueueUrl']) newProcessInfo(s3["name"]) updateComponent(s3) if "Kafka" in data["nifi"]: for kafka in data["nifi"]["Kafka"]: - #Prepare config - kafkacontent=prepareforAll(kafkafile) - kafkacontent=kafkaPreparefile(kafkacontent,kafka) - #Set ssl context configuration - kafka["ssl_context"]["SSL_Protocol"]="TLS" - kafka["ssl_context"]["Truststore_Type"]="PKCS12" - kafka["ssl_context"]["Truststore_Filename"]="/opt/nifi/nifi-current/data/"+kafka["ssl_context"]["Truststore_Filename"] - kafkacontent=ssl_context(kafkacontent,kafka["ssl_context"]) - #Create object - nifi.create(kafka["name"],kafkacontent) - nifi.changeVariable(kafka["name"],"group_id", kafka["group_id"]) - nifi.changeVariable(kafka["name"],"bootstrap_servers", kafka["bootstrap_servers"]) - nifi.changeVariable(kafka["name"],"topic", kafka["topic"]) - #enable SSL + # Prepare config + kafkacontent = prepareforAll(kafkafile) + kafkacontent = kafkaPreparefile(kafkacontent, kafka) + # Set ssl context configuration + kafka["ssl_context"]["SSL_Protocol"] = "TLS" + kafka["ssl_context"]["Truststore_Type"] = "PKCS12" + kafka["ssl_context"]["Truststore_Filename"] = "/opt/nifi" \ + + "/nifi-current/data/" \ + + kafka["ssl_context"]["Truststore_Filename"] + kafkacontent = ssl_context(kafkacontent, + kafka["ssl_context"]) + # Create object + nifi.create(kafka["name"], kafkacontent) + nifi.changeVariable(kafka["name"], "group_id", + kafka["group_id"]) + nifi.changeVariable(kafka["name"], "bootstrap_servers", + kafka["bootstrap_servers"]) + nifi.changeVariable(kafka["name"], "topic", + kafka["topic"]) + # Enable SSL nifi.enableSSL(kafka["name"]) newProcessInfo(kafka["name"]) - updateComponent(kafka) + updateComponent(kafka) if "connection" in data["nifi"]: for connection in data["nifi"]["connection"]: - nifi.makeConnection(connection["from"],connection["to"]) + nifi.makeConnection(connection["from"], connection["to"]) elif args.option == "delete": - makeActionWithAllType(typesSSL,nifi.disableSSL) - makeActionWithAllType(types,nifi.deleteProcess) - #Delete of SQS, not the notification - if "S3" in data["nifi"]: - for s3 in data["nifi"]["S3"]: - s3["queue_name"]= s3["AWS_S3_BUCKET"]+"_events" - deleteSQS(s3) - if "SQS" in data["nifi"]: - for sqs in data["nifi"]["S3"]: - deleteSQS(sqs) + makeActionWithAllType(typesSSL, nifi.disableSSL) + makeActionWithAllType(types, nifi.deleteProcess) + # Delete of SQS, not the notification + if "S3" in data["nifi"]: + for s3 in data["nifi"]["S3"]: + s3["queue_name"] = s3["AWS_S3_BUCKET"] + "_events" + deleteSQS(s3) + if "SQS" in data["nifi"]: + for sqs in data["nifi"]["SQS"]: + deleteSQS(sqs) elif args.option == "start": - makeActionWithAllType(types,nifi.startProcess) + makeActionWithAllType(types, nifi.startProcess) elif args.option == "stop": - makeActionWithAllType(types,nifi.stopProcess) + makeActionWithAllType(types, nifi.stopProcess) else: print("incorrect command try again") if args.option == "changeSchedule" or args.option == "cs": - nifi=Nifi(args.host,args.user,args.password) - nifi.changeSchedule(args.processGroup,args.component,args.seconds) - print("Process group: "+str(args.processGroup)) - print("\t- Process: "+ str(args.component) + "\n\t New schedule time: "+ str(args.seconds) +" seconds") \ No newline at end of file + nifi = Nifi(args.host, args.user, args.password) + nifi.changeSchedule(args.processGroup, args.component, args.seconds) + print("Process group: " + str(args.processGroup)) + print("\t- Process: " + str(args.component) + "\n\t New schedule time: " + + str(args.seconds) + " seconds") diff --git a/cli/description.yaml b/cli/description.yaml index 3685ed59..f0517437 100644 --- a/cli/description.yaml +++ b/cli/description.yaml @@ -24,8 +24,8 @@ nifi: # - name: InvokeOSCAR # seconds: 2 Kafka: - - name: kafkaaa - bootstrap_servers: :9094 + - name: kafka + bootstrap_servers: : topic: group_id: "1" sasl_username: diff --git a/cli/sources/NifiManagement.py b/cli/sources/NifiManagement.py index 0b2ca023..75f96aae 100755 --- a/cli/sources/NifiManagement.py +++ b/cli/sources/NifiManagement.py @@ -1,4 +1,4 @@ -# dCNiOs +# dCNiOs # Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia # # This program is free software: you can redistribute it and/or modify @@ -16,136 +16,162 @@ import requests import json import urllib3 -urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) from requests.auth import HTTPBasicAuth from urllib3 import encode_multipart_formdata +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + class Nifi: - - def __init__(self,nifi_endPoint,user,password): - self.nifi_url=nifi_endPoint #+":"+nifi_Port + + def __init__(self, nifi_endPoint, user, password): + self.nifi_url = nifi_endPoint # +":"+nifi_Port self.basic = HTTPBasicAuth(user, password) - def callHttp(self,type,link, data,header='application/json'): + def callHttp(self, type, link, data, header='application/json'): try: - response = type(self.nifi_url+link, headers={'Content-Type': header}, - data=data, auth=self.basic, verify=False) + response = type(self.nifi_url+link, + headers={'Content-Type': header}, + data=data, auth=self.basic, verify=False) return response except requests.exceptions as e: # This is the correct syntax - print (e) - - - def startProcess(self,name): - process_groupid=self.getProcessGroup(name) - link="/nifi-api/flow/process-groups/"+process_groupid - data='{"id":"'+process_groupid+'","state":"RUNNING"}' - response= self.callHttp(requests.put,link,data ) - - - def stopProcess(self,name): - process_groupid=self.getProcessGroup(name) - link="/nifi-api/flow/process-groups/"+process_groupid - data='{"id":"'+process_groupid+'","state":"STOPPED"}' - response= self.callHttp(requests.put,link,data) - - - - def makeConnection(self,fromName,toName): - fromGroupid=self.getProcessGroup(fromName) - toGroupid=self.getProcessGroup(toName) - response= self.callHttp(requests.get,"/nifi-api/process-groups/root/connections",'') + print(e) + + def startProcess(self, name): + process_groupid = self.getProcessGroup(name) + link = "/nifi-api/flow/process-groups/" + process_groupid + data = '{"id":"' + process_groupid + '","state":"RUNNING"}' + response = self.callHttp(requests.put, link, data) + + def stopProcess(self, name): + process_groupid = self.getProcessGroup(name) + link = "/nifi-api/flow/process-groups/" + process_groupid + data = '{"id":"' + process_groupid + '","state":"STOPPED"}' + response = self.callHttp(requests.put, link, data) + + def makeConnection(self, fromName, toName): + fromGroupid = self.getProcessGroup(fromName) + toGroupid = self.getProcessGroup(toName) + response = self.callHttp(requests.get, + "/nifi-api/process-groups/root/connections", + '') for connection in response.json()["connections"]: - if connection["component"]["source"]["groupId"] == fromGroupid and \ - connection["component"]["destination"]["groupId"] == toGroupid : + if connection["component"]["source"]["groupId"] == fromGroupid \ + and connection["component"]["destination"]["groupId"] == \ + toGroupid: return connection["id"] - - response= self.callHttp(requests.get,"/nifi-api/process-groups/"+toGroupid+"/input-ports",'') - destinationid=response.json()["inputPorts"][0]["id"] - - response= self.callHttp(requests.get,"/nifi-api/process-groups/"+fromGroupid+"/output-ports",'') - sourceid=response.json()["outputPorts"][0]["id"] - - link="/nifi-api/process-groups/root/connections" - data='{"revision":{"version": 0},"component": { \ - "source": { "id": "' + sourceid + '", "groupId": "'+fromGroupid+'", "type": "OUTPUT_PORT" }, \ - "destination": { "id": "' + destinationid + '", "groupId": "'+toGroupid+'", "type": "INPUT_PORT" } } }' - response= self.callHttp(requests.post,link,data) + response = self.callHttp(requests.get, "/nifi-api/process-groups/" + + toGroupid + "/input-ports", '') + destinationid = response.json()["inputPorts"][0]["id"] + + response = self.callHttp(requests.get, "/nifi-api/process-groups/" + + fromGroupid + "/output-ports", '') + sourceid = response.json()["outputPorts"][0]["id"] + link = "/nifi-api/process-groups/root/connections" + data = '{"revision":{"version": 0},"component": {' \ + + ' "source": { "id": "' \ + + sourceid + '", "groupId": "' + fromGroupid \ + + '", "type": "OUTPUT_PORT" }, "destination": { "id": "' \ + + destinationid + '", "groupId": "' + toGroupid \ + + '", "type": "INPUT_PORT" } } }' + response = self.callHttp(requests.post, link, data) return response.json()["id"] - - def deleteProcess(self,name): - groupid=self.getProcessGroup(name) + def deleteProcess(self, name): + groupid = self.getProcessGroup(name) if not groupid: return None - process_group=groupid - response= self.callHttp(requests.get,"/nifi-api/process-groups/root/connections",'') - + process_group = groupid + response = self.callHttp(requests.get, + "/nifi-api/process-groups/root/connections", + '') for connection in response.json()["connections"]: - if connection["component"]["source"]["groupId"] == process_group or connection["component"]["destination"]["groupId"] == process_group : - link="/nifi-api/connections/" + connection["id"] + "?version="+str(connection["revision"]["version"]) - response= self.callHttp(requests.delete,link,'') - - response= self.callHttp(requests.get,"/nifi-api/process-groups/"+process_group,'') - version=str(response.json()["revision"]["version"]) - response= self.callHttp(requests.delete,"/nifi-api/process-groups/" + process_group + "?version="+version,'') + if connection["component"]["source"]["groupId"] == process_group \ + or connection["component"]["destination"]["groupId"] == \ + process_group: + link = "/nifi-api/connections/" + connection["id"] \ + + "?version=" + str(connection["revision"]["version"]) + response = self.callHttp(requests.delete, link, '') + + response = self.callHttp(requests.get, "/nifi-api/process-groups/" + + process_group, '') + version = str(response.json()["revision"]["version"]) + response = self.callHttp(requests.delete, "/nifi-api/process-groups/" + + process_group + "?version=" + version, '') def getProcessGroup(self, process_groupName): - response= self.callHttp(requests.get,"/nifi-api/process-groups/root/process-groups",'') + response = self.callHttp(requests.get, + "/nifi-api/process-groups" + + "/root/process-groups", '') for pg in response.json()["processGroups"]: - if(pg["component"]["name"] == process_groupName): + if (pg["component"]["name"] == process_groupName): return pg["id"] return None - - def create(self,name,filecontent): - groupid=self.getProcessGroup(name) - if not groupid : - fields = {"groupName": name, "positionX": "-150","positionY": "-150","clientId" : "aaa", - "file": ("namefile", json.dumps(filecontent).encode('utf-8'), "application/json"),} + def create(self, name, filecontent): + groupid = self.getProcessGroup(name) + if not groupid: + fields = {"groupName": name, "positionX": "-150", + "positionY": "-150", "clientId": "aaa", + "file": ("namefile", + json.dumps(filecontent).encode('utf-8'), + "application/json"), } body, header = encode_multipart_formdata(fields) - response= self.callHttp(requests.post,"/nifi-api/process-groups/root/process-groups/upload",body,header) - - def changeVariable(self,name,key,value): - id=self.getProcessGroup(name) - response= self.callHttp(requests.get,"/nifi-api/process-groups/"+id+"/variable-registry",'') - PGRversion=response.json()["processGroupRevision"]["version"] - data='{"processGroupRevision": { "version": '+str(PGRversion)+'}, \ + response = self.callHttp(requests.post, + "/nifi-api/process-groups" + + "/root/process-groups/upload", + body, + header) + + def changeVariable(self, name, key, value): + id = self.getProcessGroup(name) + response = self.callHttp(requests.get, + "/nifi-api/process-groups/" + + id + "/variable-registry", + '') + PGRversion = response.json()["processGroupRevision"]["version"] + data = '{"processGroupRevision": { "version": ' \ + + str(PGRversion) + '}, \ "variableRegistry": {"variables": [ { "variable": { \ "name": "' + key + '", \ - "value": "'+ value + '" \ + "value": "' + value + '" \ } } ], "processGroupId": "' + id + '" }}' - response= self.callHttp(requests.put,"/nifi-api/process-groups/"+id+"/variable-registry",data) - + response = self.callHttp(requests.put, "/nifi-api/process-groups/" + + id + "/variable-registry", data) def updateProcessor(self, pg, process, accion): - id=self.getProcessGroup(pg) - response= self.callHttp(requests.get,"/nifi-api/flow/process-groups/"+ id,'') - components=response.json()["processGroupFlow"]["flow"]["processors"] - found=False + id = self.getProcessGroup(pg) + response = self.callHttp(requests.get, + "/nifi-api/flow/process-groups/" + id, '') + components = response.json()["processGroupFlow"]["flow"]["processors"] + found = False for comp in components: if comp["component"]["name"] == process: - processid=comp["component"]["id"] - state=comp["component"]["state"] - found=True - if found == False: + processid = comp["component"]["id"] + state = comp["component"]["state"] + found = True + if not found: return False else: if state == "RUNNING": self.stopProcess(pg) - response= self.callHttp(requests.get,"/nifi-api/processors/"+processid,'') - #print(json.dumps(response.json()["component"]["config"], indent=4)) - version=response.json()["revision"]["version"] - execution=response.json()["component"]["config"]["executionNode"] - data='{"component": {"id":"'+str(processid)+'", "name":"'+str(process)+'", \ - "config":{'+accion+' }, "state":"STOPPED"}, \ - "revision":{"version":'+str(version)+'}, "disconnectedNodeAcknowledged":false}' - response= self.callHttp(requests.put,"/nifi-api/processors/"+ processid,data) + response = self.callHttp(requests.get, "/nifi-api/processors/" + + processid, '') + version = response.json()["revision"]["version"] + execution = response.json()["component"]["config"]["executionNode"] + data = '{"component": {"id":"' + str(processid) + '", "name":"' \ + + str(process) + '",\ + "config":{'+accion+' }, "state":"STOPPED"},\ + "revision":{"version":' + str(version) \ + + '}, "disconnectedNodeAcknowledged":false}' + response = self.callHttp(requests.put, "/nifi-api/processors/" + + processid, data) if state == "RUNNING": self.startProcess(pg) return True - + def changeSchedule(self, pg, process, seconds): - self.updateProcessor(pg, process, '"schedulingPeriod":"'+str(seconds)+' sec"') + self.updateProcessor(pg, process, '"schedulingPeriod":"' + + str(seconds) + ' sec"') def executionNode(self, pg, process, node): if node == "PRIMARY" or node == "ALL": @@ -154,25 +180,39 @@ def executionNode(self, pg, process, node): pass def nifiVersion(self): - response= self.callHttp(requests.get,"/nifi-api/system-diagnostics",'') - return response.json()["systemDiagnostics"]["aggregateSnapshot"]["versionInfo"]["niFiVersion"] - - def enableSSL(self,name): - groupid=self.getProcessGroup(name) - response= self.callHttp(requests.get,"/nifi-api/flow/process-groups/"+groupid+"/controller-services",'') + response = self.callHttp(requests.get, + "/nifi-api/system-diagnostics", '') + infoversion = response.json()["systemDiagnostics"]["aggregateSnapshot"] + return infoversion["versionInfo"]["niFiVersion"] + + def enableSSL(self, name): + groupid = self.getProcessGroup(name) + response = self.callHttp(requests.get, "/nifi-api/flow/process-groups/" + + groupid + "/controller-services", '') for controller in response.json()["controllerServices"]: if controller["parentGroupId"] == groupid: - ssl_context_id=controller["id"] - version=controller["revision"]["version"] - data='{"revision":{"clientId":"'+groupid+'","version":'+str(version)+'},"disconnectedNodeAcknowledged":false,"state":"ENABLED","uiOnly":true}' - response= self.callHttp(requests.put,"/nifi-api/controller-services/"+ ssl_context_id+"/run-status",data) - - def disableSSL(self,name): - groupid=self.getProcessGroup(name) - response= self.callHttp(requests.get,"/nifi-api/flow/process-groups/"+groupid+"/controller-services",'') + ssl_context_id = controller["id"] + version = controller["revision"]["version"] + data = '{"revision":{"clientId":"' + groupid + '","version":' \ + + str(version) + '},"disconnectedNodeAcknowledged":' \ + + 'false,"state":"ENABLED","uiOnly":true}' + response = self.callHttp(requests.put, + "/nifi-api/controller-services/" + + ssl_context_id+"/run-status", data) + + def disableSSL(self, name): + groupid = self.getProcessGroup(name) + response = self.callHttp(requests.get, "/nifi-api/flow/process-groups/" + + groupid + "/controller-services", '') for controller in response.json()["controllerServices"]: if controller["parentGroupId"] == groupid: - ssl_context_id=controller["id"] - version=controller["revision"]["version"] - data='{"revision":{"clientId":"'+groupid+'","version":'+str(version)+'},"disconnectedNodeAcknowledged":false,"state":"DISABLED","uiOnly":true}' - response= self.callHttp(requests.put,"/nifi-api/controller-services/"+ ssl_context_id+"/run-status",data) \ No newline at end of file + ssl_context_id = controller["id"] + version = controller["revision"]["version"] + data = '{"revision":{"clientId":"' + groupid \ + + '","version":' + str(version) + '},"' \ + + 'disconnectedNodeAcknowledged":false,' \ + + '"state":"DISABLED","uiOnly":true}' + response = self.callHttp(requests.put, + "/nifi-api/controller-services/" + + ssl_context_id + "/run-status", + data) diff --git a/cli/sources/auxiliaryFunctions.py b/cli/sources/auxiliaryFunctions.py index 6515353a..130298ce 100644 --- a/cli/sources/auxiliaryFunctions.py +++ b/cli/sources/auxiliaryFunctions.py @@ -1,4 +1,4 @@ -# dCNiOs +# dCNiOs # Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia # # This program is free software: you can redistribute it and/or modify @@ -13,47 +13,64 @@ # You should have received a copy of the Apache 2.0 License # along with this program. If not, see . -#!/usr/bin/env python3 +# !/usr/bin/env python3 import json import os -def addSensibleVariable(file,processorName,key,value): + +def addSensibleVariable(file, processorName, key, value): for processor in file["flowContents"]["processors"]: if processor["name"] == processorName: - processor["properties"][key]=value + processor["properties"][key] = value return file def prepareforAll(fileName): with open(fileName) as f: - filecontent = json.load(f) - filecontent["snapshotMetadata"]={} - filecontent["snapshotMetadata"]["bucketIdentifier"]="" - filecontent["snapshotMetadata"]["flowIdentifier"]="" - filecontent["snapshotMetadata"]["version"]=-1 + filecontent = json.load(f) + filecontent["snapshotMetadata"] = {} + filecontent["snapshotMetadata"]["bucketIdentifier"] = "" + filecontent["snapshotMetadata"]["flowIdentifier"] = "" + filecontent["snapshotMetadata"]["version"] = -1 return filecontent - -def kafkaPreparefile(filecontent,kafka): + +def kafkaPreparefile(filecontent, kafka): if "security_protocol" not in kafka: - filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","security.protocol","SASL_SSL") + filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "security.protocol", "SASL_SSL") else: - filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","security.protocol",kafka["security_protocol"]) + filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "security.protocol", + kafka["security_protocol"]) if "" not in kafka: - filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","sasl.mechanism","PLAIN") + filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "sasl.mechanism", "PLAIN") + else: + filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "sasl.mechanism", + kafka["sasl_mechanism"]) + filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "sasl.username", + kafka["sasl_username"]) + filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "sasl.password", + kafka["sasl_password"]) + if "separate_by_key" in kafka and kafka["separate_by_key"] == "true": + filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "separate-by-key", "true") + filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "message-demarcator", + kafka["message_demarcator"]) else: - filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","sasl.mechanism",kafka["sasl_mechanism"]) - filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","sasl.username",kafka["sasl_username"]) - filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","sasl.password",kafka["sasl_password"]) - if "separate_by_key" in kafka and kafka["separate_by_key"] == "true" : - filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","separate-by-key","true") - filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","message-demarcator",kafka["message_demarcator"]) - else: - filecontent=addSensibleVariable(filecontent,"ConsumeKafka_2_6","separate-by-key","false") - return filecontent + filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "separate-by-key", "false") + return filecontent + def ssl_context(filecontent, variables): - for var in variables: - filecontent["flowContents"]["controllerServices"][0]["properties"][var.replace("_", " ")]=variables[var] - return filecontent + for var in variables: + change = filecontent["flowContents"]["controllerServices"][0] + change["properties"][var.replace("_", " ")] = variables[var] + return filecontent diff --git a/cli/sources/aws.py b/cli/sources/aws.py index af3e146c..e4f7d9f3 100644 --- a/cli/sources/aws.py +++ b/cli/sources/aws.py @@ -1,4 +1,4 @@ -# dCNiOs +# dCNiOs # Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia # # This program is free software: you can redistribute it and/or modify @@ -13,7 +13,7 @@ # You should have received a copy of the Apache 2.0 License # along with this program. If not, see . -#!/usr/bin/env python3 +# !/usr/bin/env python3 import json import os @@ -21,59 +21,92 @@ from sources.auxiliaryFunctions import addSensibleVariable - def getAWSCredentials(configuration): - if "AWS_ACCESS_KEY_ID" in os.environ and os.environ["AWS_ACCESS_KEY_ID"] != "" and \ - "AWS_SECRET_ACCESS_KEY" in os.environ and os.environ["AWS_SECRET_ACCESS_KEY"] != "" : + if "AWS_ACCESS_KEY_ID" in os.environ \ + and os.environ["AWS_ACCESS_KEY_ID"] != "" \ + and "AWS_SECRET_ACCESS_KEY" in os.environ \ + and os.environ["AWS_SECRET_ACCESS_KEY"] != "": print("AWS Credentials: Credentials from environment") configuration["AWS_ACCESS_KEY_ID"] = os.environ["AWS_ACCESS_KEY_ID"] - configuration["AWS_SECRET_ACCESS_KEY"] = os.environ["AWS_SECRET_ACCESS_KEY"] - elif os.path.exists(os.environ["HOME"]+"/.aws/credentials"): + configuration["AWS_SECRET_ACCESS_KEY"] = \ + os.environ["AWS_SECRET_ACCESS_KEY"] + elif os.path.exists(os.environ["HOME"] + "/.aws/credentials"): print("AWS Credentials: Credentials from credentials file") session = boto3.Session(profile_name="default") credentials = session.get_credentials() - configuration["AWS_ACCESS_KEY_ID"]= credentials.access_key - configuration["AWS_SECRET_ACCESS_KEY"] =credentials.secret_key - elif "AWS_ACCESS_KEY_ID" in configuration and "AWS_SECRET_ACCESS_KEY" in configuration: + configuration["AWS_ACCESS_KEY_ID"] = credentials.access_key + configuration["AWS_SECRET_ACCESS_KEY"] = \ + credentials.secret_key + elif "AWS_ACCESS_KEY_ID" in configuration \ + and "AWS_SECRET_ACCESS_KEY" in configuration: print("AWS Credentials: Credentials from configuration file") + def createSQS(configuration): - accountID=boto3.client('sts').get_caller_identity().get('Account') - sqsClient=boto3.client('sqs', region_name=configuration["AWS_DEFAULT_REGION"]) - response = sqsClient.create_queue(QueueName=configuration["queue_name"], Attributes={ - "SqsManagedSseEnabled":"false", - "Policy": '{"Version":"2012-10-17","Id":"__default_policy_ID","Statement":[{"Sid":"__owner_statement","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::'+accountID+':root"},"Action":"SQS:*","Resource":"arn:aws:sqs:'+configuration["AWS_DEFAULT_REGION"]+':'+accountID+':'+configuration["queue_name"]+'"},{"Sid":"__sender_statement","Effect":"Allow","Principal":{"AWS":"*"},"Action":"SQS:SendMessage","Resource":"arn:aws:sqs:'+configuration["AWS_DEFAULT_REGION"]+':'+accountID+':'+configuration["queue_name"]+'"}]}' - }) + accountID = boto3.client('sts').get_caller_identity().get('Account') + sqsClient = boto3.client('sqs', + region_name=configuration["AWS_DEFAULT_REGION"]) + response = sqsClient.create_queue(QueueName=configuration["queue_name"], + Attributes={ + "SqsManagedSseEnabled": "false", + "Policy": '{"Version":"2012-10-17' + + '","Id":"__default_policy_ID",' + + '"Statement":[{"Sid":"__owner_' + + 'statement","Effect":"Allow",' + + '"Principal":{"AWS":"arn:aws:' + + 'iam::'+accountID+':root"},' + + '"Action":"SQS:*","Resource"' + + ':"arn:aws:sqs:' + + configuration["AWS_DEFAULT_REGION"] + + ':' + accountID + ':' + + configuration["queue_name"] + + '"},{"Sid":"__sender_statement"' + + ',"Effect":"Allow",' + + '"Principal":{"AWS":"*"},"Action"' + + ':"SQS:SendMessage",' + + '"Resource":"arn:aws:sqs:' + + configuration["AWS_DEFAULT_REGION"] + + ':' + accountID + ':' + + configuration["queue_name"] + + '"}]}' + }) return sqsClient.get_queue_url(QueueName=configuration["queue_name"]) -def sqsPreparefile(filecontent,configuration): - filecontent=addSensibleVariable(filecontent,"GetSQS","Access Key",configuration["AWS_ACCESS_KEY_ID"]) - filecontent=addSensibleVariable(filecontent,"GetSQS","Secret Key",configuration["AWS_SECRET_ACCESS_KEY"]) - filecontent=addSensibleVariable(filecontent,"GetSQS","Region",configuration["AWS_DEFAULT_REGION"]) - return filecontent + +def sqsPreparefile(filecontent, configuration): + filecontent = addSensibleVariable(filecontent, "GetSQS", "Access Key", + configuration["AWS_ACCESS_KEY_ID"]) + filecontent = addSensibleVariable(filecontent, "GetSQS", "Secret Key", + configuration["AWS_SECRET_ACCESS_KEY"]) + filecontent = addSensibleVariable(filecontent, "GetSQS", "Region", + configuration["AWS_DEFAULT_REGION"]) + return filecontent + def deleteSQS(configuration): - sqsClient=boto3.client('sqs', region_name=configuration["AWS_DEFAULT_REGION"] ) + sqsClient = boto3.client('sqs', + region_name=configuration["AWS_DEFAULT_REGION"]) queue = sqsClient.get_queue_url(QueueName=configuration["queue_name"]) response = sqsClient.delete_queue(QueueUrl=queue['QueueUrl']) def s3NotificationSQS(configuration): - owner=boto3.client('sts').get_caller_identity().get('Account') - arn= "arn:aws:sqs:"+configuration["AWS_DEFAULT_REGION"]+ ":" +owner+":" + configuration["queue_name"] + owner = boto3.client('sts').get_caller_identity().get('Account') + arn = "arn:aws:sqs:" + configuration["AWS_DEFAULT_REGION"] + ":" + owner \ + + ":" + configuration["queue_name"] s3 = boto3.resource('s3') bucket_notification = s3.BucketNotification(configuration["AWS_S3_BUCKET"]) response = bucket_notification.put( - NotificationConfiguration={ - 'QueueConfigurations': [ - { - 'Id': configuration["AWS_S3_BUCKET"]+"_event", - 'QueueArn': arn, - 'Events': [ - 's3:ObjectCreated:*', - ], - }, - ], - }, - ExpectedBucketOwner=owner, - SkipDestinationValidation=False) + NotificationConfiguration={ + 'QueueConfigurations': [ + { + 'Id': configuration["AWS_S3_BUCKET"]+"_event", + 'QueueArn': arn, + 'Events': [ + 's3:ObjectCreated:*', + ], + }, + ], + }, + ExpectedBucketOwner=owner, + SkipDestinationValidation=False) diff --git a/docpage/docs/02.-Inputs/02.3.-Kafka.md b/docpage/docs/02.-Inputs/02.3.-Kafka.md deleted file mode 100644 index 5c4f96f0..00000000 --- a/docpage/docs/02.-Inputs/02.3.-Kafka.md +++ /dev/null @@ -1,31 +0,0 @@ -# Kafka - -This ProcessGroup consumes a Kafka topic. - - An identifier name of the process. It must be unique. - - Kafka endpoint, just the IP and the port with any protocol, format like this `:` - - The topic which is going to be consumed. - - The group identifier indicates the consumer group. - - In case the Kafka topics are separated by `key:value` use those arguments: - - separate_by_key - - message_demarcator - - The kafka recipe in [IM](https://www.grycap.upv.es/im/index.php) support the SASL_SSL security protocol. So, the user and password of the SASL_SSL security protocol must be set: - - sasl_username: `user` - - sasl_password: `password` - - -The connection between NiFi and Kafka uses SSL context -by default TLS is the SSL Protocol and PKCS12 is the Truststore Type. SSL context only needs the Truststore filename and Truststore password. This file must be under the directory "/opt/nifi/nifi-current/data/". - - -``` -Kafka: -- name: kafka - bootstrap_servers: 158.42.105.207:9094 - topic: test - group_id: "1" - sasl_username: user - sasl_password: pass - ssl_context: - Truststore_Filename: "file_of_pkcs12.p12" - Truststore_Password: "the-password" -``` \ No newline at end of file diff --git a/docpage/docs/02.-Inputs/Kafka.md b/docpage/docs/02.-Inputs/Kafka.md new file mode 100644 index 00000000..fe5c8ee2 --- /dev/null +++ b/docpage/docs/02.-Inputs/Kafka.md @@ -0,0 +1,33 @@ +--- +sidebar_position: 3 +--- +# Kafka + +Kafka is the ProcessGroup that consumes a Kafka topic, is comprised of: + - An identifier name of the process. It must be unique. + - Kafka endpoint, just the IP and the port with any protocol as `:` + - The topic name which is going to be consumed. Required. + - The group identifier indicating the consumer group. Required. + - In case the Kafka topics are separated by `key:value` set the argument `separate_by_key` as true and select the demarcator with `message_demarcator`: + - separate_by_key + - message_demarcator + - The kafka recipe in [IM](https://www.grycap.upv.es/im/index.php) support the SASL_SSL security protocol. So, the user and password of the SASL_SSL security protocol must be set: + - sasl_username: `user` + - sasl_password: `password` + + +The connection between NiFi and Kafka employs SSL context,the SSL Protocol used by default is TLS, and the Truststore Type is PKCS12. SSL context only needs the Truststore filename and Truststore password. The Truststore file must be under "/opt/nifi/nifi-current/data/" directory. + + +``` +Kafka: +- name: kafka + bootstrap_servers: : + topic: test + group_id: "1" + sasl_username: user + sasl_password: pass + ssl_context: + Truststore_Filename: "file_of_pkcs12.p12" + Truststore_Password: "the-password" +``` \ No newline at end of file diff --git a/docpage/docs/02.-Inputs/02.5.-S3.md b/docpage/docs/02.-Inputs/S3.md similarity index 58% rename from docpage/docs/02.-Inputs/02.5.-S3.md rename to docpage/docs/02.-Inputs/S3.md index 86ef550c..2d3b422f 100644 --- a/docpage/docs/02.-Inputs/02.5.-S3.md +++ b/docpage/docs/02.-Inputs/S3.md @@ -1,13 +1,17 @@ +--- +sidebar_position: 4 +--- # S3 -The main purpose is to get as input the new files created in a S3 bucket. Creating a ProcessGroup in Nifi and a SQS queue will be the same as [SQS](02.4.-SQS). Indeed, an event notification from the S3 bucket to SQS will be created. +S3 is a ProcessGroup that gets input data from an AWS S3 bucket. Creating a ProcessGroup in Nifi and a SQS queue will be the same as [SQS](02.4.-SQS). Indeed, an event notification from the S3 bucket to SQS will be created. - An identifier name of the process. It must be unique. - The region where the SQS is going to be deployed. AWS_DEFAULT_REGION - The bucket name. The queue name is not necessary. DCNiOS creates an SQS with this pattern name `-events`. Here is an example of the configuration file. Check the documentation of [AWS credentials](/dcnios/docs/AWS) to define the Access Key and Secret Key. -*event notification will not be removed: do it by hand in the s3 section. + +> :warning: **Event Notification in the S3 section needs to be removed manually**: Be very careful here! ``` S3: diff --git a/docpage/docs/02.-Inputs/02.4.-SQS.md b/docpage/docs/02.-Inputs/SQS.md similarity index 84% rename from docpage/docs/02.-Inputs/02.4.-SQS.md rename to docpage/docs/02.-Inputs/SQS.md index b6014d13..48ed0953 100644 --- a/docpage/docs/02.-Inputs/02.4.-SQS.md +++ b/docpage/docs/02.-Inputs/SQS.md @@ -1,6 +1,9 @@ +--- +sidebar_position: 5 +--- # SQS - +SQS is the ProcessGroup that consumes an AWS SQS queue , is comprised of: The main purpose is to get as input the data from a SQS. So, this section will create an SQS in AWS and a processGroup in the Nifi cluster. - An identifier name of the process. It must be unique. - The region where the SQS is going to be deployed. AWS_DEFAULT_REGION diff --git a/docpage/docs/02.-Inputs/02.1.-dcache.md b/docpage/docs/02.-Inputs/dcache.md similarity index 84% rename from docpage/docs/02.-Inputs/02.1.-dcache.md rename to docpage/docs/02.-Inputs/dcache.md index 0031dfcd..06fb8b0e 100644 --- a/docpage/docs/02.-Inputs/02.1.-dcache.md +++ b/docpage/docs/02.-Inputs/dcache.md @@ -1,7 +1,9 @@ +--- +sidebar_position: 2 +--- # dCache -The main goal of this ProcessGroup is to get the events from dcache. -It is necessary: +dCache is the ProcessGroup that keep listen into dCache instance, is comprised of: - An identifier name of the process. It must be unique. - Endpoint, user and password - Folder where active listening diff --git a/docpage/docs/02.-Inputs/02.2.-generic.md b/docpage/docs/02.-Inputs/generic.md similarity index 53% rename from docpage/docs/02.-Inputs/02.2.-generic.md rename to docpage/docs/02.-Inputs/generic.md index c4443df4..7518d91d 100644 --- a/docpage/docs/02.-Inputs/02.2.-generic.md +++ b/docpage/docs/02.-Inputs/generic.md @@ -1,9 +1,11 @@ +--- +sidebar_position: 1 +--- # Generic -The generic section is made to deploy your ProcessGroups. -Need to be defined: -- The identifier name -- The path of your processGroup (.json file) +Generic section creates a ProcessGroup by given a ProcessGroup file, is comprised of: +- An identifier name of the process. It must be unique. +- The path of your ProcessGroup (.json file) - The variables that compose the workflow (as a list). ``` diff --git a/docpage/docs/03.-Outputs/03.1.-OSCAR.md b/docpage/docs/03.-Outputs/OSCAR.md similarity index 94% rename from docpage/docs/03.-Outputs/03.1.-OSCAR.md rename to docpage/docs/03.-Outputs/OSCAR.md index 5ebe01c7..2056c2cd 100644 --- a/docpage/docs/03.-Outputs/03.1.-OSCAR.md +++ b/docpage/docs/03.-Outputs/OSCAR.md @@ -1,3 +1,6 @@ +--- +sidebar_position: 1 +--- # OSCAR The goal of this ProcessGroup is to invoke OSCAR services asynchronously: diff --git a/docpage/docs/04.-AWS.md b/docpage/docs/AWS.md similarity index 56% rename from docpage/docs/04.-AWS.md rename to docpage/docs/AWS.md index dd17457f..20537946 100644 --- a/docpage/docs/04.-AWS.md +++ b/docpage/docs/AWS.md @@ -1,12 +1,23 @@ +--- +sidebar_position: 4 +--- # AWS -DCNiOS can use some AWS as input. In all those cases it is necesary a valid pair of AWS Access Key and AWS Secret Key. +> :warning: **DCNiOS can use some AWS services**: This section clarifies the configuration required to use the credentials! + +DCNiOS can use some AWS as input. A valid pair of AWS Access Key and AWS Secret Key is necessary in all those cases. - DCNiOS takes the credentials from the environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. -- If those environment variables do not exist, the credentials are taken from [aws file credentials](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) with the `default` section. +- If those environment variables do not exist, the credentials are taken from [aws file credentials](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) with the `default` section. Here is an example: + ``` bash + [default] + aws_access_key_id = AK<> + aws_secret_access_key = <> + ``` - If DCNiOS does not successfully use the credentials as environment variables or in the credential file. DCNiOS gets them from configuration files named `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. This implementation is made to minimize the times that the credentials are written in the configuration file. -AWS_DEFAULT_REGION is mandatory in any source that uses AWS of the configuration file. - +AWS_DEFAULT_REGION is mandatory in any source that uses AWS of the configuration file. Right now, the ProcessGroup that uses AWS credentials are: +- [SQS](/docs/Inputs/SQS) +- [S3](/docs/Inputs/S3) \ No newline at end of file diff --git a/docpage/docs/01.-Users.md b/docpage/docs/Users.md similarity index 98% rename from docpage/docs/01.-Users.md rename to docpage/docs/Users.md index 8a963da5..321b19f4 100644 --- a/docpage/docs/01.-Users.md +++ b/docpage/docs/Users.md @@ -1,3 +1,6 @@ +--- +sidebar_position: 1 +--- # Users ## Yaml structure From 20cda7a969dc4e7caefe4c2a8420ddde3ab75db6 Mon Sep 17 00:00:00 2001 From: SergioLangaritaBenitez Date: Mon, 10 Jun 2024 13:53:58 +0200 Subject: [PATCH 3/3] update documentation and refactor --- cli/alterations/alteration.py | 68 + .../NifiManagment.py} | 24 +- cli/apis/auxiliaryFunctions.py | 72 + cli/{sources => apis}/aws.py | 22 +- cli/apis/sslExample | 103 + cli/dcnios-cli.py | 207 +- cli/description.yaml | 6 +- cli/destinations/OSCAR.py | 38 + cli/destinations/s3sqs.py | 34 + cli/env.py | 79 + cli/sources/Kafka.py | 76 + cli/sources/auxiliaryFunctions.py | 76 - cli/sources/dcache.py | 31 + cli/sources/generic.py | 25 + cli/sources/s3sqs.py | 44 + cli/template/Alterations/Encode_Decode.json | 1 + cli/template/Alterations/Merge.json | 621 ++++++ .../{ => Destinations}/InvokeOSCAR.json | 104 +- cli/template/Destinations/PutS3.json | 425 ++++ cli/template/{ => Sources}/Kafka.json | 122 +- cli/template/{ => Sources}/SQS_recive.json | 0 cli/template/{ => Sources}/dcache.json | 0 docpage/docs/02.-Inputs/Kafka.md | 33 - docpage/docs/02.-Inputs/S3.md | 21 - docpage/docs/02.-Inputs/SQS.md | 19 - docpage/docs/02.-Inputs/dcache.md | 32 - docpage/docs/02.-Inputs/generic.md | 21 - docpage/docs/03.- Sources/Kafka.md | 29 + docpage/docs/03.- Sources/S3.md | 22 + docpage/docs/03.- Sources/SQS.md | 21 + docpage/docs/03.- Sources/dcache.md | 27 + docpage/docs/03.- Sources/generic.md | 27 + docpage/docs/03.-Outputs/OSCAR.md | 25 - docpage/docs/04.- Destinations/OSCAR.md | 26 + docpage/docs/AWS.md | 35 +- docpage/docs/Introduction.md | 62 + docpage/docs/Users.md | 164 +- docpage/docusaurus.config.js | 2 +- docpage/package-lock.json | 1708 ++++++++--------- docpage/package.json | 8 +- 40 files changed, 2982 insertions(+), 1478 deletions(-) create mode 100644 cli/alterations/alteration.py rename cli/{sources/NifiManagement.py => apis/NifiManagment.py} (91%) create mode 100644 cli/apis/auxiliaryFunctions.py rename cli/{sources => apis}/aws.py (89%) create mode 100644 cli/apis/sslExample create mode 100644 cli/destinations/OSCAR.py create mode 100644 cli/destinations/s3sqs.py create mode 100644 cli/env.py create mode 100644 cli/sources/Kafka.py delete mode 100644 cli/sources/auxiliaryFunctions.py create mode 100644 cli/sources/dcache.py create mode 100644 cli/sources/generic.py create mode 100644 cli/sources/s3sqs.py create mode 100644 cli/template/Alterations/Encode_Decode.json create mode 100644 cli/template/Alterations/Merge.json rename cli/template/{ => Destinations}/InvokeOSCAR.json (81%) create mode 100644 cli/template/Destinations/PutS3.json rename cli/template/{ => Sources}/Kafka.json (78%) rename cli/template/{ => Sources}/SQS_recive.json (100%) rename cli/template/{ => Sources}/dcache.json (100%) delete mode 100644 docpage/docs/02.-Inputs/Kafka.md delete mode 100644 docpage/docs/02.-Inputs/S3.md delete mode 100644 docpage/docs/02.-Inputs/SQS.md delete mode 100644 docpage/docs/02.-Inputs/dcache.md delete mode 100644 docpage/docs/02.-Inputs/generic.md create mode 100644 docpage/docs/03.- Sources/Kafka.md create mode 100644 docpage/docs/03.- Sources/S3.md create mode 100644 docpage/docs/03.- Sources/SQS.md create mode 100644 docpage/docs/03.- Sources/dcache.md create mode 100644 docpage/docs/03.- Sources/generic.md delete mode 100644 docpage/docs/03.-Outputs/OSCAR.md create mode 100644 docpage/docs/04.- Destinations/OSCAR.md create mode 100644 docpage/docs/Introduction.md diff --git a/cli/alterations/alteration.py b/cli/alterations/alteration.py new file mode 100644 index 00000000..b9afe876 --- /dev/null +++ b/cli/alterations/alteration.py @@ -0,0 +1,68 @@ +# dCNiOs +# Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the Apache 2.0 Licence as published by +# the Apache Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Apache 2.0 License for more details. +# +# You should have received a copy of the Apache 2.0 License +# along with this program. If not, see . + +# !/usr/bin/env python3 + +from apis import NifiManagment +from apis import auxiliaryFunctions + + +def createMerge(nifiConfiguration,information, name): + nameCompose= nameActionReturn(information["action"],name) + merge=auxiliaryFunctions.prepareforAll("./template/Alterations/Merge.json",information) + merge = auxiliaryFunctions.addSensibleVariable(merge, "MergeContent", "Maximum Number of Entries", information["maxMessages"]) + nifiConfiguration.create(nameCompose, merge) + nifiConfiguration.changeSchedule(nameCompose, "MergeContent", information["windowSeconds"]) + + +def createDecode(nifiConfiguration,information,name): + nameCompose= nameActionReturn(information["action"],name) + merge=auxiliaryFunctions.prepareforAll("./template/Alterations/Encode_Decode.json",information) + merge = auxiliaryFunctions.addSensibleVariable(merge, "EncodeContent", "Mode", "Decode") + if "Encoding" in information: + merge = auxiliaryFunctions.addSensibleVariable(merge, "EncodeContent", "Encoding", information["Encoding"]) + nifiConfiguration.create(nameCompose, merge) + +def createEncode(nifiConfiguration,information,name): + nameCompose= nameActionReturn(information["action"],name) + merge=auxiliaryFunctions.prepareforAll("./template/Alterations/Encode_Decode.json",information) + if "Encoding" in information: + merge = auxiliaryFunctions.addSensibleVariable(merge, "EncodeContent", "Encoding", information["Encoding"]) + nifiConfiguration.create(nameCompose, merge) + + + +def createAlteration(nifiConfiguration,allInformation): + name=allInformation["name"] + for alter in allInformation["alterations"]: + if alter["action"]=="Merge": + createMerge(nifiConfiguration,alter,name) + elif alter["action"]=="Encode": + createEncode(nifiConfiguration,alter,name) + elif alter["action"]=="Decode": + createDecode(nifiConfiguration,alter,name) + conectAlteration(nifiConfiguration,allInformation) + + +def conectAlteration(nifiConfiguration,allInformation): + name=allInformation["name"] + for index,step in enumerate(allInformation["alterations"]): + if index == 0: + nifiConfiguration.makeConnection(name,nameActionReturn(step["action"],name)) + else: + nifiConfiguration.makeConnection(nameActionReturn(allInformation["alterations"][index-1]["action"],name),nameActionReturn(step["action"],name)) + +def nameActionReturn(nameAction,nameSource): + return nameAction+ " of "+ nameSource \ No newline at end of file diff --git a/cli/sources/NifiManagement.py b/cli/apis/NifiManagment.py similarity index 91% rename from cli/sources/NifiManagement.py rename to cli/apis/NifiManagment.py index 75f96aae..0da861aa 100755 --- a/cli/sources/NifiManagement.py +++ b/cli/apis/NifiManagment.py @@ -82,12 +82,10 @@ def deleteProcess(self, name): return None process_group = groupid response = self.callHttp(requests.get, - "/nifi-api/process-groups/root/connections", - '') + "/nifi-api/process-groups/root/connections", '') for connection in response.json()["connections"]: if connection["component"]["source"]["groupId"] == process_group \ - or connection["component"]["destination"]["groupId"] == \ - process_group: + or connection["component"]["destination"]["groupId"] == process_group: link = "/nifi-api/connections/" + connection["id"] \ + "?version=" + str(connection["revision"]["version"]) response = self.callHttp(requests.delete, link, '') @@ -216,3 +214,21 @@ def disableSSL(self, name): "/nifi-api/controller-services/" + ssl_context_id + "/run-status", data) + + def updateComponent(self, type): + if "components" in type: + print("Process group: "+type["name"]) + for component in type["components"]: + print("\t- Process: " + component["name"]) + if "seconds" in component: + self.changeSchedule(type["name"], component["name"], + component["seconds"]) + print("\t New schedule time: " + + str(component["seconds"]) + " seconds") + if "node" in component: + self.executionNode(type["name"], + component["name"], component["node"]) + print("\t Now executing in node: " + component["node"]) + + def newProcessInfo(self, name): + print("New Process group: " + str(name)) \ No newline at end of file diff --git a/cli/apis/auxiliaryFunctions.py b/cli/apis/auxiliaryFunctions.py new file mode 100644 index 00000000..f9470a3d --- /dev/null +++ b/cli/apis/auxiliaryFunctions.py @@ -0,0 +1,72 @@ +# dCNiOs +# Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the Apache 2.0 Licence as published by +# the Apache Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Apache 2.0 License for more details. +# +# You should have received a copy of the Apache 2.0 License +# along with this program. If not, see . + +# !/usr/bin/env python3 + +import json +import os +from alterations import alteration + + +def addSensibleVariable(file, processorName, key, value): + for processor in file["flowContents"]["processors"]: + if processor["name"] == processorName: + processor["properties"][key] = value + return file + + +def prepareforAll(fileName, info): + with open(fileName) as f: + filecontent = json.load(f) + filecontent["snapshotMetadata"] = {} + filecontent["snapshotMetadata"]["bucketIdentifier"] = "" + filecontent["snapshotMetadata"]["flowIdentifier"] = "" + filecontent["snapshotMetadata"]["version"] = -1 + if checkExistSsl_context(info): + filecontent = ssl_context(filecontent,info["ssl_context"]) + return filecontent + +def postJob(info,nifi): + if checkExistSsl_context(info): + print("Nifi enable ssl "+ info["name"]) + nifi.enableSSL(info["name"]) + nifi.newProcessInfo(info["name"]) + nifi.updateComponent(info) + if "alterations" in info: + alteration.createAlteration(nifi,info) + + + +def checkExistSsl_context(info): + if 'ssl_context' in info: + return True + else: + return False + +def ssl_context(filecontent, variables): + if filecontent["flowContents"]["controllerServices"]==[]: + introduceSSL(filecontent) + else: + pass + for var in variables: + change = filecontent["flowContents"]["controllerServices"][0] + change["properties"][var.replace("_", " ")] = variables[var] + return filecontent + + +def introduceSSL(filecontent): + with open("apis/sslExample") as f: + sslcontent = json.load(f) + filecontent["flowContents"]["controllerServices"] = sslcontent diff --git a/cli/sources/aws.py b/cli/apis/aws.py similarity index 89% rename from cli/sources/aws.py rename to cli/apis/aws.py index e4f7d9f3..e7b16bd8 100644 --- a/cli/sources/aws.py +++ b/cli/apis/aws.py @@ -18,12 +18,12 @@ import json import os import boto3 -from sources.auxiliaryFunctions import addSensibleVariable - +from apis.auxiliaryFunctions import addSensibleVariable +from apis import auxiliaryFunctions +from apis import NifiManagment def getAWSCredentials(configuration): - if "AWS_ACCESS_KEY_ID" in os.environ \ - and os.environ["AWS_ACCESS_KEY_ID"] != "" \ + if "AWS_ACCESS_KEY_ID" in os.environ and os.environ["AWS_ACCESS_KEY_ID"] != "" \ and "AWS_SECRET_ACCESS_KEY" in os.environ \ and os.environ["AWS_SECRET_ACCESS_KEY"] != "": print("AWS Credentials: Credentials from environment") @@ -42,7 +42,7 @@ def getAWSCredentials(configuration): print("AWS Credentials: Credentials from configuration file") -def createSQS(configuration): +def createSQSQueue(configuration): accountID = boto3.client('sts').get_caller_identity().get('Account') sqsClient = boto3.client('sqs', region_name=configuration["AWS_DEFAULT_REGION"]) @@ -73,17 +73,19 @@ def createSQS(configuration): return sqsClient.get_queue_url(QueueName=configuration["queue_name"]) -def sqsPreparefile(filecontent, configuration): - filecontent = addSensibleVariable(filecontent, "GetSQS", "Access Key", + + +def awsCredentialPreparefile(filecontent, configuration,processorName): + filecontent = addSensibleVariable(filecontent, processorName, "Access Key", configuration["AWS_ACCESS_KEY_ID"]) - filecontent = addSensibleVariable(filecontent, "GetSQS", "Secret Key", + filecontent = addSensibleVariable(filecontent, processorName, "Secret Key", configuration["AWS_SECRET_ACCESS_KEY"]) - filecontent = addSensibleVariable(filecontent, "GetSQS", "Region", + filecontent = addSensibleVariable(filecontent, processorName, "Region", configuration["AWS_DEFAULT_REGION"]) return filecontent -def deleteSQS(configuration): +def deleteSQSQueue(configuration): sqsClient = boto3.client('sqs', region_name=configuration["AWS_DEFAULT_REGION"]) queue = sqsClient.get_queue_url(QueueName=configuration["queue_name"]) diff --git a/cli/apis/sslExample b/cli/apis/sslExample new file mode 100644 index 00000000..b477d89a --- /dev/null +++ b/cli/apis/sslExample @@ -0,0 +1,103 @@ +[{ + "identifier": "3598a8e1-9ef0-3b7f-9c69-83466719eb43", + "instanceIdentifier": "d5058dde-987d-3481-bd03-d5e1bf0dcea3", + "name": "StandardRestrictedSSLContextService", + "comments": "", + "type": "org.apache.nifi.ssl.StandardRestrictedSSLContextService", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-ssl-context-service-nar", + "version": "1.20.0" + }, + "properties": { + "Truststore Type": "", + "SSL Protocol": "", + "Keystore Type": null, + "Truststore Filename": "", + "Keystore Filename": null + }, + "propertyDescriptors": { + "Truststore Type": { + "name": "Truststore Type", + "displayName": "Truststore Type", + "identifiesControllerService": false, + "sensitive": false + }, + "SSL Protocol": { + "name": "SSL Protocol", + "displayName": "TLS Protocol", + "identifiesControllerService": false, + "sensitive": false + }, + "Keystore Type": { + "name": "Keystore Type", + "displayName": "Keystore Type", + "identifiesControllerService": false, + "sensitive": false + }, + "Truststore Filename": { + "name": "Truststore Filename", + "displayName": "Truststore Filename", + "identifiesControllerService": false, + "sensitive": false, + "resourceDefinition": { + "cardinality": "SINGLE", + "resourceTypes": [ + "FILE" + ] + } + }, + "Keystore Password": { + "name": "Keystore Password", + "displayName": "Keystore Password", + "identifiesControllerService": false, + "sensitive": true + }, + "key-password": { + "name": "key-password", + "displayName": "Key Password", + "identifiesControllerService": false, + "sensitive": true + }, + "Truststore Password": { + "name": "Truststore Password", + "displayName": "Truststore Password", + "identifiesControllerService": false, + "sensitive": true + }, + "Keystore Filename": { + "name": "Keystore Filename", + "displayName": "Keystore Filename", + "identifiesControllerService": false, + "sensitive": false, + "resourceDefinition": { + "cardinality": "SINGLE", + "resourceTypes": [ + "FILE" + ] + } + } + }, + "controllerServiceApis": [ + { + "type": "org.apache.nifi.ssl.SSLContextService", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-services-api-nar", + "version": "1.20.0" + } + }, + { + "type": "org.apache.nifi.ssl.RestrictedSSLContextService", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-services-api-nar", + "version": "1.20.0" + } + } + ], + "scheduledState": "DISABLED", + "bulletinLevel": "WARN", + "componentType": "CONTROLLER_SERVICE", + "groupIdentifier": "0d4c118b-55b4-3b4f-acbf-5ba1e91af113" + }] \ No newline at end of file diff --git a/cli/dcnios-cli.py b/cli/dcnios-cli.py index 2eedaa14..9497af87 100644 --- a/cli/dcnios-cli.py +++ b/cli/dcnios-cli.py @@ -16,39 +16,22 @@ import yaml from yaml.loader import SafeLoader import json -from oscar_python.client import Client -from sources.auxiliaryFunctions import * -from sources.NifiManagement import * -from sources.aws import * -import boto3 -import os +#from oscar_python.client import Client +from apis.auxiliaryFunctions import * +from apis.NifiManagment import * +from apis.aws import * +from sources.dcache import * +from destinations.OSCAR import * +from sources.Kafka import * +from sources.generic import * +#import boto3 +#import os +import env import argparse -folder = "template/" -dcachefile = folder+"dcache.json" -oscarfile = folder+"InvokeOSCAR.json" -sqsfile = folder+"SQS_recive.json" -kafkafile = folder+"Kafka.json" types = ["dCache", "OSCAR", "S3", "SQS", "generic", "Kafka"] typesSSL = ["Kafka"] - -def updateComponent(type): - if "components" in type: - print("Process group: "+type["name"]) - for component in type["components"]: - print("\t- Process: " + component["name"]) - if "seconds" in component: - nifi.changeSchedule(type["name"], component["name"], - component["seconds"]) - print("\t New schedule time: " - + str(component["seconds"]) + " seconds") - if "node" in component: - nifi.executionNode(type["name"], - component["name"], component["node"]) - print("\t Now executing in node: " + component["node"]) - - def doType(type, function): if type in data["nifi"]: for singularoftype in data["nifi"][type]: @@ -60,9 +43,39 @@ def makeActionWithAllType(allType, function): for type in allType: doType(type, function) +def functionAll(function): + for dic in env.info: + if dic["id"] in data["nifi"]: + for information in data["nifi"][dic["id"]]: + function(information["name"]) + print(str(function.__qualname__) + " " + information["name"]) + if "alterations" in information: + for alter in information["alterations"]: + function(alteration.nameActionReturn(alter["action"],information["name"])) + print(str(function.__qualname__) + " " + alteration.nameActionReturn(alter["action"],information["name"])) + +def deleteAll(nifi): + for dic in env.info: + if dic["id"] in data["nifi"]: + for information in data["nifi"][dic["id"]]: + if auxiliaryFunctions.checkExistSsl_context(information): + print("Nifi disable ssl "+ information["name"]) + nifi.disableSSL(information["name"]) + nifi.deleteProcess(information["name"]) + if "alterations" in information: + for alter in information["alterations"]: + nifi.deleteProcess(alteration.nameActionReturn(alter["action"],information["name"])) + print("Delete Process "+ information["name"]) + + + +def createAll(nifi,dic): + if dic["id"] in data["nifi"]: + for information in data["nifi"][dic["id"]]: + informationcontent=auxiliaryFunctions.prepareforAll(dic["file"],information) + dic['function'](nifi,information,informationcontent) + auxiliaryFunctions.postJob(information,nifi) -def newProcessInfo(name): - print("New Process group: " + str(name)) parser = argparse.ArgumentParser( @@ -70,7 +83,7 @@ def newProcessInfo(name): description='What the program does', epilog='Text at the bottom of help') parser.add_argument('option') -parser.add_argument('-f') +parser.add_argument('--file','-f') parser.add_argument('--host') parser.add_argument('--user', "-u") parser.add_argument('--password', "-p") @@ -82,131 +95,47 @@ def newProcessInfo(name): print("File parameter not found") exit(1) # Open the file and load the file -elif args.option is not None and args.f is not None: - with open(args.f) as f: +elif args.option is not None and args.file is not None: + with open(args.file) as f: data = yaml.load(f, Loader=SafeLoader) nifi_endpoint = data["nifi"]["endpoint"] nifi_user = data["nifi"]["user"] nifi_password = data["nifi"]["password"] nifi = Nifi(nifi_endpoint, nifi_user, nifi_password) if args.option == "apply": - if "dCache" in data["nifi"]: - for dcache in data["nifi"]["dCache"]: - dcachecontent = prepareforAll(dcachefile) - nifi.create(dcache["name"], dcachecontent) - command = "simple-client.py --state /state/" \ - + dcache["statefile"] + " --endpoint " \ - + dcache["endpoint"] \ - + " --user "+dcache["user"] + " --password " \ - + dcache["password"] + " " + dcache["folder"] - nifi.changeVariable(dcache["name"], "command", command) - newProcessInfo(dcache["name"]) - updateComponent(dcache) - - if "OSCAR" in data["nifi"]: - for oscar in data["nifi"]["OSCAR"]: - oscarcontent = prepareforAll(oscarfile) - nifi.create(oscar["name"], oscarcontent) - nifi.changeVariable(oscar["name"], "endpoint", - oscar["endpoint"]) - nifi.changeVariable(oscar["name"], "service", - oscar["service"]) - if "user" in oscar and "password" in oscar: - client = Client("cluster-id", oscar["endpoint"], - oscar["user"], oscar["password"], True) - service = client.get_service(oscar["service"]) - token = service.json()["token"] - nifi.changeVariable(oscar["name"], "token", token) - else: - nifi.changeVariable(oscar["name"], "token", - oscar["token"]) - newProcessInfo(oscar["name"]) - updateComponent(oscar) - if "generic" in data["nifi"]: - for generic in data["nifi"]["generic"]: - genericcontent = prepareforAll(generic["file"]) - nifi.create(generic["name"], genericcontent) - for variable in generic["variables"]: - nifi.changeVariable(generic["name"], variable, - generic["variables"][variable]) - newProcessInfo(generic["name"]) - updateComponent(generic) - if "SQS" in data["nifi"]: - for sqs in data["nifi"]["SQS"]: - # Get credentials of AWS - getAWSCredentials(sqs) - # Create SQS - sqsDetails = createSQS(sqs) - # Prepare config - sqscontent = prepareforAll(sqsfile) - sqscontent = sqsPreparefile(sqscontent, sqs) - # Create object - nifi.create(sqs["name"], sqscontent) - nifi.changeVariable(sqs["name"], 'queueurl', - sqsDetails['QueueUrl']) - newProcessInfo(sqs["name"]) - updateComponent(sqs) - if "S3" in data["nifi"]: - for s3 in data["nifi"]["S3"]: - # Get credentials of AWS - getAWSCredentials(s3) - # Create SQS - s3["queue_name"] = s3["AWS_S3_BUCKET"] + "_events" - sqsDetails = createSQS(s3) - # Create Notification from S3 event to SQS - s3NotificationSQS(s3) - # Prepare config - sqscontent = prepareforAll(sqsfile) - s3content = sqsPreparefile(sqscontent, s3) - # Create object - nifi.create(s3["name"], sqscontent) - nifi.changeVariable(s3["name"], 'queueurl', - sqsDetails['QueueUrl']) - newProcessInfo(s3["name"]) - updateComponent(s3) - if "Kafka" in data["nifi"]: - for kafka in data["nifi"]["Kafka"]: - # Prepare config - kafkacontent = prepareforAll(kafkafile) - kafkacontent = kafkaPreparefile(kafkacontent, kafka) - # Set ssl context configuration - kafka["ssl_context"]["SSL_Protocol"] = "TLS" - kafka["ssl_context"]["Truststore_Type"] = "PKCS12" - kafka["ssl_context"]["Truststore_Filename"] = "/opt/nifi" \ - + "/nifi-current/data/" \ - + kafka["ssl_context"]["Truststore_Filename"] - kafkacontent = ssl_context(kafkacontent, - kafka["ssl_context"]) - # Create object - nifi.create(kafka["name"], kafkacontent) - nifi.changeVariable(kafka["name"], "group_id", - kafka["group_id"]) - nifi.changeVariable(kafka["name"], "bootstrap_servers", - kafka["bootstrap_servers"]) - nifi.changeVariable(kafka["name"], "topic", - kafka["topic"]) - # Enable SSL - nifi.enableSSL(kafka["name"]) - newProcessInfo(kafka["name"]) - updateComponent(kafka) + for info in env.info: + createAll(nifi,info) if "connection" in data["nifi"]: for connection in data["nifi"]["connection"]: - nifi.makeConnection(connection["from"], connection["to"]) + for info in env.info: + if info["id"] in data["nifi"]: + for information in data["nifi"][info["id"]]: + if connection["from"] == information["name"]: + if "alterations" in information and information["alterations"] != None: + alterName = alteration.nameActionReturn(information["alterations"][-1]["action"],information["name"]) + nifi.makeConnection(alterName, connection["to"]) + else: + nifi.makeConnection(connection["from"], connection["to"]) elif args.option == "delete": - makeActionWithAllType(typesSSL, nifi.disableSSL) - makeActionWithAllType(types, nifi.deleteProcess) + deleteAll(nifi) + #makeActionWithAllType(typesSSL, nifi.disableSSL) + #makeActionWithAllType(types, nifi.deleteProcess) # Delete of SQS, not the notification if "S3" in data["nifi"]: for s3 in data["nifi"]["S3"]: s3["queue_name"] = s3["AWS_S3_BUCKET"] + "_events" - deleteSQS(s3) + deleteSQSQueue(s3) if "SQS" in data["nifi"]: for sqs in data["nifi"]["SQS"]: - deleteSQS(sqs) + deleteSQSQueue(sqs) elif args.option == "start": - makeActionWithAllType(types, nifi.startProcess) + functionAll(nifi.startProcess) + #startAll(nifi,info) + #makeActionWithAllType(types, nifi.startProcess) elif args.option == "stop": - makeActionWithAllType(types, nifi.stopProcess) + functionAll(nifi.stopProcess) + #stoptAll(nifi,info) + #makeActionWithAllType(types, nifi.stopProcess) else: print("incorrect command try again") if args.option == "changeSchedule" or args.option == "cs": diff --git a/cli/description.yaml b/cli/description.yaml index f0517437..44901ea9 100644 --- a/cli/description.yaml +++ b/cli/description.yaml @@ -2,7 +2,7 @@ nifi: endpoint: https:// user: password: - dcache: + dCache: - name: dcache endpoint: user: @@ -13,7 +13,7 @@ nifi: - name: GetFile seconds: 2 node: (ALL | PRIMARY) - oscar: + OSCAR: - name: invoke endpoint: https:// service: @@ -39,7 +39,7 @@ nifi: - name: SQS-events AWS_DEFAULT_REGION: queue_name: - S3: + GetS3: - name: S3_download AWS_ACCESS_KEY_ID: AWS_SECRET_ACCESS_KEY: diff --git a/cli/destinations/OSCAR.py b/cli/destinations/OSCAR.py new file mode 100644 index 00000000..1295de65 --- /dev/null +++ b/cli/destinations/OSCAR.py @@ -0,0 +1,38 @@ +# dCNiOs +# Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the Apache 2.0 Licence as published by +# the Apache Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Apache 2.0 License for more details. +# +# You should have received a copy of the Apache 2.0 License +# along with this program. If not, see . + +# !/usr/bin/env python3 + +from apis import auxiliaryFunctions +from apis import NifiManagment +from oscar_python.client import Client + + + +def createOSCAR(nifiConfiguration,oscarInfo,oscarcontent): + nifiConfiguration.create(oscarInfo["name"], oscarcontent) + nifiConfiguration.changeVariable(oscarInfo["name"], "endpoint", + oscarInfo["endpoint"]) + nifiConfiguration.changeVariable(oscarInfo["name"], "service", + oscarInfo["service"]) + if "user" in oscarInfo and "password" in oscarInfo: + client = Client("cluster-id", oscarInfo["endpoint"], + oscarInfo["user"], oscarInfo["password"], True) + service = client.get_service(oscarInfo["service"]) + token = service.json()["token"] + nifiConfiguration.changeVariable(oscarInfo["name"], "token", token) + else: + nifiConfiguration.changeVariable(oscarInfo["name"], "token", + oscarInfo["token"]) \ No newline at end of file diff --git a/cli/destinations/s3sqs.py b/cli/destinations/s3sqs.py new file mode 100644 index 00000000..3942298c --- /dev/null +++ b/cli/destinations/s3sqs.py @@ -0,0 +1,34 @@ +# dCNiOs +# Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the Apache 2.0 Licence as published by +# the Apache Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Apache 2.0 License for more details. +# +# You should have received a copy of the Apache 2.0 License +# along with this program. If not, see . + +# !/usr/bin/env python3 + +from apis import auxiliaryFunctions +from apis import NifiManagment +from apis import aws + + + + +def createPutS3(nifiConfiguration,s3Info,s3content): + if "MinIO_Endpoint" in s3Info: + auxiliaryFunctions.addSensibleVariable(s3content, "PutS3Object", "Endpoint Override URL", s3Info["MinIO_Endpoint"]) + s3Info["AWS_DEFAULT_REGION"]="us-east-1" + else: + aws.getAWSCredentials(s3Info) + s3content = aws.awsCredentialPreparefile(s3content, s3Info,"PutS3Object") + auxiliaryFunctions.addSensibleVariable(s3content, "PutS3Object", "Bucket", s3Info["AWS_S3_BUCKET"]) + nifiConfiguration.create(s3Info["name"], s3content) + \ No newline at end of file diff --git a/cli/env.py b/cli/env.py new file mode 100644 index 00000000..1c0300ca --- /dev/null +++ b/cli/env.py @@ -0,0 +1,79 @@ +# dCNiOs +# Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the Apache 2.0 Licence as published by +# the Apache Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Apache 2.0 License for more details. +# +# You should have received a copy of the Apache 2.0 License +# along with this program. If not, see . + + +from sources.dcache import createDcache +from sources.s3sqs import createGetS3,createGetSQS +from sources.Kafka import createKafka +from sources.generic import createGeneric +from destinations.OSCAR import createOSCAR +from destinations.s3sqs import createPutS3 + +folderSource = "template/Sources/" + +kafkafile = folderSource+"Kafka.json" +dcachefile = folderSource+"dcache.json" +sqsfile = folderSource+"SQS_recive.json" + +folderDestination = "template/Destinations/" +putS3file= folderDestination+ "PutS3.json" +oscarfile = folderDestination+"InvokeOSCAR.json" + +info=[ + { + 'id': 'dCache', + 'file': dcachefile, + 'function': createDcache, + }, + { + 'id': 'OSCAR', + 'file': oscarfile, + 'function': createOSCAR, + }, + { + 'id': 'GetS3', + 'file': sqsfile, + 'function': createGetS3, + }, + { + 'id': 'PutS3', + 'file': putS3file, + 'function': createPutS3, + }, + { + 'id': 'GetSQS', + 'file': sqsfile, + 'function': createGetSQS, + + }, + { + 'id': 'generic', + 'file': oscarfile, + 'function': createGeneric, + + }, + { + 'id': 'Kafka', + 'file': kafkafile, + 'function': createKafka, + + }, +] + + + + + + diff --git a/cli/sources/Kafka.py b/cli/sources/Kafka.py new file mode 100644 index 00000000..f4b07e11 --- /dev/null +++ b/cli/sources/Kafka.py @@ -0,0 +1,76 @@ +# dCNiOs +# Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the Apache 2.0 Licence as published by +# the Apache Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Apache 2.0 License for more details. +# +# You should have received a copy of the Apache 2.0 License +# along with this program. If not, see . + +# !/usr/bin/env python3 + +from apis import auxiliaryFunctions +from apis import NifiManagment + +def createKafka(nifiConfiguration,kafkaInfo,kafkacontent): + # Prepare config + kafkacontent = kafkaPreparefile(kafkacontent, kafkaInfo) + # Set ssl context configuration + kafkaInfo["ssl_context"]["SSL_Protocol"] = "TLS" + kafkaInfo["ssl_context"]["Truststore_Type"] = "PKCS12" + kafkaInfo["ssl_context"]["Truststore_Filename"] = "/opt/nifi" \ + + "/nifi-current/data/" \ + + kafkaInfo["ssl_context"]["Truststore_Filename"] + kafkacontent = auxiliaryFunctions.ssl_context(kafkacontent, + kafkaInfo["ssl_context"]) + # Create object + nifiConfiguration.create(kafkaInfo["name"], kafkacontent) + nifiConfiguration.changeVariable(kafkaInfo["name"], "group_id", + kafkaInfo["group_id"]) + nifiConfiguration.changeVariable(kafkaInfo["name"], "bootstrap_servers", + kafkaInfo["bootstrap_servers"]) + nifiConfiguration.changeVariable(kafkaInfo["name"], "topic", + kafkaInfo["topic"]) + + + + + + +def kafkaPreparefile(filecontent, kafka): + if "security_protocol" not in kafka: + filecontent = auxiliaryFunctions.addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "security.protocol", "SASL_SSL") + else: + filecontent = auxiliaryFunctions.addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "security.protocol", + kafka["security_protocol"]) + if "" not in kafka: + filecontent = auxiliaryFunctions.addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "sasl.mechanism", "PLAIN") + else: + filecontent = auxiliaryFunctions.addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "sasl.mechanism", + kafka["sasl_mechanism"]) + filecontent = auxiliaryFunctions.addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "sasl.username", + kafka["sasl_username"]) + filecontent = auxiliaryFunctions.addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "sasl.password", + kafka["sasl_password"]) + if "separate_by_key" in kafka and kafka["separate_by_key"] == "true": + filecontent = auxiliaryFunctions.addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "separate-by-key", "true") + filecontent = auxiliaryFunctions.addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "message-demarcator", + kafka["message_demarcator"]) + else: + filecontent = auxiliaryFunctions.addSensibleVariable(filecontent, "ConsumeKafka_2_6", + "separate-by-key", "false") + return filecontent diff --git a/cli/sources/auxiliaryFunctions.py b/cli/sources/auxiliaryFunctions.py deleted file mode 100644 index 130298ce..00000000 --- a/cli/sources/auxiliaryFunctions.py +++ /dev/null @@ -1,76 +0,0 @@ -# dCNiOs -# Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the Apache 2.0 Licence as published by -# the Apache Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# Apache 2.0 License for more details. -# -# You should have received a copy of the Apache 2.0 License -# along with this program. If not, see . - -# !/usr/bin/env python3 - -import json -import os - - -def addSensibleVariable(file, processorName, key, value): - for processor in file["flowContents"]["processors"]: - if processor["name"] == processorName: - processor["properties"][key] = value - return file - - -def prepareforAll(fileName): - with open(fileName) as f: - filecontent = json.load(f) - filecontent["snapshotMetadata"] = {} - filecontent["snapshotMetadata"]["bucketIdentifier"] = "" - filecontent["snapshotMetadata"]["flowIdentifier"] = "" - filecontent["snapshotMetadata"]["version"] = -1 - return filecontent - - -def kafkaPreparefile(filecontent, kafka): - if "security_protocol" not in kafka: - filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", - "security.protocol", "SASL_SSL") - else: - filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", - "security.protocol", - kafka["security_protocol"]) - if "" not in kafka: - filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", - "sasl.mechanism", "PLAIN") - else: - filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", - "sasl.mechanism", - kafka["sasl_mechanism"]) - filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", - "sasl.username", - kafka["sasl_username"]) - filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", - "sasl.password", - kafka["sasl_password"]) - if "separate_by_key" in kafka and kafka["separate_by_key"] == "true": - filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", - "separate-by-key", "true") - filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", - "message-demarcator", - kafka["message_demarcator"]) - else: - filecontent = addSensibleVariable(filecontent, "ConsumeKafka_2_6", - "separate-by-key", "false") - return filecontent - - -def ssl_context(filecontent, variables): - for var in variables: - change = filecontent["flowContents"]["controllerServices"][0] - change["properties"][var.replace("_", " ")] = variables[var] - return filecontent diff --git a/cli/sources/dcache.py b/cli/sources/dcache.py new file mode 100644 index 00000000..05dd191b --- /dev/null +++ b/cli/sources/dcache.py @@ -0,0 +1,31 @@ +# dCNiOs +# Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the Apache 2.0 Licence as published by +# the Apache Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Apache 2.0 License for more details. +# +# You should have received a copy of the Apache 2.0 License +# along with this program. If not, see . + +# !/usr/bin/env python3 + +from apis import auxiliaryFunctions +from apis import NifiManagment + + + + +def createDcache(nifiConfiguration,dCacheInfo,dcachecontent): + nifiConfiguration.create(dCacheInfo["name"], dcachecontent) + command = "simple-client.py --state /state/" \ + + dCacheInfo["statefile"] + " --endpoint " \ + + dCacheInfo["endpoint"] \ + + " --user "+dCacheInfo["user"] + " --password " \ + + dCacheInfo["password"] + " " + dCacheInfo["folder"] + nifiConfiguration.changeVariable(dCacheInfo["name"], "command", command) \ No newline at end of file diff --git a/cli/sources/generic.py b/cli/sources/generic.py new file mode 100644 index 00000000..446dac4e --- /dev/null +++ b/cli/sources/generic.py @@ -0,0 +1,25 @@ +# dCNiOs +# Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the Apache 2.0 Licence as published by +# the Apache Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Apache 2.0 License for more details. +# +# You should have received a copy of the Apache 2.0 License +# along with this program. If not, see . + +# !/usr/bin/env python3 + +from apis import auxiliaryFunctions +from apis import NifiManagment + +def createGeneric(nifiConfiguration,genricInfo,genericcontent): + nifiConfiguration.create(genricInfo["name"], genericcontent) + for variable in genricInfo["variables"]: + nifiConfiguration.changeVariable(genricInfo["name"], variable, + genricInfo["variables"][variable]) \ No newline at end of file diff --git a/cli/sources/s3sqs.py b/cli/sources/s3sqs.py new file mode 100644 index 00000000..8d704094 --- /dev/null +++ b/cli/sources/s3sqs.py @@ -0,0 +1,44 @@ +# dCNiOs +# Copyright (C) 2023 - GRyCAP - Universitat Politecnica de Valencia +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the Apache 2.0 Licence as published by +# the Apache Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Apache 2.0 License for more details. +# +# You should have received a copy of the Apache 2.0 License +# along with this program. If not, see . + +# !/usr/bin/env python3 + +import json +import os +import boto3 +from apis.auxiliaryFunctions import addSensibleVariable +from apis import auxiliaryFunctions +from apis import NifiManagment +from apis import aws + + + +def createGetS3(nifiConfiguration,s3Info,s3content): + s3Info["queue_name"] = s3Info["AWS_S3_BUCKET"] + "_events" + createGetSQS(nifiConfiguration,s3Info,s3content) + aws.s3NotificationSQS(s3Info) + + +def createGetSQS(nifiConfiguration,sqsInfo,sqscontent): + # Get credentials of AWS + aws.getAWSCredentials(sqsInfo) + # Create SQS + sqsDetails = aws.createSQSQueue(sqsInfo) + # Prepare config + sqscontent = aws.awsCredentialPreparefile(sqscontent, sqsInfo,"GetSQS") + # Create object + nifiConfiguration.create(sqsInfo["name"], sqscontent) + nifiConfiguration.changeVariable(sqsInfo["name"], 'queueurl', + sqsDetails['QueueUrl']) \ No newline at end of file diff --git a/cli/template/Alterations/Encode_Decode.json b/cli/template/Alterations/Encode_Decode.json new file mode 100644 index 00000000..ce985c68 --- /dev/null +++ b/cli/template/Alterations/Encode_Decode.json @@ -0,0 +1 @@ +{"flowContents":{"identifier":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1","instanceIdentifier":"c3213808-018f-1000-ffff-ffffa9e8b935","name":"Encode/Decode","comments":"","position":{"x":-568.0,"y":32.0},"processGroups":[],"remoteProcessGroups":[],"processors":[{"identifier":"a2738fdb-1ac2-3ec6-8940-16f888bffcae","instanceIdentifier":"c322f41e-018f-1000-0000-00003b38abfd","name":"EncodeContent","comments":"","position":{"x":-680.0,"y":1128.0},"type":"org.apache.nifi.processors.standard.EncodeContent","bundle":{"group":"org.apache.nifi","artifact":"nifi-standard-nar","version":"1.20.0"},"properties":{"Mode":"Encode","Encoding":"base64"},"propertyDescriptors":{"Mode":{"name":"Mode","displayName":"Mode","identifiesControllerService":false,"sensitive":false},"Encoding":{"name":"Encoding","displayName":"Encoding","identifiesControllerService":false,"sensitive":false}},"style":{},"schedulingPeriod":"0 sec","schedulingStrategy":"TIMER_DRIVEN","executionNode":"ALL","penaltyDuration":"30 sec","yieldDuration":"1 sec","bulletinLevel":"WARN","runDurationMillis":0,"concurrentlySchedulableTaskCount":1,"autoTerminatedRelationships":["failure"],"scheduledState":"ENABLED","retryCount":10,"retriedRelationships":[],"backoffMechanism":"PENALIZE_FLOWFILE","maxBackoffPeriod":"10 mins","componentType":"PROCESSOR","groupIdentifier":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1"}],"inputPorts":[{"identifier":"4ed5fc86-81fd-32ca-8c2a-bebfc1d4e488","instanceIdentifier":"c321915d-018f-1000-ffff-ffffff8b7222","name":"Input","comments":"","position":{"x":-956.5070537739389,"y":857.4889699236401},"type":"INPUT_PORT","concurrentlySchedulableTaskCount":1,"scheduledState":"ENABLED","allowRemoteAccess":false,"componentType":"INPUT_PORT","groupIdentifier":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1"}],"outputPorts":[{"identifier":"860bd814-2d5b-3cc9-abfb-6d8e60eed975","instanceIdentifier":"f0708cd6-425a-3c87-9065-fe529cb738eb","name":"Output","position":{"x":-280.0,"y":1496.0},"type":"OUTPUT_PORT","concurrentlySchedulableTaskCount":1,"scheduledState":"ENABLED","allowRemoteAccess":false,"componentType":"OUTPUT_PORT","groupIdentifier":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1"}],"connections":[{"identifier":"e2b80c29-ef26-3715-a3cc-51d41f74e9ba","instanceIdentifier":"c3233c8c-018f-1000-ffff-ffffc19cff7c","name":"","source":{"id":"4ed5fc86-81fd-32ca-8c2a-bebfc1d4e488","type":"INPUT_PORT","groupId":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1","name":"Input","comments":"","instanceIdentifier":"c321915d-018f-1000-ffff-ffffff8b7222"},"destination":{"id":"a2738fdb-1ac2-3ec6-8940-16f888bffcae","type":"PROCESSOR","groupId":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1","name":"EncodeContent","comments":"","instanceIdentifier":"c322f41e-018f-1000-0000-00003b38abfd"},"labelIndex":1,"zIndex":0,"selectedRelationships":[""],"backPressureObjectThreshold":10000,"backPressureDataSizeThreshold":"1 GB","flowFileExpiration":"0 sec","prioritizers":[],"bends":[],"loadBalanceStrategy":"DO_NOT_LOAD_BALANCE","partitioningAttribute":"","loadBalanceCompression":"DO_NOT_COMPRESS","componentType":"CONNECTION","groupIdentifier":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1"},{"identifier":"51bb9fad-368e-3441-a4c3-f985c4f65024","instanceIdentifier":"c3234dfc-018f-1000-ffff-ffff9ecf5b57","name":"","source":{"id":"a2738fdb-1ac2-3ec6-8940-16f888bffcae","type":"PROCESSOR","groupId":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1","name":"EncodeContent","comments":"","instanceIdentifier":"c322f41e-018f-1000-0000-00003b38abfd"},"destination":{"id":"860bd814-2d5b-3cc9-abfb-6d8e60eed975","type":"OUTPUT_PORT","groupId":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1","name":"Output","instanceIdentifier":"f0708cd6-425a-3c87-9065-fe529cb738eb"},"labelIndex":1,"zIndex":0,"selectedRelationships":["success"],"backPressureObjectThreshold":10000,"backPressureDataSizeThreshold":"1 GB","flowFileExpiration":"0 sec","prioritizers":[],"bends":[],"loadBalanceStrategy":"DO_NOT_LOAD_BALANCE","partitioningAttribute":"","loadBalanceCompression":"DO_NOT_COMPRESS","componentType":"CONNECTION","groupIdentifier":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1"}],"labels":[],"funnels":[],"controllerServices":[{"identifier":"e562e6b9-735b-383b-8ee7-97a1bf49745d","instanceIdentifier":"ba3be839-054a-3cf5-a194-e049d3eac050","name":"AvroRecordSetWriter","type":"org.apache.nifi.avro.AvroRecordSetWriter","bundle":{"group":"org.apache.nifi","artifact":"nifi-record-serialization-services-nar","version":"1.20.0"},"properties":{"compression-format":"NONE","Schema Write Strategy":"avro-embedded","schema-branch":null,"schema-name":"${schema.name}","cache-size":"1000","schema-registry":null,"schema-access-strategy":"inherit-record-schema","schema-protocol-version":"1","schema-version":null,"encoder-pool-size":"32","schema-cache":null,"schema-text":"${avro.schema}"},"propertyDescriptors":{"compression-format":{"name":"compression-format","displayName":"Compression Format","identifiesControllerService":false,"sensitive":false},"Schema Write Strategy":{"name":"Schema Write Strategy","displayName":"Schema Write Strategy","identifiesControllerService":false,"sensitive":false},"schema-branch":{"name":"schema-branch","displayName":"Schema Branch","identifiesControllerService":false,"sensitive":false},"schema-name":{"name":"schema-name","displayName":"Schema Name","identifiesControllerService":false,"sensitive":false},"cache-size":{"name":"cache-size","displayName":"Cache Size","identifiesControllerService":false,"sensitive":false},"schema-registry":{"name":"schema-registry","displayName":"Schema Registry","identifiesControllerService":true,"sensitive":false},"schema-access-strategy":{"name":"schema-access-strategy","displayName":"Schema Access Strategy","identifiesControllerService":false,"sensitive":false},"schema-protocol-version":{"name":"schema-protocol-version","displayName":"Schema Protocol Version","identifiesControllerService":false,"sensitive":false},"schema-version":{"name":"schema-version","displayName":"Schema Version","identifiesControllerService":false,"sensitive":false},"encoder-pool-size":{"name":"encoder-pool-size","displayName":"Encoder Pool Size","identifiesControllerService":false,"sensitive":false},"schema-cache":{"name":"schema-cache","displayName":"Schema Cache","identifiesControllerService":true,"sensitive":false},"schema-text":{"name":"schema-text","displayName":"Schema Text","identifiesControllerService":false,"sensitive":false}},"controllerServiceApis":[{"type":"org.apache.nifi.serialization.RecordSetWriterFactory","bundle":{"group":"org.apache.nifi","artifact":"nifi-standard-services-api-nar","version":"1.20.0"}}],"scheduledState":"DISABLED","bulletinLevel":"WARN","componentType":"CONTROLLER_SERVICE","groupIdentifier":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1"},{"identifier":"6fb8646c-3a99-3f25-9835-14300d09ece7","instanceIdentifier":"59cdfce3-9b57-3923-a201-15d7fd8799f8","name":"AvroReader","type":"org.apache.nifi.avro.AvroReader","bundle":{"group":"org.apache.nifi","artifact":"nifi-record-serialization-services-nar","version":"1.20.0"},"properties":{"schema-branch":null,"schema-name":"${schema.name}","cache-size":"1000","schema-registry":null,"schema-access-strategy":"embedded-avro-schema","schema-version":null,"schema-text":"${avro.schema}"},"propertyDescriptors":{"schema-branch":{"name":"schema-branch","displayName":"Schema Branch","identifiesControllerService":false,"sensitive":false},"schema-name":{"name":"schema-name","displayName":"Schema Name","identifiesControllerService":false,"sensitive":false},"cache-size":{"name":"cache-size","displayName":"Cache Size","identifiesControllerService":false,"sensitive":false},"schema-registry":{"name":"schema-registry","displayName":"Schema Registry","identifiesControllerService":true,"sensitive":false},"schema-access-strategy":{"name":"schema-access-strategy","displayName":"Schema Access Strategy","identifiesControllerService":false,"sensitive":false},"schema-version":{"name":"schema-version","displayName":"Schema Version","identifiesControllerService":false,"sensitive":false},"schema-text":{"name":"schema-text","displayName":"Schema Text","identifiesControllerService":false,"sensitive":false}},"controllerServiceApis":[{"type":"org.apache.nifi.serialization.RecordReaderFactory","bundle":{"group":"org.apache.nifi","artifact":"nifi-standard-services-api-nar","version":"1.20.0"}}],"scheduledState":"DISABLED","bulletinLevel":"WARN","componentType":"CONTROLLER_SERVICE","groupIdentifier":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1"},{"identifier":"3598a8e1-9ef0-3b7f-9c69-83466719eb43","instanceIdentifier":"10bad4f5-031c-3165-a489-e1d3179cd13f","name":"StandardRestrictedSSLContextService","comments":"","type":"org.apache.nifi.ssl.StandardRestrictedSSLContextService","bundle":{"group":"org.apache.nifi","artifact":"nifi-ssl-context-service-nar","version":"1.20.0"},"properties":{"Truststore Type":"PKCS12","SSL Protocol":"TLS","Keystore Type":null,"Truststore Filename":"/opt/nifi/nifi-current/data/file_to_generate.p12","Keystore Filename":null},"propertyDescriptors":{"Truststore Type":{"name":"Truststore Type","displayName":"Truststore Type","identifiesControllerService":false,"sensitive":false},"SSL Protocol":{"name":"SSL Protocol","displayName":"TLS Protocol","identifiesControllerService":false,"sensitive":false},"Keystore Type":{"name":"Keystore Type","displayName":"Keystore Type","identifiesControllerService":false,"sensitive":false},"Truststore Filename":{"name":"Truststore Filename","displayName":"Truststore Filename","identifiesControllerService":false,"sensitive":false,"resourceDefinition":{"cardinality":"SINGLE","resourceTypes":["FILE"]}},"Keystore Password":{"name":"Keystore Password","displayName":"Keystore Password","identifiesControllerService":false,"sensitive":true},"key-password":{"name":"key-password","displayName":"Key Password","identifiesControllerService":false,"sensitive":true},"Truststore Password":{"name":"Truststore Password","displayName":"Truststore Password","identifiesControllerService":false,"sensitive":true},"Keystore Filename":{"name":"Keystore Filename","displayName":"Keystore Filename","identifiesControllerService":false,"sensitive":false,"resourceDefinition":{"cardinality":"SINGLE","resourceTypes":["FILE"]}}},"controllerServiceApis":[{"type":"org.apache.nifi.ssl.SSLContextService","bundle":{"group":"org.apache.nifi","artifact":"nifi-standard-services-api-nar","version":"1.20.0"}},{"type":"org.apache.nifi.ssl.RestrictedSSLContextService","bundle":{"group":"org.apache.nifi","artifact":"nifi-standard-services-api-nar","version":"1.20.0"}}],"scheduledState":"DISABLED","bulletinLevel":"WARN","componentType":"CONTROLLER_SERVICE","groupIdentifier":"ab220a2c-0e47-3fd9-b223-1fb4c136afc1"}],"variables":{},"defaultFlowFileExpiration":"0 sec","defaultBackPressureObjectThreshold":10000,"defaultBackPressureDataSizeThreshold":"1 GB","componentType":"PROCESS_GROUP","flowFileConcurrency":"UNBOUNDED","flowFileOutboundPolicy":"STREAM_WHEN_AVAILABLE"},"externalControllerServices":{},"parameterContexts":{},"flowEncodingVersion":"1.0","parameterProviders":{},"latest":false} \ No newline at end of file diff --git a/cli/template/Alterations/Merge.json b/cli/template/Alterations/Merge.json new file mode 100644 index 00000000..ff3c7919 --- /dev/null +++ b/cli/template/Alterations/Merge.json @@ -0,0 +1,621 @@ +{ + "flowContents": { + "identifier": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c", + "instanceIdentifier": "c3257203-018f-1000-ffff-ffffbfc14f59", + "name": "Merge", + "comments": "", + "position": { + "x": -1102.6570781880014, + "y": 177.8389760271557 + }, + "processGroups": [], + "remoteProcessGroups": [], + "processors": [ + { + "identifier": "15135e8d-84e6-3a31-a83e-346f6abb382c", + "instanceIdentifier": "9bf2cd22-6a40-3b6a-9554-d1c46a3b312f", + "name": "MergeContent", + "comments": "", + "position": { + "x": -688.0, + "y": 1112.0 + }, + "type": "org.apache.nifi.processors.standard.MergeContent", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-nar", + "version": "1.20.0" + }, + "properties": { + "Keep Path": "false", + "Maximum Group Size": null, + "Merge Strategy": "Bin-Packing Algorithm", + "Attribute Strategy": "Keep Only Common Attributes", + "Compression Level": "1", + "Maximum Number of Entries": "", + "Minimum Group Size": "0 B", + "Maximum number of Bins": "10", + "Tar Modified Time": "${file.lastModifiedTime}", + "Delimiter Strategy": "Text", + "Merge Format": "Binary Concatenation", + "Footer File": null, + "Max Bin Age": null, + "Demarcator File": "${literal(' '):unescapeXml()}", + "Correlation Attribute Name": null, + "Header File": null, + "mergecontent-metadata-strategy": "Do Not Merge Uncommon Metadata", + "Minimum Number of Entries": "1" + }, + "propertyDescriptors": { + "Keep Path": { + "name": "Keep Path", + "displayName": "Keep Path", + "identifiesControllerService": false, + "sensitive": false + }, + "Maximum Group Size": { + "name": "Maximum Group Size", + "displayName": "Maximum Group Size", + "identifiesControllerService": false, + "sensitive": false + }, + "Merge Strategy": { + "name": "Merge Strategy", + "displayName": "Merge Strategy", + "identifiesControllerService": false, + "sensitive": false + }, + "Attribute Strategy": { + "name": "Attribute Strategy", + "displayName": "Attribute Strategy", + "identifiesControllerService": false, + "sensitive": false + }, + "Compression Level": { + "name": "Compression Level", + "displayName": "Compression Level", + "identifiesControllerService": false, + "sensitive": false + }, + "Maximum Number of Entries": { + "name": "Maximum Number of Entries", + "displayName": "Maximum Number of Entries", + "identifiesControllerService": false, + "sensitive": false + }, + "Minimum Group Size": { + "name": "Minimum Group Size", + "displayName": "Minimum Group Size", + "identifiesControllerService": false, + "sensitive": false + }, + "Maximum number of Bins": { + "name": "Maximum number of Bins", + "displayName": "Maximum number of Bins", + "identifiesControllerService": false, + "sensitive": false + }, + "Tar Modified Time": { + "name": "Tar Modified Time", + "displayName": "Tar Modified Time", + "identifiesControllerService": false, + "sensitive": false + }, + "Delimiter Strategy": { + "name": "Delimiter Strategy", + "displayName": "Delimiter Strategy", + "identifiesControllerService": false, + "sensitive": false + }, + "Merge Format": { + "name": "Merge Format", + "displayName": "Merge Format", + "identifiesControllerService": false, + "sensitive": false + }, + "Footer File": { + "name": "Footer File", + "displayName": "Footer", + "identifiesControllerService": false, + "sensitive": false, + "resourceDefinition": { + "cardinality": "SINGLE", + "resourceTypes": [ + "FILE", + "TEXT" + ] + } + }, + "Max Bin Age": { + "name": "Max Bin Age", + "displayName": "Max Bin Age", + "identifiesControllerService": false, + "sensitive": false + }, + "Demarcator File": { + "name": "Demarcator File", + "displayName": "Demarcator", + "identifiesControllerService": false, + "sensitive": false, + "resourceDefinition": { + "cardinality": "SINGLE", + "resourceTypes": [ + "FILE", + "TEXT" + ] + } + }, + "Correlation Attribute Name": { + "name": "Correlation Attribute Name", + "displayName": "Correlation Attribute Name", + "identifiesControllerService": false, + "sensitive": false + }, + "Header File": { + "name": "Header File", + "displayName": "Header", + "identifiesControllerService": false, + "sensitive": false, + "resourceDefinition": { + "cardinality": "SINGLE", + "resourceTypes": [ + "FILE", + "TEXT" + ] + } + }, + "mergecontent-metadata-strategy": { + "name": "mergecontent-metadata-strategy", + "displayName": "Metadata Strategy", + "identifiesControllerService": false, + "sensitive": false + }, + "Minimum Number of Entries": { + "name": "Minimum Number of Entries", + "displayName": "Minimum Number of Entries", + "identifiesControllerService": false, + "sensitive": false + } + }, + "style": {}, + "schedulingPeriod": "10 sec", + "schedulingStrategy": "TIMER_DRIVEN", + "executionNode": "ALL", + "penaltyDuration": "30 sec", + "yieldDuration": "1 sec", + "bulletinLevel": "WARN", + "runDurationMillis": 0, + "concurrentlySchedulableTaskCount": 1, + "autoTerminatedRelationships": [ + "original", + "failure" + ], + "scheduledState": "ENABLED", + "retryCount": 10, + "retriedRelationships": [], + "backoffMechanism": "PENALIZE_FLOWFILE", + "maxBackoffPeriod": "10 mins", + "componentType": "PROCESSOR", + "groupIdentifier": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c" + } + ], + "inputPorts": [ + { + "identifier": "4ed5fc86-81fd-32ca-8c2a-bebfc1d4e488", + "instanceIdentifier": "93df134f-3efd-3ecc-bc87-ed51bacc448d", + "name": "Input", + "comments": "", + "position": { + "x": -956.5070537739389, + "y": 857.4889699236401 + }, + "type": "INPUT_PORT", + "concurrentlySchedulableTaskCount": 1, + "scheduledState": "ENABLED", + "allowRemoteAccess": false, + "componentType": "INPUT_PORT", + "groupIdentifier": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c" + } + ], + "outputPorts": [ + { + "identifier": "860bd814-2d5b-3cc9-abfb-6d8e60eed975", + "instanceIdentifier": "54d2e01d-11cb-34fd-8cf8-9c3fd6772ab9", + "name": "Output", + "position": { + "x": -280.0, + "y": 1496.0 + }, + "type": "OUTPUT_PORT", + "concurrentlySchedulableTaskCount": 1, + "scheduledState": "ENABLED", + "allowRemoteAccess": false, + "componentType": "OUTPUT_PORT", + "groupIdentifier": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c" + } + ], + "connections": [ + { + "identifier": "8756035d-775a-3ef0-adb8-ea62e76a9075", + "instanceIdentifier": "1e0b3f74-ab69-346c-83fd-10f5683fade7", + "name": "", + "source": { + "id": "4ed5fc86-81fd-32ca-8c2a-bebfc1d4e488", + "type": "INPUT_PORT", + "groupId": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c", + "name": "Input", + "comments": "", + "instanceIdentifier": "93df134f-3efd-3ecc-bc87-ed51bacc448d" + }, + "destination": { + "id": "15135e8d-84e6-3a31-a83e-346f6abb382c", + "type": "PROCESSOR", + "groupId": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c", + "name": "MergeContent", + "comments": "", + "instanceIdentifier": "9bf2cd22-6a40-3b6a-9554-d1c46a3b312f" + }, + "labelIndex": 1, + "zIndex": 0, + "selectedRelationships": [ + "" + ], + "backPressureObjectThreshold": 10000, + "backPressureDataSizeThreshold": "1 GB", + "flowFileExpiration": "0 sec", + "prioritizers": [], + "bends": [], + "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", + "partitioningAttribute": "", + "loadBalanceCompression": "DO_NOT_COMPRESS", + "componentType": "CONNECTION", + "groupIdentifier": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c" + }, + { + "identifier": "08aef1ac-fd02-3113-88a7-94c5e9b0de79", + "instanceIdentifier": "ff5a02cd-7983-313c-b7e9-c0ff6ba77fcc", + "name": "", + "source": { + "id": "15135e8d-84e6-3a31-a83e-346f6abb382c", + "type": "PROCESSOR", + "groupId": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c", + "name": "MergeContent", + "comments": "", + "instanceIdentifier": "9bf2cd22-6a40-3b6a-9554-d1c46a3b312f" + }, + "destination": { + "id": "860bd814-2d5b-3cc9-abfb-6d8e60eed975", + "type": "OUTPUT_PORT", + "groupId": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c", + "name": "Output", + "instanceIdentifier": "54d2e01d-11cb-34fd-8cf8-9c3fd6772ab9" + }, + "labelIndex": 1, + "zIndex": 0, + "selectedRelationships": [ + "merged" + ], + "backPressureObjectThreshold": 10000, + "backPressureDataSizeThreshold": "1 GB", + "flowFileExpiration": "0 sec", + "prioritizers": [], + "bends": [], + "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", + "partitioningAttribute": "", + "loadBalanceCompression": "DO_NOT_COMPRESS", + "componentType": "CONNECTION", + "groupIdentifier": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c" + } + ], + "labels": [], + "funnels": [], + "controllerServices": [ + { + "identifier": "e562e6b9-735b-383b-8ee7-97a1bf49745d", + "instanceIdentifier": "12c6f662-e2d2-3efd-b79e-f95d3aff379d", + "name": "AvroRecordSetWriter", + "type": "org.apache.nifi.avro.AvroRecordSetWriter", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-record-serialization-services-nar", + "version": "1.20.0" + }, + "properties": { + "compression-format": "NONE", + "Schema Write Strategy": "avro-embedded", + "schema-branch": null, + "schema-name": "${schema.name}", + "cache-size": "1000", + "schema-registry": null, + "schema-access-strategy": "inherit-record-schema", + "schema-protocol-version": "1", + "schema-version": null, + "encoder-pool-size": "32", + "schema-cache": null, + "schema-text": "${avro.schema}" + }, + "propertyDescriptors": { + "compression-format": { + "name": "compression-format", + "displayName": "Compression Format", + "identifiesControllerService": false, + "sensitive": false + }, + "Schema Write Strategy": { + "name": "Schema Write Strategy", + "displayName": "Schema Write Strategy", + "identifiesControllerService": false, + "sensitive": false + }, + "schema-branch": { + "name": "schema-branch", + "displayName": "Schema Branch", + "identifiesControllerService": false, + "sensitive": false + }, + "schema-name": { + "name": "schema-name", + "displayName": "Schema Name", + "identifiesControllerService": false, + "sensitive": false + }, + "cache-size": { + "name": "cache-size", + "displayName": "Cache Size", + "identifiesControllerService": false, + "sensitive": false + }, + "schema-registry": { + "name": "schema-registry", + "displayName": "Schema Registry", + "identifiesControllerService": true, + "sensitive": false + }, + "schema-access-strategy": { + "name": "schema-access-strategy", + "displayName": "Schema Access Strategy", + "identifiesControllerService": false, + "sensitive": false + }, + "schema-protocol-version": { + "name": "schema-protocol-version", + "displayName": "Schema Protocol Version", + "identifiesControllerService": false, + "sensitive": false + }, + "schema-version": { + "name": "schema-version", + "displayName": "Schema Version", + "identifiesControllerService": false, + "sensitive": false + }, + "encoder-pool-size": { + "name": "encoder-pool-size", + "displayName": "Encoder Pool Size", + "identifiesControllerService": false, + "sensitive": false + }, + "schema-cache": { + "name": "schema-cache", + "displayName": "Schema Cache", + "identifiesControllerService": true, + "sensitive": false + }, + "schema-text": { + "name": "schema-text", + "displayName": "Schema Text", + "identifiesControllerService": false, + "sensitive": false + } + }, + "controllerServiceApis": [ + { + "type": "org.apache.nifi.serialization.RecordSetWriterFactory", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-services-api-nar", + "version": "1.20.0" + } + } + ], + "scheduledState": "DISABLED", + "bulletinLevel": "WARN", + "componentType": "CONTROLLER_SERVICE", + "groupIdentifier": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c" + }, + { + "identifier": "6fb8646c-3a99-3f25-9835-14300d09ece7", + "instanceIdentifier": "d193a651-7e73-3f87-95e2-e22764ecd0dd", + "name": "AvroReader", + "type": "org.apache.nifi.avro.AvroReader", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-record-serialization-services-nar", + "version": "1.20.0" + }, + "properties": { + "schema-branch": null, + "schema-name": "${schema.name}", + "cache-size": "1000", + "schema-registry": null, + "schema-access-strategy": "embedded-avro-schema", + "schema-version": null, + "schema-text": "${avro.schema}" + }, + "propertyDescriptors": { + "schema-branch": { + "name": "schema-branch", + "displayName": "Schema Branch", + "identifiesControllerService": false, + "sensitive": false + }, + "schema-name": { + "name": "schema-name", + "displayName": "Schema Name", + "identifiesControllerService": false, + "sensitive": false + }, + "cache-size": { + "name": "cache-size", + "displayName": "Cache Size", + "identifiesControllerService": false, + "sensitive": false + }, + "schema-registry": { + "name": "schema-registry", + "displayName": "Schema Registry", + "identifiesControllerService": true, + "sensitive": false + }, + "schema-access-strategy": { + "name": "schema-access-strategy", + "displayName": "Schema Access Strategy", + "identifiesControllerService": false, + "sensitive": false + }, + "schema-version": { + "name": "schema-version", + "displayName": "Schema Version", + "identifiesControllerService": false, + "sensitive": false + }, + "schema-text": { + "name": "schema-text", + "displayName": "Schema Text", + "identifiesControllerService": false, + "sensitive": false + } + }, + "controllerServiceApis": [ + { + "type": "org.apache.nifi.serialization.RecordReaderFactory", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-services-api-nar", + "version": "1.20.0" + } + } + ], + "scheduledState": "DISABLED", + "bulletinLevel": "WARN", + "componentType": "CONTROLLER_SERVICE", + "groupIdentifier": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c" + }, + { + "identifier": "3598a8e1-9ef0-3b7f-9c69-83466719eb43", + "instanceIdentifier": "ec76e2d3-dc0c-3cd1-b3bb-0a92c590e7b3", + "name": "StandardRestrictedSSLContextService", + "comments": "", + "type": "org.apache.nifi.ssl.StandardRestrictedSSLContextService", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-ssl-context-service-nar", + "version": "1.20.0" + }, + "properties": { + "Truststore Type": "PKCS12", + "SSL Protocol": "TLS", + "Keystore Type": null, + "Truststore Filename": "/opt/nifi/nifi-current/data/file_to_generate.p12", + "Keystore Filename": null + }, + "propertyDescriptors": { + "Truststore Type": { + "name": "Truststore Type", + "displayName": "Truststore Type", + "identifiesControllerService": false, + "sensitive": false + }, + "SSL Protocol": { + "name": "SSL Protocol", + "displayName": "TLS Protocol", + "identifiesControllerService": false, + "sensitive": false + }, + "Keystore Type": { + "name": "Keystore Type", + "displayName": "Keystore Type", + "identifiesControllerService": false, + "sensitive": false + }, + "Truststore Filename": { + "name": "Truststore Filename", + "displayName": "Truststore Filename", + "identifiesControllerService": false, + "sensitive": false, + "resourceDefinition": { + "cardinality": "SINGLE", + "resourceTypes": [ + "FILE" + ] + } + }, + "Keystore Password": { + "name": "Keystore Password", + "displayName": "Keystore Password", + "identifiesControllerService": false, + "sensitive": true + }, + "key-password": { + "name": "key-password", + "displayName": "Key Password", + "identifiesControllerService": false, + "sensitive": true + }, + "Truststore Password": { + "name": "Truststore Password", + "displayName": "Truststore Password", + "identifiesControllerService": false, + "sensitive": true + }, + "Keystore Filename": { + "name": "Keystore Filename", + "displayName": "Keystore Filename", + "identifiesControllerService": false, + "sensitive": false, + "resourceDefinition": { + "cardinality": "SINGLE", + "resourceTypes": [ + "FILE" + ] + } + } + }, + "controllerServiceApis": [ + { + "type": "org.apache.nifi.ssl.SSLContextService", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-services-api-nar", + "version": "1.20.0" + } + }, + { + "type": "org.apache.nifi.ssl.RestrictedSSLContextService", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-services-api-nar", + "version": "1.20.0" + } + } + ], + "scheduledState": "DISABLED", + "bulletinLevel": "WARN", + "componentType": "CONTROLLER_SERVICE", + "groupIdentifier": "582efa96-82a1-33aa-a6f4-d01b3e1ee92c" + } + ], + "variables": {}, + "defaultFlowFileExpiration": "0 sec", + "defaultBackPressureObjectThreshold": 10000, + "defaultBackPressureDataSizeThreshold": "1 GB", + "componentType": "PROCESS_GROUP", + "flowFileConcurrency": "UNBOUNDED", + "flowFileOutboundPolicy": "STREAM_WHEN_AVAILABLE" + }, + "externalControllerServices": {}, + "parameterContexts": {}, + "flowEncodingVersion": "1.0", + "parameterProviders": {}, + "latest": false +} \ No newline at end of file diff --git a/cli/template/InvokeOSCAR.json b/cli/template/Destinations/InvokeOSCAR.json similarity index 81% rename from cli/template/InvokeOSCAR.json rename to cli/template/Destinations/InvokeOSCAR.json index 18dc9800..79726d2a 100644 --- a/cli/template/InvokeOSCAR.json +++ b/cli/template/Destinations/InvokeOSCAR.json @@ -383,7 +383,109 @@ ], "labels": [], "funnels": [], - "controllerServices": [], + "controllerServices": [{ + "identifier": "3598a8e1-9ef0-3b7f-9c69-83466719eb43", + "instanceIdentifier": "d5058dde-987d-3481-bd03-d5e1bf0dcea3", + "name": "StandardRestrictedSSLContextService", + "comments": "", + "type": "org.apache.nifi.ssl.StandardRestrictedSSLContextService", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-ssl-context-service-nar", + "version": "1.20.0" + }, + "properties": { + "Truststore Type": "", + "SSL Protocol": "", + "Keystore Type": null, + "Truststore Filename": "", + "Keystore Filename": null + }, + "propertyDescriptors": { + "Truststore Type": { + "name": "Truststore Type", + "displayName": "Truststore Type", + "identifiesControllerService": false, + "sensitive": false + }, + "SSL Protocol": { + "name": "SSL Protocol", + "displayName": "TLS Protocol", + "identifiesControllerService": false, + "sensitive": false + }, + "Keystore Type": { + "name": "Keystore Type", + "displayName": "Keystore Type", + "identifiesControllerService": false, + "sensitive": false + }, + "Truststore Filename": { + "name": "Truststore Filename", + "displayName": "Truststore Filename", + "identifiesControllerService": false, + "sensitive": false, + "resourceDefinition": { + "cardinality": "SINGLE", + "resourceTypes": [ + "FILE" + ] + } + }, + "Keystore Password": { + "name": "Keystore Password", + "displayName": "Keystore Password", + "identifiesControllerService": false, + "sensitive": true + }, + "key-password": { + "name": "key-password", + "displayName": "Key Password", + "identifiesControllerService": false, + "sensitive": true + }, + "Truststore Password": { + "name": "Truststore Password", + "displayName": "Truststore Password", + "identifiesControllerService": false, + "sensitive": true + }, + "Keystore Filename": { + "name": "Keystore Filename", + "displayName": "Keystore Filename", + "identifiesControllerService": false, + "sensitive": false, + "resourceDefinition": { + "cardinality": "SINGLE", + "resourceTypes": [ + "FILE" + ] + } + } + }, + "controllerServiceApis": [ + { + "type": "org.apache.nifi.ssl.SSLContextService", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-services-api-nar", + "version": "1.20.0" + } + }, + { + "type": "org.apache.nifi.ssl.RestrictedSSLContextService", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-services-api-nar", + "version": "1.20.0" + } + } + ], + "scheduledState": "DISABLED", + "bulletinLevel": "WARN", + "componentType": "CONTROLLER_SERVICE", + "groupIdentifier": "0d4c118b-55b4-3b4f-acbf-5ba1e91af113" + }], "variables": { "endpoint": "oscarEndpoint", "service": "serviceName", diff --git a/cli/template/Destinations/PutS3.json b/cli/template/Destinations/PutS3.json new file mode 100644 index 00000000..05cc0887 --- /dev/null +++ b/cli/template/Destinations/PutS3.json @@ -0,0 +1,425 @@ +{ + "flowContents": { + "identifier": "d66817a7-53de-3a29-bf88-76bc9203fa7c", + "instanceIdentifier": "e7eb8056-018f-1000-ffff-ffffa50784ef", + "name": "PutS3", + "comments": "", + "position": { + "x": -1016.0, + "y": -160.0 + }, + "processGroups": [], + "remoteProcessGroups": [], + "processors": [ + { + "identifier": "5e48b0de-83e6-3632-80e4-359525da1ed6", + "instanceIdentifier": "2fe51a81-963c-3d25-9ca8-332097fc0be6", + "name": "PutS3Object", + "comments": "", + "position": { + "x": 512.0, + "y": -176.0 + }, + "type": "org.apache.nifi.processors.aws.s3.PutS3Object", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-aws-nar", + "version": "1.20.0" + }, + "properties": { + "Proxy Host": null, + "FullControl User List": "${s3.permissions.full.users}", + "Owner": "${s3.owner}", + "proxy-configuration-service": null, + "Cache Control": null, + "s3-object-remove-tags-prefix": "false", + "Endpoint Override URL": null, + "Multipart Upload Max Age Threshold": "7 days", + "custom-signer-class-name": null, + "canned-acl": "${s3.permissions.cannedacl}", + "custom-signer-module-location": null, + "Signer Override": "Default Signature", + "Content Type": null, + "Write ACL User List": "${s3.permissions.writeacl.users}", + "server-side-encryption": "None", + "Read ACL User List": "${s3.permissions.readacl.users}", + "encryption-service": null, + "Content Disposition": null, + "Storage Class": "Standard", + "Multipart Part Size": "5 GB", + "use-chunked-encoding": "true", + "Object Key": "${filename}", + "AWS Credentials Provider service": null, + "Multipart Threshold": "5 GB", + "s3-object-tags-prefix": null, + "SSL Context Service": null, + "Bucket": null, + "Multipart Upload AgeOff Interval": "60 min", + "use-path-style-access": "false", + "Write Permission User List": "${s3.permissions.write.users}", + "Communications Timeout": "30 secs", + "Credentials File": null, + "Region": "us-west-2", + "Read Permission User List": "${s3.permissions.read.users}", + "Expiration Time Rule": null, + "proxy-user-name": null, + "Proxy Host Port": null, + "s3-temporary-directory-multipart": "${java.io.tmpdir}" + }, + "propertyDescriptors": { + "Proxy Host": { + "name": "Proxy Host", + "displayName": "Proxy Host", + "identifiesControllerService": false, + "sensitive": false + }, + "FullControl User List": { + "name": "FullControl User List", + "displayName": "FullControl User List", + "identifiesControllerService": false, + "sensitive": false + }, + "Owner": { + "name": "Owner", + "displayName": "Owner", + "identifiesControllerService": false, + "sensitive": false + }, + "Access Key": { + "name": "Access Key", + "displayName": "Access Key ID", + "identifiesControllerService": false, + "sensitive": true + }, + "proxy-configuration-service": { + "name": "proxy-configuration-service", + "displayName": "Proxy Configuration Service", + "identifiesControllerService": true, + "sensitive": false + }, + "Cache Control": { + "name": "Cache Control", + "displayName": "Cache Control", + "identifiesControllerService": false, + "sensitive": false + }, + "s3-object-remove-tags-prefix": { + "name": "s3-object-remove-tags-prefix", + "displayName": "Remove Tag Prefix", + "identifiesControllerService": false, + "sensitive": false + }, + "Endpoint Override URL": { + "name": "Endpoint Override URL", + "displayName": "Endpoint Override URL", + "identifiesControllerService": false, + "sensitive": false + }, + "Multipart Upload Max Age Threshold": { + "name": "Multipart Upload Max Age Threshold", + "displayName": "Multipart Upload Max Age Threshold", + "identifiesControllerService": false, + "sensitive": false + }, + "custom-signer-class-name": { + "name": "custom-signer-class-name", + "displayName": "Custom Signer Class Name", + "identifiesControllerService": false, + "sensitive": false + }, + "canned-acl": { + "name": "canned-acl", + "displayName": "Canned ACL", + "identifiesControllerService": false, + "sensitive": false + }, + "custom-signer-module-location": { + "name": "custom-signer-module-location", + "displayName": "Custom Signer Module Location", + "identifiesControllerService": false, + "sensitive": false, + "resourceDefinition": { + "cardinality": "MULTIPLE", + "resourceTypes": [ + "FILE", + "DIRECTORY" + ] + } + }, + "Signer Override": { + "name": "Signer Override", + "displayName": "Signer Override", + "identifiesControllerService": false, + "sensitive": false + }, + "proxy-user-password": { + "name": "proxy-user-password", + "displayName": "Proxy Password", + "identifiesControllerService": false, + "sensitive": true + }, + "Content Type": { + "name": "Content Type", + "displayName": "Content Type", + "identifiesControllerService": false, + "sensitive": false + }, + "Secret Key": { + "name": "Secret Key", + "displayName": "Secret Access Key", + "identifiesControllerService": false, + "sensitive": true + }, + "Write ACL User List": { + "name": "Write ACL User List", + "displayName": "Write ACL User List", + "identifiesControllerService": false, + "sensitive": false + }, + "server-side-encryption": { + "name": "server-side-encryption", + "displayName": "Server Side Encryption", + "identifiesControllerService": false, + "sensitive": false + }, + "Read ACL User List": { + "name": "Read ACL User List", + "displayName": "Read ACL User List", + "identifiesControllerService": false, + "sensitive": false + }, + "encryption-service": { + "name": "encryption-service", + "displayName": "Encryption Service", + "identifiesControllerService": true, + "sensitive": false + }, + "Content Disposition": { + "name": "Content Disposition", + "displayName": "Content Disposition", + "identifiesControllerService": false, + "sensitive": false + }, + "Storage Class": { + "name": "Storage Class", + "displayName": "Storage Class", + "identifiesControllerService": false, + "sensitive": false + }, + "Multipart Part Size": { + "name": "Multipart Part Size", + "displayName": "Multipart Part Size", + "identifiesControllerService": false, + "sensitive": false + }, + "use-chunked-encoding": { + "name": "use-chunked-encoding", + "displayName": "Use Chunked Encoding", + "identifiesControllerService": false, + "sensitive": false + }, + "Object Key": { + "name": "Object Key", + "displayName": "Object Key", + "identifiesControllerService": false, + "sensitive": false + }, + "AWS Credentials Provider service": { + "name": "AWS Credentials Provider service", + "displayName": "AWS Credentials Provider Service", + "identifiesControllerService": true, + "sensitive": false + }, + "Multipart Threshold": { + "name": "Multipart Threshold", + "displayName": "Multipart Threshold", + "identifiesControllerService": false, + "sensitive": false + }, + "s3-object-tags-prefix": { + "name": "s3-object-tags-prefix", + "displayName": "Object Tags Prefix", + "identifiesControllerService": false, + "sensitive": false + }, + "SSL Context Service": { + "name": "SSL Context Service", + "displayName": "SSL Context Service", + "identifiesControllerService": true, + "sensitive": false + }, + "Bucket": { + "name": "Bucket", + "displayName": "Bucket", + "identifiesControllerService": false, + "sensitive": false + }, + "Multipart Upload AgeOff Interval": { + "name": "Multipart Upload AgeOff Interval", + "displayName": "Multipart Upload AgeOff Interval", + "identifiesControllerService": false, + "sensitive": false + }, + "use-path-style-access": { + "name": "use-path-style-access", + "displayName": "Use Path Style Access", + "identifiesControllerService": false, + "sensitive": false + }, + "Write Permission User List": { + "name": "Write Permission User List", + "displayName": "Write Permission User List", + "identifiesControllerService": false, + "sensitive": false + }, + "Communications Timeout": { + "name": "Communications Timeout", + "displayName": "Communications Timeout", + "identifiesControllerService": false, + "sensitive": false + }, + "Credentials File": { + "name": "Credentials File", + "displayName": "Credentials File", + "identifiesControllerService": false, + "sensitive": false, + "resourceDefinition": { + "cardinality": "SINGLE", + "resourceTypes": [ + "FILE" + ] + } + }, + "Region": { + "name": "Region", + "displayName": "Region", + "identifiesControllerService": false, + "sensitive": false + }, + "Read Permission User List": { + "name": "Read Permission User List", + "displayName": "Read Permission User List", + "identifiesControllerService": false, + "sensitive": false + }, + "Expiration Time Rule": { + "name": "Expiration Time Rule", + "displayName": "Expiration Time Rule", + "identifiesControllerService": false, + "sensitive": false + }, + "proxy-user-name": { + "name": "proxy-user-name", + "displayName": "Proxy Username", + "identifiesControllerService": false, + "sensitive": false + }, + "Proxy Host Port": { + "name": "Proxy Host Port", + "displayName": "Proxy Host Port", + "identifiesControllerService": false, + "sensitive": false + }, + "s3-temporary-directory-multipart": { + "name": "s3-temporary-directory-multipart", + "displayName": "Temporary Directory Multipart State", + "identifiesControllerService": false, + "sensitive": false + } + }, + "style": {}, + "schedulingPeriod": "0 sec", + "schedulingStrategy": "TIMER_DRIVEN", + "executionNode": "ALL", + "penaltyDuration": "30 sec", + "yieldDuration": "1 sec", + "bulletinLevel": "WARN", + "runDurationMillis": 0, + "concurrentlySchedulableTaskCount": 1, + "autoTerminatedRelationships": [ + "success", + "failure" + ], + "scheduledState": "ENABLED", + "retryCount": 10, + "retriedRelationships": [], + "backoffMechanism": "PENALIZE_FLOWFILE", + "maxBackoffPeriod": "10 mins", + "componentType": "PROCESSOR", + "groupIdentifier": "d66817a7-53de-3a29-bf88-76bc9203fa7c" + } + ], + "inputPorts": [ + { + "identifier": "c5eeb12c-bc3b-3101-bd8a-a5ed6c5e224a", + "instanceIdentifier": "ea1b3f93-6dd8-107a-b6c6-8887a58fa6af", + "name": "Input", + "comments": "", + "position": { + "x": -392.0, + "y": 192.0 + }, + "type": "INPUT_PORT", + "concurrentlySchedulableTaskCount": 1, + "scheduledState": "ENABLED", + "allowRemoteAccess": false, + "componentType": "INPUT_PORT", + "groupIdentifier": "d66817a7-53de-3a29-bf88-76bc9203fa7c" + } + ], + "outputPorts": [], + "connections": [ + { + "identifier": "567207c8-14b2-3d8b-aca6-43ba50f6c143", + "instanceIdentifier": "ea1b3f9f-6dd8-107a-0000-000017173d0f", + "name": "", + "source": { + "id": "c5eeb12c-bc3b-3101-bd8a-a5ed6c5e224a", + "type": "INPUT_PORT", + "groupId": "d66817a7-53de-3a29-bf88-76bc9203fa7c", + "name": "Input", + "comments": "", + "instanceIdentifier": "ea1b3f93-6dd8-107a-b6c6-8887a58fa6af" + }, + "destination": { + "id": "5e48b0de-83e6-3632-80e4-359525da1ed6", + "type": "PROCESSOR", + "groupId": "d66817a7-53de-3a29-bf88-76bc9203fa7c", + "name": "PutS3Object", + "comments": "", + "instanceIdentifier": "2fe51a81-963c-3d25-9ca8-332097fc0be6" + }, + "labelIndex": 1, + "zIndex": 0, + "selectedRelationships": [ + "" + ], + "backPressureObjectThreshold": 10000, + "backPressureDataSizeThreshold": "1 GB", + "flowFileExpiration": "0 sec", + "prioritizers": [], + "bends": [], + "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", + "partitioningAttribute": "", + "loadBalanceCompression": "DO_NOT_COMPRESS", + "componentType": "CONNECTION", + "groupIdentifier": "d66817a7-53de-3a29-bf88-76bc9203fa7c" + } + ], + "labels": [], + "funnels": [], + "controllerServices": [], + "variables": {}, + "defaultFlowFileExpiration": "0 sec", + "defaultBackPressureObjectThreshold": 10000, + "defaultBackPressureDataSizeThreshold": "1 GB", + "componentType": "PROCESS_GROUP", + "flowFileConcurrency": "UNBOUNDED", + "flowFileOutboundPolicy": "STREAM_WHEN_AVAILABLE" + }, + "externalControllerServices": {}, + "parameterContexts": {}, + "flowEncodingVersion": "1.0", + "parameterProviders": {}, + "latest": false +} \ No newline at end of file diff --git a/cli/template/Kafka.json b/cli/template/Sources/Kafka.json similarity index 78% rename from cli/template/Kafka.json rename to cli/template/Sources/Kafka.json index 4f4bed92..27bdd665 100644 --- a/cli/template/Kafka.json +++ b/cli/template/Sources/Kafka.json @@ -1,19 +1,19 @@ { "flowContents": { - "identifier": "d6db9e57-c6f7-3f22-89c8-500a9113d1d0", - "instanceIdentifier": "8bb068ef-a5fe-1674-0000-0000101002d6", + "identifier": "0d4c118b-55b4-3b4f-acbf-5ba1e91af113", + "instanceIdentifier": "c314d934-018f-1000-0000-000065538b89", "name": "Kafka", "comments": "", "position": { - "x": -292.80182860376476, - "y": -279.00025521335857 + "x": -150.0, + "y": -150.0 }, "processGroups": [], "remoteProcessGroups": [], "processors": [ { "identifier": "4c5bc270-3928-3b09-97f7-3b69e9bade54", - "instanceIdentifier": "e2f95b7f-0572-38b7-8613-37a44e5174b2", + "instanceIdentifier": "d03453f8-e45b-3b02-9f30-ad51590b2e07", "name": "ConsumeKafka_2_6", "comments": "", "position": { @@ -41,7 +41,7 @@ "kerberos-user-service": null, "message-header-encoding": "UTF-8", "message-demarcator": null, - "sasl.username": "", + "sasl.username": "user", "max.poll.records": "10000", "aws.profile.name": null, "security.protocol": "SASL_SSL", @@ -240,60 +240,14 @@ "backoffMechanism": "PENALIZE_FLOWFILE", "maxBackoffPeriod": "10 mins", "componentType": "PROCESSOR", - "groupIdentifier": "d6db9e57-c6f7-3f22-89c8-500a9113d1d0" - }, - { - "identifier": "2c6ce5f8-8b93-316f-aa37-64bdd6be5716", - "instanceIdentifier": "15fb5fb5-cd8b-394c-bb87-a5caaf0f4786", - "name": "Base64EncodeContent", - "comments": "", - "position": { - "x": -288.0, - "y": 1192.0 - }, - "type": "org.apache.nifi.processors.standard.Base64EncodeContent", - "bundle": { - "group": "org.apache.nifi", - "artifact": "nifi-standard-nar", - "version": "1.20.0" - }, - "properties": { - "Mode": "Encode" - }, - "propertyDescriptors": { - "Mode": { - "name": "Mode", - "displayName": "Mode", - "identifiesControllerService": false, - "sensitive": false - } - }, - "style": {}, - "schedulingPeriod": "0 sec", - "schedulingStrategy": "TIMER_DRIVEN", - "executionNode": "ALL", - "penaltyDuration": "30 sec", - "yieldDuration": "1 sec", - "bulletinLevel": "WARN", - "runDurationMillis": 0, - "concurrentlySchedulableTaskCount": 1, - "autoTerminatedRelationships": [ - "failure" - ], - "scheduledState": "ENABLED", - "retryCount": 10, - "retriedRelationships": [], - "backoffMechanism": "PENALIZE_FLOWFILE", - "maxBackoffPeriod": "10 mins", - "componentType": "PROCESSOR", - "groupIdentifier": "d6db9e57-c6f7-3f22-89c8-500a9113d1d0" + "groupIdentifier": "0d4c118b-55b4-3b4f-acbf-5ba1e91af113" } ], "inputPorts": [], "outputPorts": [ { "identifier": "860bd814-2d5b-3cc9-abfb-6d8e60eed975", - "instanceIdentifier": "8cb83eb7-b95a-3f5b-9d2e-bc837aee779c", + "instanceIdentifier": "ccb304ef-6a0c-3c2d-b193-755d2883adaa", "name": "Output", "position": { "x": -387.3546332690239, @@ -304,64 +258,28 @@ "scheduledState": "ENABLED", "allowRemoteAccess": false, "componentType": "OUTPUT_PORT", - "groupIdentifier": "d6db9e57-c6f7-3f22-89c8-500a9113d1d0" + "groupIdentifier": "0d4c118b-55b4-3b4f-acbf-5ba1e91af113" } ], "connections": [ { - "identifier": "64446fab-214b-3f65-88e7-57749ac9d6dc", - "instanceIdentifier": "ac9dcac1-bf45-3f7b-ae50-c7b1e059db97", + "identifier": "85615e05-ac60-3343-bf31-34d6681df4bb", + "instanceIdentifier": "c3155fed-018f-1000-0000-000046c4acaf", "name": "", "source": { "id": "4c5bc270-3928-3b09-97f7-3b69e9bade54", "type": "PROCESSOR", - "groupId": "d6db9e57-c6f7-3f22-89c8-500a9113d1d0", + "groupId": "0d4c118b-55b4-3b4f-acbf-5ba1e91af113", "name": "ConsumeKafka_2_6", "comments": "", - "instanceIdentifier": "e2f95b7f-0572-38b7-8613-37a44e5174b2" - }, - "destination": { - "id": "2c6ce5f8-8b93-316f-aa37-64bdd6be5716", - "type": "PROCESSOR", - "groupId": "d6db9e57-c6f7-3f22-89c8-500a9113d1d0", - "name": "Base64EncodeContent", - "comments": "", - "instanceIdentifier": "15fb5fb5-cd8b-394c-bb87-a5caaf0f4786" - }, - "labelIndex": 1, - "zIndex": 0, - "selectedRelationships": [ - "success" - ], - "backPressureObjectThreshold": 10000, - "backPressureDataSizeThreshold": "1 GB", - "flowFileExpiration": "0 sec", - "prioritizers": [], - "bends": [], - "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", - "partitioningAttribute": "", - "loadBalanceCompression": "DO_NOT_COMPRESS", - "componentType": "CONNECTION", - "groupIdentifier": "d6db9e57-c6f7-3f22-89c8-500a9113d1d0" - }, - { - "identifier": "4944dff6-e57c-3ae6-9d74-0b1935c28aab", - "instanceIdentifier": "9ad932a7-546b-3fa0-a0fc-fdf7b3399bd9", - "name": "", - "source": { - "id": "2c6ce5f8-8b93-316f-aa37-64bdd6be5716", - "type": "PROCESSOR", - "groupId": "d6db9e57-c6f7-3f22-89c8-500a9113d1d0", - "name": "Base64EncodeContent", - "comments": "", - "instanceIdentifier": "15fb5fb5-cd8b-394c-bb87-a5caaf0f4786" + "instanceIdentifier": "d03453f8-e45b-3b02-9f30-ad51590b2e07" }, "destination": { "id": "860bd814-2d5b-3cc9-abfb-6d8e60eed975", "type": "OUTPUT_PORT", - "groupId": "d6db9e57-c6f7-3f22-89c8-500a9113d1d0", + "groupId": "0d4c118b-55b4-3b4f-acbf-5ba1e91af113", "name": "Output", - "instanceIdentifier": "8cb83eb7-b95a-3f5b-9d2e-bc837aee779c" + "instanceIdentifier": "ccb304ef-6a0c-3c2d-b193-755d2883adaa" }, "labelIndex": 1, "zIndex": 0, @@ -377,7 +295,7 @@ "partitioningAttribute": "", "loadBalanceCompression": "DO_NOT_COMPRESS", "componentType": "CONNECTION", - "groupIdentifier": "d6db9e57-c6f7-3f22-89c8-500a9113d1d0" + "groupIdentifier": "0d4c118b-55b4-3b4f-acbf-5ba1e91af113" } ], "labels": [], @@ -385,7 +303,7 @@ "controllerServices": [ { "identifier": "3598a8e1-9ef0-3b7f-9c69-83466719eb43", - "instanceIdentifier": "8bb04183-a5fe-1674-0000-00004c347b53", + "instanceIdentifier": "d5058dde-987d-3481-bd03-d5e1bf0dcea3", "name": "StandardRestrictedSSLContextService", "comments": "", "type": "org.apache.nifi.ssl.StandardRestrictedSSLContextService", @@ -484,13 +402,13 @@ "scheduledState": "DISABLED", "bulletinLevel": "WARN", "componentType": "CONTROLLER_SERVICE", - "groupIdentifier": "8bb068ef-a5fe-1674-0000-0000101002d6" + "groupIdentifier": "0d4c118b-55b4-3b4f-acbf-5ba1e91af113" } ], "variables": { "group_id": "", - "bootstrap_servers":"", - "topic":"" + "topic": "", + "bootstrap_servers": "" }, "defaultFlowFileExpiration": "0 sec", "defaultBackPressureObjectThreshold": 10000, diff --git a/cli/template/SQS_recive.json b/cli/template/Sources/SQS_recive.json similarity index 100% rename from cli/template/SQS_recive.json rename to cli/template/Sources/SQS_recive.json diff --git a/cli/template/dcache.json b/cli/template/Sources/dcache.json similarity index 100% rename from cli/template/dcache.json rename to cli/template/Sources/dcache.json diff --git a/docpage/docs/02.-Inputs/Kafka.md b/docpage/docs/02.-Inputs/Kafka.md deleted file mode 100644 index fe5c8ee2..00000000 --- a/docpage/docs/02.-Inputs/Kafka.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -sidebar_position: 3 ---- -# Kafka - -Kafka is the ProcessGroup that consumes a Kafka topic, is comprised of: - - An identifier name of the process. It must be unique. - - Kafka endpoint, just the IP and the port with any protocol as `:` - - The topic name which is going to be consumed. Required. - - The group identifier indicating the consumer group. Required. - - In case the Kafka topics are separated by `key:value` set the argument `separate_by_key` as true and select the demarcator with `message_demarcator`: - - separate_by_key - - message_demarcator - - The kafka recipe in [IM](https://www.grycap.upv.es/im/index.php) support the SASL_SSL security protocol. So, the user and password of the SASL_SSL security protocol must be set: - - sasl_username: `user` - - sasl_password: `password` - - -The connection between NiFi and Kafka employs SSL context,the SSL Protocol used by default is TLS, and the Truststore Type is PKCS12. SSL context only needs the Truststore filename and Truststore password. The Truststore file must be under "/opt/nifi/nifi-current/data/" directory. - - -``` -Kafka: -- name: kafka - bootstrap_servers: : - topic: test - group_id: "1" - sasl_username: user - sasl_password: pass - ssl_context: - Truststore_Filename: "file_of_pkcs12.p12" - Truststore_Password: "the-password" -``` \ No newline at end of file diff --git a/docpage/docs/02.-Inputs/S3.md b/docpage/docs/02.-Inputs/S3.md deleted file mode 100644 index 2d3b422f..00000000 --- a/docpage/docs/02.-Inputs/S3.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_position: 4 ---- -# S3 - -S3 is a ProcessGroup that gets input data from an AWS S3 bucket. Creating a ProcessGroup in Nifi and a SQS queue will be the same as [SQS](02.4.-SQS). Indeed, an event notification from the S3 bucket to SQS will be created. - - An identifier name of the process. It must be unique. - - The region where the SQS is going to be deployed. AWS_DEFAULT_REGION - - The bucket name. The queue name is not necessary. DCNiOS creates an SQS with this pattern name `-events`. - -Here is an example of the configuration file. Check the documentation of [AWS credentials](/dcnios/docs/AWS) to define the Access Key and Secret Key. - - -> :warning: **Event Notification in the S3 section needs to be removed manually**: Be very careful here! - -``` -S3: - - name: S3 - AWS_DEFAULT_REGION: us-east-1 - AWS_S3_BUCKET: -``` \ No newline at end of file diff --git a/docpage/docs/02.-Inputs/SQS.md b/docpage/docs/02.-Inputs/SQS.md deleted file mode 100644 index 48ed0953..00000000 --- a/docpage/docs/02.-Inputs/SQS.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 5 ---- -# SQS - -SQS is the ProcessGroup that consumes an AWS SQS queue , is comprised of: -The main purpose is to get as input the data from a SQS. So, this section will create an SQS in AWS and a processGroup in the Nifi cluster. - - An identifier name of the process. It must be unique. - - The region where the SQS is going to be deployed. AWS_DEFAULT_REGION - - The queue name. - -Here is an example of the configuration file. Check the documentation of [AWS credentials](/dcnios/docs/AWS) to define the Access Key and Secret Key. - -``` -SQS: - - name: sqs - AWS_DEFAULT_REGION: - queue_name: -``` \ No newline at end of file diff --git a/docpage/docs/02.-Inputs/dcache.md b/docpage/docs/02.-Inputs/dcache.md deleted file mode 100644 index 06fb8b0e..00000000 --- a/docpage/docs/02.-Inputs/dcache.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -sidebar_position: 2 ---- -# dCache - -dCache is the ProcessGroup that keep listen into dCache instance, is comprised of: -- An identifier name of the process. It must be unique. -- Endpoint, user and password -- Folder where active listening -- Statefile is the name of the file that will store the state. Please do not create it with the name `dcache`. - -This ProcessGroup is composed of: -- ExecuteProcess -- GetFile - - -This ProcessGroup only works on the image `ghcr.io/grycap/nifi-sse:latest` - - -``` -dcache: - - name: dcache - endpoint: - user: - password: - folder: - statefile: - components: - - name: GetFile - seconds: 2 -``` - diff --git a/docpage/docs/02.-Inputs/generic.md b/docpage/docs/02.-Inputs/generic.md deleted file mode 100644 index 7518d91d..00000000 --- a/docpage/docs/02.-Inputs/generic.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_position: 1 ---- -# Generic - -Generic section creates a ProcessGroup by given a ProcessGroup file, is comprised of: -- An identifier name of the process. It must be unique. -- The path of your ProcessGroup (.json file) -- The variables that compose the workflow (as a list). - -``` -generic: - - name: - file: - variables: - key: value - key1: value1 - components: - - name: InvokeOSCAR - seconds: 5 -``` \ No newline at end of file diff --git a/docpage/docs/03.- Sources/Kafka.md b/docpage/docs/03.- Sources/Kafka.md new file mode 100644 index 00000000..fe6e702f --- /dev/null +++ b/docpage/docs/03.- Sources/Kafka.md @@ -0,0 +1,29 @@ +--- +sidebar_position: 2 +--- +# Kafka + + + +The Kafka Source allows us to consume a Kafka topic. It requires this information: +- An identifier name of the process. It must be unique. Required. +- Kafka bootstrap_servers, just the IP and the port with any protocol as `:`. Required. +- The topic name that is going to be consumed. Required. +- The group identifier indicates the consumer group. Required. +- [IM](https://www.grycap.upv.es/im/index.php) serve a recipe that supports the SASL_SSL security protocol. So, the user `sasl_username` and password `sasl_password` must be set. These parameters are set at Kafka deployment time. Required. +- In case the topics you are consuming follow a `key:value` pattern set the argument `separate_by_key` as true and select the demarcator with `message_demarcator` + +Also, it is necessary an SSL connection between NiFi and Kafka. This connection is made by a PKCS12 certificate and the password of the certificate. + +``` +Kafka: +- name: kafka + bootstrap_servers: : + topic: + group_id: "" + sasl_username: + sasl_password: + ssl_context: + Truststore_Filename: + Truststore_Password: +``` diff --git a/docpage/docs/03.- Sources/S3.md b/docpage/docs/03.- Sources/S3.md new file mode 100644 index 00000000..6abd81dd --- /dev/null +++ b/docpage/docs/03.- Sources/S3.md @@ -0,0 +1,22 @@ +--- +sidebar_position: 3 +--- +# S3 + +The S3 Source captures an ObjectCreated event from an AWS S3 bucket. DCNiOS creates S3 bucket event redirections to SQS queue. Then, Apache NiFi captures the event and introduces it to the dataflow. The whole pipeline is created using DCNiOS.But, SQS queue is deleted with DCNiOS, but the Event Notification in the S3 section needs to be removed manually. + +The S3 Source requires: +- An identifier name of the process. It must be unique. Required. +- The region where the SQS is going to be deployed. AWS_DEFAULT_REGION. Required. +- The bucket name. The queue name is not necessary. DCNiOS creates an SQS with this pattern name `-events`. Required. + +Here is an example of the configuration file. Check the documentation of [AWS credentials](/dcnios/docs/AWS) to define the Access Key and Secret Key. + +``` +GetS3: + - name: S3 + AWS_DEFAULT_REGION: us-east-1 + AWS_S3_BUCKET: +``` + + diff --git a/docpage/docs/03.- Sources/SQS.md b/docpage/docs/03.- Sources/SQS.md new file mode 100644 index 00000000..c8538c0c --- /dev/null +++ b/docpage/docs/03.- Sources/SQS.md @@ -0,0 +1,21 @@ +--- +sidebar_position: 4 +--- +# SQS + + +SQS Source consumes from an AWS SQS queue. It creates an SQS in creation time, requiring: +- An identifier name of the process. It must be unique. Required. +- The region where the SQS is going to be deployed. AWS_DEFAULT_REGION Required. +- The queue name. Required. + + +Here is an example of the configuration file. Check the documentation of [AWS credentials](/dcnios/docs/AWS) to define the Access Key and Secret Key. + + +``` +SQS: + - name: sqs + AWS_DEFAULT_REGION: + queue_name: +``` diff --git a/docpage/docs/03.- Sources/dcache.md b/docpage/docs/03.- Sources/dcache.md new file mode 100644 index 00000000..6af32a4a --- /dev/null +++ b/docpage/docs/03.- Sources/dcache.md @@ -0,0 +1,27 @@ +--- +sidebar_position: 1 +--- +# dCache + +dCache is a Source that listens into a dCache instance. The following values must be provided: +- An identifier name of the process. It must be unique. Required. +- Endpoint, user, and password of a dCache instance. Required. +- Folder of dCache where keeps an active listening.Required. +- Statefile is the name of the file that will store the state. `dcache` value is not recommended. It creates misbehavior. Required. + +The dCache Source only works when the NiFi cluster is deployed with the image `ghcr.io/grycap/nifi-sse:latest`, is composed of: +- ExecuteProcess +- GetFile + +``` +dCache: + - name: dcache + endpoint: + user: + password: + folder: + statefile: + components: + - name: GetFile + seconds: 2 +``` diff --git a/docpage/docs/03.- Sources/generic.md b/docpage/docs/03.- Sources/generic.md new file mode 100644 index 00000000..63ac01f4 --- /dev/null +++ b/docpage/docs/03.- Sources/generic.md @@ -0,0 +1,27 @@ +--- +sidebar_position: 5 +--- +# Generic + +The generic section creates a custom workflow by giving a ProcessGroup file (.json). The purpose of this component could be Source, Destination, Alteration, or even a data flow complete. The behavior is specific by the creator of the file '.json' + +which is comprised of: +- An identifier name of the process. It must be unique. Required. +- The path of your ProcessGroup (.json file).Required. +- The variables that compose the workflow (as a list). + + +``` +generic: + - name: + file: + variables: + key1: value1 + key2: value2 + components: + - name: InvokeOSCAR + seconds: 5 +``` + + + diff --git a/docpage/docs/03.-Outputs/OSCAR.md b/docpage/docs/03.-Outputs/OSCAR.md deleted file mode 100644 index 2056c2cd..00000000 --- a/docpage/docs/03.-Outputs/OSCAR.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -sidebar_position: 1 ---- -# OSCAR - -The goal of this ProcessGroup is to invoke OSCAR services asynchronously: - - An identifier name of the process. It must be unique. - - Endpoint - - Service in OSCAR - - Token or user/password. The user/password will be first if both authentication processes are defined. Do not edit the OSCAR services. - - - -This ProcessGroup is composed of: -- InvokeOSCAR - - -``` -- name: edgan3 - endpoint: - service: - token: - user: - password: -``` \ No newline at end of file diff --git a/docpage/docs/04.- Destinations/OSCAR.md b/docpage/docs/04.- Destinations/OSCAR.md new file mode 100644 index 00000000..782599ad --- /dev/null +++ b/docpage/docs/04.- Destinations/OSCAR.md @@ -0,0 +1,26 @@ +--- +sidebar_position: 1 +--- +# OSCAR + + +The OSCAR Destination invokes an OSCAR service asynchronously: +- An identifier name of the process. It must be unique. Required. +- Endpoint. Required. +- Service in OSCAR. Required. +- Token or user/password. The user/password will be first if both authentication processes are defined. Do not edit the OSCAR services. Required. + + +Destination is composed of this component: +- InvokeOSCAR + + + +``` +- name: edgan3 + endpoint: + service: + token: + user: + password: +``` diff --git a/docpage/docs/AWS.md b/docpage/docs/AWS.md index 20537946..d3e551a2 100644 --- a/docpage/docs/AWS.md +++ b/docpage/docs/AWS.md @@ -1,23 +1,26 @@ --- -sidebar_position: 4 +sidebar_position: 5 --- # AWS -> :warning: **DCNiOS can use some AWS services**: This section clarifies the configuration required to use the credentials! -DCNiOS can use some AWS as input. A valid pair of AWS Access Key and AWS Secret Key is necessary in all those cases. +**DCNiOS can use some AWS services**: This section clarifies the configuration required to use the credentials! -- DCNiOS takes the credentials from the environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. -- If those environment variables do not exist, the credentials are taken from [aws file credentials](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) with the `default` section. Here is an example: - ``` bash - [default] - aws_access_key_id = AK<> - aws_secret_access_key = <> - ``` -- If DCNiOS does not successfully use the credentials as environment variables or in the credential file. -DCNiOS gets them from configuration files named `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. -This implementation is made to minimize the times that the credentials are written in the configuration file. -AWS_DEFAULT_REGION is mandatory in any source that uses AWS of the configuration file. Right now, the ProcessGroup that uses AWS credentials are: -- [SQS](/docs/Inputs/SQS) -- [S3](/docs/Inputs/S3) \ No newline at end of file +DCNiOS can use some AWS as input. A valid pair of AWS Access Key and AWS Secret Key is necessary in all those cases. DCNiOS takes the AWS credentials from several places, following a hierarchy. This implementation is made to minimize the times that the credentials are written in the configuration file. + +- Environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. +- From [aws file credentials](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) with the `default` section. Here is an example: + ``` bash + [default] + aws_access_key_id = AK<> + aws_secret_access_key = <> + ``` +- From the file of DCNiOS workflow file named `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. + + + +AWS_DEFAULT_REGION is mandatory in any Source that uses AWS in the configuration file. These ProcessGroups can employ AWS credentials: +- [SQS](/docs/0.2.- Sources/SQS) +- [S3](/docs/0.2.- Sources/S3) + diff --git a/docpage/docs/Introduction.md b/docpage/docs/Introduction.md new file mode 100644 index 00000000..e6943e32 --- /dev/null +++ b/docpage/docs/Introduction.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 1 +--- + +# Introduction + +DCNiOS is an open-source command-line tool that easily manages the creation of event-driven data processing flows. DCNiOS reads a file with a workflow defined in a YAML structure. Then, DCNiOS creates this workflow in an Apache NiFi cluster. DCNiOS uses transparently the Apache NiFi [Process Groups](https://nifi.apache.org/docs/nifi-docs/html/user-guide.html#Configuring_a_ProcessGroup) to create predefined workflows. + + +Apache NiFi Process Group is a group of Processors that compose a dataflow. DCNiOS uses predefined Process Groups that make simple actions like interacting with a third-party component (e.g., consuming from Kafka) or changing the data content (e.g.encoding the data in base64) to compose a complete dataflow. + +In DCNiOS documentation, the Process Groups are split by purpose into three main groups: 'Sources', 'Destinations', and 'Alterations'. +- 'Sources' interact with a third-party component as the input data receiver. +-'Destinations' interact with a third-party component as output data sender. +- 'Alterations' that do not interact with third-party components and change the format of the data flow. + + + + + + + + + + + + + +# Getting Started + +## Prerequisites + +- OSCAR cluster containing the user-defined OSCAR Services. [](https://github.com/grycap/oscar/tree/master/examples) +- Apache Nifi cluster deployed +- A Python distribution such as [Anaconda](https://www.anaconda.com/) or Python version 3.7.6 +- Input source (one of these is enough: dCache, Kafka, S3 AWS, SQS AWS) + + +[IM](https://www.grycap.upv.es/im/index.php) can deploy a Kubernetes cluster that includes OSCAR and Apache NiFi. + + +## Installation + +### Create a conda environment to use DCNiOS + +``` bash +conda create --name dcnios python=3.7.6 +conda activate dcnios +``` + +[Optional] Install all the requirements defined in `requirements.txt` + +``` bash +pip install -r requeriments.txt +``` + +Alternatively, install the minimal requirements that DCNiOS needs. + + +``` bash +pip install pyyaml==6.0 requests==2.28.2 oscar_python==1.0.3 +``` diff --git a/docpage/docs/Users.md b/docpage/docs/Users.md index 321b19f4..92f3d56d 100644 --- a/docpage/docs/Users.md +++ b/docpage/docs/Users.md @@ -1,119 +1,129 @@ --- -sidebar_position: 1 +sidebar_position: 2 --- -# Users -## Yaml structure +# Users Guide -This document tries to guide the users in understanding the possibilities of dCNiOS. +Here, you will find an explanation of the main concepts of DCNiOS, such as the DCNiOS commands, how to define a workflow, involved sections, and the commun sections for all the third-party connections. -- Some fields need to be defined for the main section that represents a NiFi instance: - - Nifi credentials of the instance. - - The ProcessGroups that are going to be created. - - The connection between those ProcessGroups. -I +## Commands -### Nifi credentials: +Create a workflow with the command apply. +``` +python dcnios-cli.py apply -f description.yaml +``` -This section indicates the Nifi credentials: -- Endpoint -- User -- Password +Start or stop the workflow. +``` +python dcnios-cli.py [start | stop] -f description.yaml +``` +Delete the workflow with the command delete. ``` -nifi: - endpoint: https://<> - user: <> - password: <> +python dcnios-cli.py delete -f description.yaml ``` -### ProcessGroups +Edit the scheduling time for a process: -Nifi allows saving the behavior of some processes to create a small workflow. This is called ProcessGroup. dCNiOS uses those ProcessGroup. It is necessary to fill in the variables to create custom workflows adapted for each use case. +``` +python dcnios-cli.py changeSchedule --host={nifi-endpoint} \ +--user={user} --password={pass} \ +--processGroup={processGroupName} --component={defined_in_template} \ +--seconds=10 +``` -Some ProcessGroups operate as Source: -- dCache -- KAFKA -- S3 -Other operate as Destination: -- OSCAR -Inside a ProcessGroup, a subsection `components` has been created to change the configuration of a process. It changes the scheduled time, seconds between executions (ratio execution), and execution node, where you can choose which node is going to be executed, in all nodes or the primary node. +## File workflow configuration structure (Yaml structure) -``` - components: - - name: GetFile - seconds: 2 - node: (ALL | PRIMARY) -``` +Here, we will explain the workflow definition, the structure of the configuration file, and the information the user has to know about each third-party connection. DCNiOS deploys and configures all the definitions in Apache NiFi. -### Connections +### Apache NiFi credentials: -This section defines the connection between the ProcessGroups using identifier names. +In this 'nifi' section, the Apache NiFi credentials will be defined. Inside this section will be defined the Sources that will be deployed and the conection between them. ``` -- from: dcachelistening - to: edgan3 +nifi: + endpoint: https:// + user: + password: ``` -### Example -``` -nifi: - endpoint: https://<> - user: <> - password: <> - dcache: - - name: dcachelistening - endpoint: <>/api/v1 - user: <> - password: <> - folder: /Users/slangarita/itwin/input - statefile: statess1.txt - oscar: - - name: edgan3 - endpoint: <> - service: <> - token: <> - connection: - - from: dcachelistening - to: edgan3 +### Sources, Destinations and Alterations -``` +Moreover, it is necessary to define the source and destination of data. +Sources: +- [dCache](https://www.dcache.org/) +- [KAFKA](https://kafka.apache.org/) +- [S3](https://aws.amazon.com/es/s3/) -## Manage the dataflow with commands +Destinations: +- [OSCAR](https://oscar.grycap.net/) -Once the dataflow is defined in the YAML file, it is time to create it with the command: +Alterations: +- Base64 +- Merge -``` bash -python dcnios-cli.py apply -f description.yaml -``` -To start or stop all the ProcessGroup defined in the YAML: +#### Components Subsection -``` bash -python dcnios-cli.py [start | stop] -f description.yaml +The subsection `components`, inside Sources and Destinations, is employed to change the configuration of a single Processor of Apache NiFi. It is necessary to know the name of the component. Then, we can change the seconds between executions, +the scheduled time, seconds between executions (ratio execution), and in which kind of node in Nifi is going to execute.the node execution can be changed. + + + + +``` +components: +- name: GetFile + seconds: 2 + node: (ALL | PRIMARY) ``` -To delete all the ProcessGroup defined in the YAML: -``` bash -python dcnios-cli.py delete -f description.yaml +### Connections + + + +In the Connections section, the connections between sources and destinations are established by employing the `from` and `to` keys. + +``` +connection: + - from: dcache + to: edgan3 ``` -### Change Schedule time -A command has been created to change the time of a process between execution: -``` bash -python dcnios-cli.py changeSchedule --host={nifi-endpoint} \ ---user={user} --password={pass} \ ---processGroup={processGroupName} --component={defined_in_template} \ ---seconds=10 + + +### Example + + ``` +nifi: + endpoint: https:// + user: + password: + dCache: + - name: dcache + endpoint: /api/v1 + user: + password: + folder: + statefile: + OSCAR: + - name: edgan3 + endpoint: + service: + token: + connection: + - from: dcache + to: edgan3 +``` diff --git a/docpage/docusaurus.config.js b/docpage/docusaurus.config.js index 95cf95de..730d98a3 100644 --- a/docpage/docusaurus.config.js +++ b/docpage/docusaurus.config.js @@ -79,7 +79,7 @@ const config = { type: 'docSidebar', sidebarId: 'tutorialSidebar', position: 'left', - label: 'Tutorial', + label: 'Documentation', }, //{to: '/blog', label: 'Blog', position: 'left'}, { diff --git a/docpage/package-lock.json b/docpage/package-lock.json index f7e6c12b..58d13f63 100644 --- a/docpage/package-lock.json +++ b/docpage/package-lock.json @@ -8,8 +8,8 @@ "name": "docpage", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/preset-classic": "3.1.1", + "@docusaurus/core": "^3.4.0", + "@docusaurus/preset-classic": "^3.4.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "prism-react-renderer": "^2.3.0", @@ -17,8 +17,8 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.1.1", - "@docusaurus/types": "3.1.1" + "@docusaurus/module-type-aliases": "^3.4.0", + "@docusaurus/types": "^3.4.0" }, "engines": { "node": ">=18.0" @@ -66,74 +66,74 @@ } }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", - "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.3.tgz", + "integrity": "sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==", "dependencies": { - "@algolia/cache-common": "4.22.1" + "@algolia/cache-common": "4.23.3" } }, "node_modules/@algolia/cache-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", - "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==" + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.3.tgz", + "integrity": "sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", - "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.3.tgz", + "integrity": "sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==", "dependencies": { - "@algolia/cache-common": "4.22.1" + "@algolia/cache-common": "4.23.3" } }, "node_modules/@algolia/client-account": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", - "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.3.tgz", + "integrity": "sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==", "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/@algolia/client-analytics": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", - "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.3.tgz", + "integrity": "sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==", "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/@algolia/client-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", - "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.3.tgz", + "integrity": "sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==", "dependencies": { - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/@algolia/client-personalization": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", - "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.3.tgz", + "integrity": "sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==", "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/@algolia/client-search": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", - "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.3.tgz", + "integrity": "sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==", "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/@algolia/events": { @@ -142,47 +142,65 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", - "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==" + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.3.tgz", + "integrity": "sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==" }, "node_modules/@algolia/logger-console": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", - "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.3.tgz", + "integrity": "sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==", "dependencies": { - "@algolia/logger-common": "4.22.1" + "@algolia/logger-common": "4.23.3" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.3.tgz", + "integrity": "sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.23.3", + "@algolia/cache-common": "4.23.3", + "@algolia/cache-in-memory": "4.23.3", + "@algolia/client-common": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/logger-common": "4.23.3", + "@algolia/logger-console": "4.23.3", + "@algolia/requester-browser-xhr": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/requester-node-http": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", - "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.3.tgz", + "integrity": "sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==", "dependencies": { - "@algolia/requester-common": "4.22.1" + "@algolia/requester-common": "4.23.3" } }, "node_modules/@algolia/requester-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", - "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==" + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.3.tgz", + "integrity": "sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", - "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.3.tgz", + "integrity": "sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==", "dependencies": { - "@algolia/requester-common": "4.22.1" + "@algolia/requester-common": "4.23.3" } }, "node_modules/@algolia/transporter": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", - "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.3.tgz", + "integrity": "sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==", "dependencies": { - "@algolia/cache-common": "4.22.1", - "@algolia/logger-common": "4.22.1", - "@algolia/requester-common": "4.22.1" + "@algolia/cache-common": "4.23.3", + "@algolia/logger-common": "4.23.3", + "@algolia/requester-common": "4.23.3" } }, "node_modules/@ampproject/remapping": { @@ -529,9 +547,9 @@ } }, "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==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "engines": { "node": ">=6.9.0" } @@ -1606,11 +1624,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", - "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.7.tgz", + "integrity": "sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2126,18 +2144,18 @@ } }, "node_modules/@docsearch/css": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", - "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==" + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==" }, "node_modules/@docsearch/react": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", - "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", "dependencies": { "@algolia/autocomplete-core": "1.9.3", "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.5.2", + "@docsearch/css": "3.6.0", "algoliasearch": "^4.19.1" }, "peerDependencies": { @@ -2162,9 +2180,9 @@ } }, "node_modules/@docusaurus/core": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.1.1.tgz", - "integrity": "sha512-2nQfKFcf+MLEM7JXsXwQxPOmQAR6ytKMZVSx7tVi9HEm9WtfwBH1fp6bn8Gj4zLUhjWKCLoysQ9/Wm+EZCQ4yQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.4.0.tgz", + "integrity": "sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w==", "dependencies": { "@babel/core": "^7.23.3", "@babel/generator": "^7.23.3", @@ -2176,15 +2194,12 @@ "@babel/runtime": "^7.22.6", "@babel/runtime-corejs3": "^7.22.6", "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.1.1", - "@docusaurus/logger": "3.1.1", - "@docusaurus/mdx-loader": "3.1.1", - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-common": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", - "@slorber/static-site-generator-webpack-plugin": "^4.0.7", - "@svgr/webpack": "^6.5.1", + "@docusaurus/cssnano-preset": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "autoprefixer": "^10.4.14", "babel-loader": "^9.1.3", "babel-plugin-dynamic-import-node": "^2.3.3", @@ -2198,12 +2213,13 @@ "copy-webpack-plugin": "^11.0.0", "core-js": "^3.31.1", "css-loader": "^6.8.1", - "css-minimizer-webpack-plugin": "^4.2.2", - "cssnano": "^5.1.15", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", "del": "^6.1.1", "detect-port": "^1.5.1", "escape-html": "^1.0.3", "eta": "^2.2.0", + "eval": "^0.1.8", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "html-minifier-terser": "^7.2.0", @@ -2212,12 +2228,13 @@ "leven": "^3.1.0", "lodash": "^4.17.21", "mini-css-extract-plugin": "^2.7.6", + "p-map": "^4.0.0", "postcss": "^8.4.26", "postcss-loader": "^7.3.3", "prompts": "^2.4.2", "react-dev-utils": "^12.0.1", "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", "react-loadable-ssr-addon-v5-slorber": "^1.0.1", "react-router": "^5.3.4", "react-router-config": "^5.1.1", @@ -2248,13 +2265,13 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.1.1.tgz", - "integrity": "sha512-LnoIDjJWbirdbVZDMq+4hwmrTl2yHDnBf9MLG9qyExeAE3ac35s4yUhJI8yyTCdixzNfKit4cbXblzzqMu4+8g==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.4.0.tgz", + "integrity": "sha512-qwLFSz6v/pZHy/UP32IrprmH5ORce86BGtN0eBtG75PpzQJAzp9gefspox+s8IEOr0oZKuQ/nhzZ3xwyc3jYJQ==", "dependencies": { - "cssnano-preset-advanced": "^5.3.10", - "postcss": "^8.4.26", - "postcss-sort-media-queries": "^4.4.1", + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.4.38", + "postcss-sort-media-queries": "^5.2.0", "tslib": "^2.6.0" }, "engines": { @@ -2262,9 +2279,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.1.1.tgz", - "integrity": "sha512-BjkNDpQzewcTnST8trx4idSoAla6zZ3w22NqM/UMcFtvYJgmoE4layuTzlfql3VFPNuivvj7BOExa/+21y4X2Q==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.4.0.tgz", + "integrity": "sha512-bZwkX+9SJ8lB9kVRkXw+xvHYSMGG4bpYHKGXeXFvyVc79NMeeBSGgzd4TQLHH+DYeOJoCdl8flrFJVxlZ0wo/Q==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" @@ -2274,15 +2291,13 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.1.1.tgz", - "integrity": "sha512-xN2IccH9+sv7TmxwsDJNS97BHdmlqWwho+kIVY4tcCXkp+k4QuzvWBeunIMzeayY4Fu13A6sAjHGv5qm72KyGA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.4.0.tgz", + "integrity": "sha512-kSSbrrk4nTjf4d+wtBA9H+FGauf2gCax89kV8SUSJu3qaTdSIKdWERlngsiHaCFgZ7laTJ8a67UFf+xlFPtuTw==", "dependencies": { - "@babel/parser": "^7.22.7", - "@babel/traverse": "^7.22.8", - "@docusaurus/logger": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "@docusaurus/logger": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -2314,18 +2329,17 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.1.tgz", - "integrity": "sha512-xBJyx0TMfAfVZ9ZeIOb1awdXgR4YJMocIEzTps91rq+hJDFJgJaylDtmoRhUxkwuYmNK1GJpW95b7DLztSBJ3A==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.4.0.tgz", + "integrity": "sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==", "dependencies": { - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "3.1.1", + "@docusaurus/types": "3.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, "peerDependencies": { "react": "*", @@ -2333,17 +2347,17 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.1.1.tgz", - "integrity": "sha512-ew/3VtVoG3emoAKmoZl7oKe1zdFOsI0NbcHS26kIxt2Z8vcXKCUgK9jJJrz0TbOipyETPhqwq4nbitrY3baibg==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/logger": "3.1.1", - "@docusaurus/mdx-loader": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-common": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.4.0.tgz", + "integrity": "sha512-vv6ZAj78ibR5Jh7XBUT4ndIjmlAxkijM3Sx5MAAzC1gyv0vupDQNhzuFg1USQmQVj3P5I6bquk12etPV3LJ+Xw==", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -2364,17 +2378,18 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.1.1.tgz", - "integrity": "sha512-lhFq4E874zw0UOH7ujzxnCayOyAt0f9YPVYSb9ohxrdCM8B4szxitUw9rIX4V9JLLHVoqIJb6k+lJJ1jrcGJ0A==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/logger": "3.1.1", - "@docusaurus/mdx-loader": "3.1.1", - "@docusaurus/module-type-aliases": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.4.0.tgz", + "integrity": "sha512-HkUCZffhBo7ocYheD9oZvMcDloRnGhBMOZRyVcAQRFmZPmNqSyISlXA1tQCIxW+r478fty97XXAGjNYzBjpCsg==", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -2393,15 +2408,15 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.1.1.tgz", - "integrity": "sha512-NQHncNRAJbyLtgTim9GlEnNYsFhuCxaCNkMwikuxLTiGIPH7r/jpb7O3f3jUMYMebZZZrDq5S7om9a6rvB/YCA==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/mdx-loader": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.4.0.tgz", + "integrity": "sha512-h2+VN/0JjpR8fIkDEAoadNjfR3oLzB+v1qSXbIAKjQ46JAHx3X22n9nqS+BWSQnTnp1AjkjSvZyJMekmcwxzxg==", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" @@ -2415,13 +2430,13 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.1.1.tgz", - "integrity": "sha512-xWeMkueM9wE/8LVvl4+Qf1WqwXmreMjI5Kgr7GYCDoJ8zu4kD+KaMhrh7py7MNM38IFvU1RfrGKacCEe2DRRfQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.4.0.tgz", + "integrity": "sha512-uV7FDUNXGyDSD3PwUaf5YijX91T5/H9SX4ErEcshzwgzWwBtK37nUWPU3ZLJfeTavX3fycTOqk9TglpOLaWkCg==", "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils": "3.1.1", + "@docusaurus/core": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", "fs-extra": "^11.1.1", "react-json-view-lite": "^1.2.0", "tslib": "^2.6.0" @@ -2435,13 +2450,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.1.1.tgz", - "integrity": "sha512-+q2UpWTqVi8GdlLoSlD5bS/YpxW+QMoBwrPrUH/NpvpuOi0Of7MTotsQf9JWd3hymZxl2uu1o3PIrbpxfeDFDQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.4.0.tgz", + "integrity": "sha512-mCArluxEGi3cmYHqsgpGGt3IyLCrFBxPsxNZ56Mpur0xSlInnIHoeLDH7FvVVcPJRPSQ9/MfRqLsainRw+BojA==", "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "@docusaurus/core": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "tslib": "^2.6.0" }, "engines": { @@ -2453,13 +2468,13 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.1.1.tgz", - "integrity": "sha512-0mMPiBBlQ5LFHTtjxuvt/6yzh8v7OxLi3CbeEsxXZpUzcKO/GC7UA1VOWUoBeQzQL508J12HTAlR3IBU9OofSw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.4.0.tgz", + "integrity": "sha512-Dsgg6PLAqzZw5wZ4QjUYc8Z2KqJqXxHxq3vIoyoBWiLEEfigIs7wHR+oiWUQy3Zk9MIk6JTYj7tMoQU0Jm3nqA==", "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "@docusaurus/core": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, @@ -2472,13 +2487,13 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.1.1.tgz", - "integrity": "sha512-d07bsrMLdDIryDtY17DgqYUbjkswZQr8cLWl4tzXrt5OR/T/zxC1SYKajzB3fd87zTu5W5klV5GmUwcNSMXQXA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.4.0.tgz", + "integrity": "sha512-O9tX1BTwxIhgXpOLpFDueYA9DWk69WCbDRrjYoMQtFHSkTyE7RhNgyjSPREUWJb9i+YUg3OrsvrBYRl64FCPCQ==", "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "@docusaurus/core": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "tslib": "^2.6.0" }, "engines": { @@ -2490,16 +2505,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.1.1.tgz", - "integrity": "sha512-iJ4hCaMmDaUqRv131XJdt/C/jJQx8UreDWTRqZKtNydvZVh/o4yXGRRFOplea1D9b/zpwL1Y+ZDwX7xMhIOTmg==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/logger": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-common": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.4.0.tgz", + "integrity": "sha512-+0VDvx9SmNrFNgwPoeoCha+tRoAjopwT0+pYO1xAbyLcewXSemq+eLxEa46Q1/aoOaJQ0qqHELuQM7iS2gp33Q==", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" @@ -2513,23 +2528,23 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.1.1.tgz", - "integrity": "sha512-jG4ys/hWYf69iaN/xOmF+3kjs4Nnz1Ay3CjFLDtYa8KdxbmUhArA9HmP26ru5N0wbVWhY+6kmpYhTJpez5wTyg==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/plugin-content-blog": "3.1.1", - "@docusaurus/plugin-content-docs": "3.1.1", - "@docusaurus/plugin-content-pages": "3.1.1", - "@docusaurus/plugin-debug": "3.1.1", - "@docusaurus/plugin-google-analytics": "3.1.1", - "@docusaurus/plugin-google-gtag": "3.1.1", - "@docusaurus/plugin-google-tag-manager": "3.1.1", - "@docusaurus/plugin-sitemap": "3.1.1", - "@docusaurus/theme-classic": "3.1.1", - "@docusaurus/theme-common": "3.1.1", - "@docusaurus/theme-search-algolia": "3.1.1", - "@docusaurus/types": "3.1.1" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.4.0.tgz", + "integrity": "sha512-Ohj6KB7siKqZaQhNJVMBBUzT3Nnp6eTKqO+FXO3qu/n1hJl3YLwVKTWBg28LF7MWrKu46UuYavwMRxud0VyqHg==", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/plugin-content-blog": "3.4.0", + "@docusaurus/plugin-content-docs": "3.4.0", + "@docusaurus/plugin-content-pages": "3.4.0", + "@docusaurus/plugin-debug": "3.4.0", + "@docusaurus/plugin-google-analytics": "3.4.0", + "@docusaurus/plugin-google-gtag": "3.4.0", + "@docusaurus/plugin-google-tag-manager": "3.4.0", + "@docusaurus/plugin-sitemap": "3.4.0", + "@docusaurus/theme-classic": "3.4.0", + "@docusaurus/theme-common": "3.4.0", + "@docusaurus/theme-search-algolia": "3.4.0", + "@docusaurus/types": "3.4.0" }, "engines": { "node": ">=18.0" @@ -2539,35 +2554,23 @@ "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/react-loadable": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "dependencies": { - "@types/react": "*", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": "*" - } - }, "node_modules/@docusaurus/theme-classic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.1.1.tgz", - "integrity": "sha512-GiPE/jbWM8Qv1A14lk6s9fhc0LhPEQ00eIczRO4QL2nAQJZXkjPG6zaVx+1cZxPFWbAsqSjKe2lqkwF3fGkQ7Q==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/mdx-loader": "3.1.1", - "@docusaurus/module-type-aliases": "3.1.1", - "@docusaurus/plugin-content-blog": "3.1.1", - "@docusaurus/plugin-content-docs": "3.1.1", - "@docusaurus/plugin-content-pages": "3.1.1", - "@docusaurus/theme-common": "3.1.1", - "@docusaurus/theme-translations": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-common": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.4.0.tgz", + "integrity": "sha512-0IPtmxsBYv2adr1GnZRdMkEQt1YW6tpzrUPj02YxNpvJ5+ju4E13J5tB4nfdaen/tfR1hmpSPlTFPvTf4kwy8Q==", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/plugin-content-blog": "3.4.0", + "@docusaurus/plugin-content-docs": "3.4.0", + "@docusaurus/plugin-content-pages": "3.4.0", + "@docusaurus/theme-common": "3.4.0", + "@docusaurus/theme-translations": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", @@ -2591,17 +2594,17 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.1.1.tgz", - "integrity": "sha512-38urZfeMhN70YaXkwIGXmcUcv2CEYK/2l4b05GkJPrbEbgpsIZM3Xc+Js2ehBGGZmfZq8GjjQ5RNQYG+MYzCYg==", - "dependencies": { - "@docusaurus/mdx-loader": "3.1.1", - "@docusaurus/module-type-aliases": "3.1.1", - "@docusaurus/plugin-content-blog": "3.1.1", - "@docusaurus/plugin-content-docs": "3.1.1", - "@docusaurus/plugin-content-pages": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-common": "3.1.1", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.4.0.tgz", + "integrity": "sha512-0A27alXuv7ZdCg28oPE8nH/Iz73/IUejVaCazqu9elS4ypjiLhK3KfzdSQBnL/g7YfHSlymZKdiOHEo8fJ0qMA==", + "dependencies": { + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/plugin-content-blog": "3.4.0", + "@docusaurus/plugin-content-docs": "3.4.0", + "@docusaurus/plugin-content-pages": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2620,18 +2623,18 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.1.1.tgz", - "integrity": "sha512-tBH9VY5EpRctVdaAhT+b1BY8y5dyHVZGFXyCHgTrvcXQy5CV4q7serEX7U3SveNT9zksmchPyct6i1sFDC4Z5g==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.4.0.tgz", + "integrity": "sha512-aiHFx7OCw4Wck1z6IoShVdUWIjntC8FHCw9c5dR8r3q4Ynh+zkS8y2eFFunN/DL6RXPzpnvKCg3vhLQYJDmT9Q==", "dependencies": { "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.1.1", - "@docusaurus/logger": "3.1.1", - "@docusaurus/plugin-content-docs": "3.1.1", - "@docusaurus/theme-common": "3.1.1", - "@docusaurus/theme-translations": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/plugin-content-docs": "3.4.0", + "@docusaurus/theme-common": "3.4.0", + "@docusaurus/theme-translations": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "algoliasearch": "^4.18.0", "algoliasearch-helper": "^3.13.3", "clsx": "^2.0.0", @@ -2650,9 +2653,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.1.1.tgz", - "integrity": "sha512-xvWQFwjxHphpJq5fgk37FXCDdAa2o+r7FX8IpMg+bGZBNXyWBu3MjZ+G4+eUVNpDhVinTc+j6ucL0Ain5KCGrg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.4.0.tgz", + "integrity": "sha512-zSxCSpmQCCdQU5Q4CnX/ID8CSUUI3fvmq4hU/GNP/XoAWtXo9SAVnM3TzpU8Gb//H3WCsT8mJcTfyOk3d9ftNg==", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -2662,9 +2665,9 @@ } }, "node_modules/@docusaurus/types": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", - "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", + "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", "dependencies": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", @@ -2682,12 +2685,13 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.1.1.tgz", - "integrity": "sha512-ZJfJa5cJQtRYtqijsPEnAZoduW6sjAQ7ZCWSZavLcV10Fw0Z3gSaPKA/B4micvj2afRZ4gZxT7KfYqe5H8Cetg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.4.0.tgz", + "integrity": "sha512-fRwnu3L3nnWaXOgs88BVBmG1yGjcQqZNHG+vInhEa2Sz2oQB+ZjbEMO5Rh9ePFpZ0YDiDUhpaVjwmS+AU2F14g==", "dependencies": { - "@docusaurus/logger": "3.1.1", - "@svgr/webpack": "^6.5.1", + "@docusaurus/logger": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@svgr/webpack": "^8.1.0", "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", @@ -2698,10 +2702,12 @@ "js-yaml": "^4.1.0", "lodash": "^4.17.21", "micromatch": "^4.0.5", + "prompts": "^2.4.2", "resolve-pathname": "^3.0.0", "shelljs": "^0.8.5", "tslib": "^2.6.0", "url-loader": "^4.1.1", + "utility-types": "^3.10.0", "webpack": "^5.88.1" }, "engines": { @@ -2717,9 +2723,9 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.1.1.tgz", - "integrity": "sha512-eGne3olsIoNfPug5ixjepZAIxeYFzHHnor55Wb2P57jNbtVaFvij/T+MS8U0dtZRFi50QU+UPmRrXdVUM8uyMg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.4.0.tgz", + "integrity": "sha512-NVx54Wr4rCEKsjOH5QEVvxIqVvm+9kh7q8aYTU5WzUU9/Hctd6aTrcZ3G0Id4zYJ+AeaG5K5qHA4CY5Kcm2iyQ==", "dependencies": { "tslib": "^2.6.0" }, @@ -2736,14 +2742,17 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.1.1.tgz", - "integrity": "sha512-KlY4P9YVDnwL+nExvlIpu79abfEv6ZCHuOX4ZQ+gtip+Wxj0daccdReIWWtqxM/Fb5Cz1nQvUCc7VEtT8IBUAA==", - "dependencies": { - "@docusaurus/logger": "3.1.1", - "@docusaurus/utils": "3.1.1", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.4.0.tgz", + "integrity": "sha512-hYQ9fM+AXYVTWxJOT1EuNaRnrR2WGpRdLDQG07O8UOpsvCPWUVOeo26Rbm0JWY2sGLfzAb+tvJ62yF+8F+TV0g==", + "dependencies": { + "@docusaurus/logger": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", + "lodash": "^4.17.21", "tslib": "^2.6.0" }, "engines": { @@ -3015,25 +3024,12 @@ "micromark-util-symbol": "^1.0.1" } }, - "node_modules/@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", - "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", - "dependencies": { - "eval": "^0.1.8", - "p-map": "^4.0.0", - "webpack-sources": "^3.2.2" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3074,11 +3070,11 @@ } }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3089,11 +3085,11 @@ } }, "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3104,11 +3100,11 @@ } }, "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3119,11 +3115,11 @@ } }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3134,9 +3130,9 @@ } }, "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "engines": { "node": ">=12" }, @@ -3149,21 +3145,21 @@ } }, "node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3174,18 +3170,18 @@ } }, "node_modules/@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3193,15 +3189,15 @@ } }, "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "dependencies": { - "@babel/types": "^7.20.0", + "@babel/types": "^7.21.3", "entities": "^4.4.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3209,37 +3205,37 @@ } }, "node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", "svg-parser": "^2.0.4" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "@svgr/core": "^6.0.0" + "@svgr/core": "*" } }, "node_modules/@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "dependencies": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3250,21 +3246,21 @@ } }, "node_modules/@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "dependencies": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3461,9 +3457,9 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dependencies": { "@types/unist": "*" } @@ -3917,30 +3913,31 @@ } }, "node_modules/algoliasearch": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", - "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.22.1", - "@algolia/cache-common": "4.22.1", - "@algolia/cache-in-memory": "4.22.1", - "@algolia/client-account": "4.22.1", - "@algolia/client-analytics": "4.22.1", - "@algolia/client-common": "4.22.1", - "@algolia/client-personalization": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/logger-common": "4.22.1", - "@algolia/logger-console": "4.22.1", - "@algolia/requester-browser-xhr": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/requester-node-http": "4.22.1", - "@algolia/transporter": "4.22.1" + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.3.tgz", + "integrity": "sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.23.3", + "@algolia/cache-common": "4.23.3", + "@algolia/cache-in-memory": "4.23.3", + "@algolia/client-account": "4.23.3", + "@algolia/client-analytics": "4.23.3", + "@algolia/client-common": "4.23.3", + "@algolia/client-personalization": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/logger-common": "4.23.3", + "@algolia/logger-console": "4.23.3", + "@algolia/recommend": "4.23.3", + "@algolia/requester-browser-xhr": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/requester-node-http": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/algoliasearch-helper": { - "version": "3.16.3", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.3.tgz", - "integrity": "sha512-1OuJT6sONAa9PxcOmWo5WCAT3jQSpCR9/m5Azujja7nhUQwAUDvaaAYrcmUySsrvHh74usZHbE3jFfGnWtZj8w==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.21.0.tgz", + "integrity": "sha512-hjVOrL15I3Y3K8xG0icwG1/tWE+MocqBrhW6uVBWpU+/kVEMK0BnM2xdssj6mZM61eJ4iRxHR0djEI3ENOpR8w==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -4059,9 +4056,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", - "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "funding": [ { "type": "opencollective", @@ -4077,8 +4074,8 @@ } ], "dependencies": { - "browserslist": "^4.22.2", - "caniuse-lite": "^1.0.30001578", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4434,9 +4431,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001591", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", - "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==", + "version": "1.0.30001632", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz", + "integrity": "sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==", "funding": [ { "type": "opencollective", @@ -4889,9 +4886,9 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -5013,18 +5010,28 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/cross-spawn": { @@ -5066,11 +5073,11 @@ } }, "node_modules/css-declaration-sorter": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", "engines": { - "node": "^10 || ^12 || >=14" + "node": "^14 || ^16 || >=18" }, "peerDependencies": { "postcss": "^8.0.9" @@ -5111,16 +5118,16 @@ } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", - "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", "dependencies": { - "cssnano": "^5.1.8", - "jest-worker": "^29.1.2", - "postcss": "^8.4.17", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" }, "engines": { "node": ">= 14.15.0" @@ -5153,14 +5160,6 @@ } } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/css-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", @@ -5177,23 +5176,15 @@ } }, "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, "node_modules/css-what": { @@ -5219,108 +5210,128 @@ } }, "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/cssnano" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/cssnano-preset-advanced": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", - "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", "dependencies": { - "autoprefixer": "^10.4.12", - "cssnano-preset-default": "^5.2.14", - "postcss-discard-unused": "^5.1.0", - "postcss-merge-idents": "^5.1.1", - "postcss-reduce-idents": "^5.2.0", - "postcss-zindex": "^5.1.0" + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dependencies": { - "css-tree": "^1.1.2" + "css-tree": "~2.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -5923,16 +5934,13 @@ } }, "node_modules/estree-util-value-to-estree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz", - "integrity": "sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.1.tgz", + "integrity": "sha512-5mvUrF2suuv5f5cGDnDphIy4/gW86z82kl5qG6mM9z04SEQI4FB5Apmaw/TGEf3l55nLtMs5s51dmhUzvAHQCA==", "dependencies": { "@types/estree": "^1.0.0", "is-plain-obj": "^4.0.0" }, - "engines": { - "node": ">=16.0.0" - }, "funding": { "url": "https://github.com/sponsors/remcohaszing" } @@ -6033,16 +6041,16 @@ } }, "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "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.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -6353,9 +6361,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -6944,9 +6952,9 @@ } }, "node_modules/hast-util-raw": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", - "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.3.tgz", + "integrity": "sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -7021,16 +7029,16 @@ } }, "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", - "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==" + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" }, "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz", - "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", "dependencies": { - "inline-style-parser": "0.2.2" + "inline-style-parser": "0.2.3" } }, "node_modules/hast-util-to-parse5": { @@ -7875,9 +7883,9 @@ } }, "node_modules/joi": { - "version": "17.12.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz", - "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==", + "version": "17.13.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz", + "integrity": "sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -8006,11 +8014,14 @@ } }, "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { @@ -8186,9 +8197,9 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -8414,9 +8425,9 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.0.tgz", - "integrity": "sha512-A8AJHlR7/wPQ3+Jre1+1rq040fX9A4Q1jG8JxmSNp/PLPHg80A6475wxTp3KzHpApFH6yWxFotHrJQA3dXP6/w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -8468,9 +8479,9 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", - "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -8519,9 +8530,9 @@ } }, "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" }, "node_modules/media-typer": { "version": "0.3.0", @@ -8603,9 +8614,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", "funding": [ { "type": "GitHub Sponsors", @@ -10121,9 +10132,9 @@ ] }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10450,17 +10461,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -10950,9 +10950,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -10970,112 +10970,115 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dependencies": { - "postcss-selector-parser": "^6.0.9", + "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, "peerDependencies": { "postcss": "^8.2.2" } }, "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", - "colord": "^2.9.1", + "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-unused": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", - "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-loader": { @@ -11099,136 +11102,111 @@ "webpack": "^5.0.0" } }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/postcss-merge-idents": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", - "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", "dependencies": { - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" + "stylehacks": "^6.1.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-modules-extract-imports": { @@ -11287,192 +11265,191 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", "dependencies": { - "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", "dependencies": { - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-reduce-idents": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", - "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.23.0", "caniuse-api": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11482,46 +11459,46 @@ } }, "node_modules/postcss-sort-media-queries": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", - "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", "dependencies": { - "sort-css-media-queries": "2.1.0" + "sort-css-media-queries": "2.2.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.0.0" }, "peerDependencies": { - "postcss": "^8.4.16" + "postcss": "^8.4.23" } }, "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", "dependencies": { "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "svgo": "^3.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >= 18" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-value-parser": { @@ -11530,14 +11507,14 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/postcss-zindex": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", - "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/pretty-error": { @@ -11605,9 +11582,9 @@ } }, "node_modules/property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -11942,9 +11919,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-json-view-lite": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz", - "integrity": "sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.4.0.tgz", + "integrity": "sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA==", "engines": { "node": ">=14" }, @@ -11954,12 +11931,11 @@ }, "node_modules/react-loadable": { "name": "@docusaurus/react-loadable", - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "dependencies": { - "@types/react": "*", - "prop-types": "^15.6.2" + "@types/react": "*" }, "peerDependencies": { "react": "*" @@ -12572,9 +12548,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, "node_modules/scheduler": { "version": "0.23.0", @@ -12603,9 +12579,9 @@ } }, "node_modules/search-insights": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", - "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.14.0.tgz", + "integrity": "sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==", "peer": true }, "node_modules/section-matter": { @@ -12963,9 +12939,9 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", @@ -13004,6 +12980,15 @@ "node": ">=8" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -13015,9 +13000,9 @@ } }, "node_modules/sort-css-media-queries": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", - "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", "engines": { "node": ">= 6.3.0" } @@ -13031,9 +13016,9 @@ } }, "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==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -13108,12 +13093,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -13177,9 +13156,9 @@ } }, "node_modules/stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -13249,18 +13228,18 @@ } }, "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/supports-color": { @@ -13291,23 +13270,27 @@ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" }, "bin": { "svgo": "bin/svgo" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" } }, "node_modules/svgo/node_modules/commander": { @@ -13318,69 +13301,6 @@ "node": ">= 10" } }, - "node_modules/svgo/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -14244,9 +14164,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", diff --git a/docpage/package.json b/docpage/package.json index a668280c..232ff91f 100644 --- a/docpage/package.json +++ b/docpage/package.json @@ -14,8 +14,8 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/preset-classic": "3.1.1", + "@docusaurus/core": "^3.4.0", + "@docusaurus/preset-classic": "^3.4.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "prism-react-renderer": "^2.3.0", @@ -23,8 +23,8 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.1.1", - "@docusaurus/types": "3.1.1" + "@docusaurus/module-type-aliases": "^3.4.0", + "@docusaurus/types": "^3.4.0" }, "browserslist": { "production": [