diff --git a/lib/workload/stateless/metadata_manager/component.ts b/lib/workload/stateless/metadata_manager/component.ts deleted file mode 100644 index b26041b6b..000000000 --- a/lib/workload/stateless/metadata_manager/component.ts +++ /dev/null @@ -1,143 +0,0 @@ -// // FIXME complete the implementation - -// import path from 'path'; -// import { Construct } from 'constructs'; -// import { ILayerVersion } from 'aws-cdk-lib/aws-lambda'; -// import { ISecurityGroup, IVpc } from 'aws-cdk-lib/aws-ec2'; -// import { IEventBus, Rule } from 'aws-cdk-lib/aws-events'; -// import { aws_events_targets, aws_lambda, Duration } from 'aws-cdk-lib'; -// import { PythonFunction, PythonLayerVersion } from '@aws-cdk/aws-lambda-python-alpha'; -// import { HttpLambdaIntegration } from '@aws-cdk/aws-apigatewayv2-integrations-alpha'; -// import { CorsHttpMethod, HttpApi, HttpMethod, HttpStage } from '@aws-cdk/aws-apigatewayv2-alpha'; - -// export interface ProjectNameProps { // FIXME change prop interface name -// layers: ILayerVersion[]; -// securityGroups: ISecurityGroup[]; -// vpc: IVpc; -// mainBus: IEventBus; -// functionName: string; -// lambdaRuntimePythonVersion: aws_lambda.Runtime; -// } - -// export class ProjectNameConstruct extends Construct { // FIXME change construct name -// private scope: Construct; -// private readonly id: string; -// private props: ProjectNameProps; -// private baseLayer: PythonLayerVersion; -// private readonly lambdaEnv; - -// constructor(scope: Construct, id: string, props: ProjectNameProps) { -// super(scope, id); - -// this.scope = scope; -// this.id = id; -// this.props = props; - -// this.lambdaEnv = { -// DJANGO_SETTINGS_MODULE: '{{ProjectName}}.settings.aws', // FIXME project name -// EVENT_BUS_NAME: this.props.mainBus.eventBusName, -// }; - -// this.createLambdaLayer(); -// this.createMigrationHandler(); -// this.createApiHandler(); -// this.createProcHandler(); -// this.createProcSqsHandler(); -// } - -// private createLambdaLayer() { -// this.baseLayer = new PythonLayerVersion(this, this.id + 'Layer', { -// entry: path.join(__dirname, 'src/'), -// }); -// } - -// private createMigrationHandler() { -// new PythonFunction(this, this.id + 'Migration', { -// entry: path.join(__dirname, 'src/'), -// runtime: this.props.lambdaRuntimePythonVersion, -// layers: [this.baseLayer], -// index: 'migrate.py', -// handler: 'handler', -// environment: this.lambdaEnv, -// }); -// } - -// private createApiHandler() { -// const apiFn = new PythonFunction(this, this.id + 'Api', { -// entry: path.join(__dirname, 'src/'), -// runtime: this.props.lambdaRuntimePythonVersion, -// layers: [this.baseLayer], -// index: 'api.py', -// handler: 'handler', -// environment: this.lambdaEnv, -// }); - -// const apiIntegration = new HttpLambdaIntegration(this.id + 'ApiIntegration', apiFn); - -// const httpApi = new HttpApi(this, this.id + 'HttpApi', { -// corsPreflight: { -// allowHeaders: ['Authorization'], -// allowMethods: [ -// CorsHttpMethod.GET, -// CorsHttpMethod.HEAD, -// CorsHttpMethod.OPTIONS, -// CorsHttpMethod.POST, -// ], -// allowOrigins: ['*'], // TODO to get this allowed origins from config constant -// maxAge: Duration.days(10), -// }, -// }); - -// httpApi.addRoutes({ -// path: '/{proxy+}', -// methods: [HttpMethod.ANY], -// integration: apiIntegration, -// }); - -// new HttpStage(this, this.id + 'ApiStage', { -// httpApi: httpApi, -// }); -// } - -// private createProcHandler() { -// const procFn = new PythonFunction(this, this.id + 'ProcHandler', { -// entry: path.join(__dirname, 'src/'), -// runtime: this.props.lambdaRuntimePythonVersion, -// layers: [this.baseLayer], -// index: '{{project_name}}_proc/lambdas/hello_proc.py', // FIXME update appropriate path to Lambda entry point -// handler: 'handler', -// environment: this.lambdaEnv, -// }); - -// this.props.mainBus.grantPutEventsTo(procFn); -// this.setupEventRule(procFn); -// } - -// private createProcSqsHandler() { -// const procSqsFn = new PythonFunction(this, this.id + 'ProcHandler', { -// entry: path.join(__dirname, 'src/'), -// runtime: this.props.lambdaRuntimePythonVersion, -// layers: [this.baseLayer], -// index: '{{project_name}}_proc/lambdas/hello_proc.py', // FIXME update appropriate path to Lambda entry point -// handler: 'sqs_handler', -// environment: this.lambdaEnv, -// }); - -// // this.props.mainBus.grantPutEventsTo(procSqsFn); // FIXME remove this if no use -// // this.setupEventRule(procSqsFn); // FIXME remove this if no use -// } - -// private setupEventRule(fn: aws_lambda.Function) { -// const eventRule = new Rule(this, this.id + 'EventRule', { -// ruleName: this.id + 'EventRule', -// description: 'Rule to send {event_type.value} events to the {handler.function_name} Lambda', -// eventBus: this.props.mainBus, -// }); - -// eventRule.addTarget(new aws_events_targets.LambdaFunction(fn)); -// eventRule.addEventPattern({ -// source: ['ORCHESTRATOR'], // FIXME complete source to destination event mapping -// detailType: ['SequenceRunStateChange'], -// }); -// } -// } diff --git a/lib/workload/stateless/metadata_manager/src/.editorconfig b/lib/workload/stateless/metadata_manager/src/.editorconfig new file mode 100644 index 000000000..1ed453a37 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true + +[*.{js,json,yml}] +charset = utf-8 +indent_style = space +indent_size = 2 diff --git a/lib/workload/stateless/metadata_manager/src/.gitattributes b/lib/workload/stateless/metadata_manager/src/.gitattributes new file mode 100644 index 000000000..af3ad1281 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/.gitattributes @@ -0,0 +1,4 @@ +/.yarn/** linguist-vendored +/.yarn/releases/* binary +/.yarn/plugins/**/* binary +/.pnp.* binary linguist-generated diff --git a/lib/workload/stateless/metadata_manager/src/.gitignore b/lib/workload/stateless/metadata_manager/src/.gitignore new file mode 100644 index 000000000..30578c9f3 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/.gitignore @@ -0,0 +1,139 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache/* +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# Swap the comments on the following lines if you don't wish to use zero-installs +# Documentation here: https://yarnpkg.com/features/zero-installs +!.yarn/cache +#.pnp.* + +dbschema/edgeql-js +dbschema/queries.* +dbschema/interfaces.ts diff --git a/lib/workload/stateless/metadata_manager/src/README.md b/lib/workload/stateless/metadata_manager/src/README.md index e543f6413..8c307890f 100644 --- a/lib/workload/stateless/metadata_manager/src/README.md +++ b/lib/workload/stateless/metadata_manager/src/README.md @@ -1,26 +1,46 @@ +# Metadata manager -# Development +The `MetadataManager` is one of the microservice within the UMCCR OrcaBus that manages the metadata records used for the +BioInformatics pipelines. The service will be responsible to make records to stay up to date and able to sync records +from multiple sources. -### Install -Create a virtual environment and install the `requirements-dev.txt` +## Development -1. Make virtual environment - - `python -mvenv .venv` -2. Activate the environment +### Git Checkout +As this microservice is part of a monorepo from the main OrcaBus project, the process Git Flow process +will follow on the root of this project. - `source .venv/bin/activate` -3. Install the dependency +### Development - `make install` +#### Setup +Change the terminal directory from the OrcaBus root to this directory: -### Testing +``` +cd lib/workload/stateless/metadata_manager/src +``` -Follow the readme file in the root of the directory to create a MYSQL local database. +Requirement for this project: + - nodejs + - edgedb (see ) -Go this directory -`cd lib/workload/stateless/library_manager/src` +To install the dependency of this project +``` +yarn +``` -And use the makefile to start testing -`make test` +Setup the database +``` +yarn init-db +yarn migrate-db +``` + +#### Build +```yarn edgetypes``` + + +### Run +```yarn watch``` + +#### Testing +```yarn test``` diff --git a/lib/workload/stateless/metadata_manager/src/api.py b/lib/workload/stateless/metadata_manager/src/api.py deleted file mode 100644 index 54bf713c9..000000000 --- a/lib/workload/stateless/metadata_manager/src/api.py +++ /dev/null @@ -1,12 +0,0 @@ -# # -*- coding: utf-8 -*- -# """api module for wsgi to AWS lambda -# -# See README https://github.com/logandk/serverless-wsgi -# """ -# import serverless_wsgi -# -# from library_manager.wsgi import library_manager -# -# -# def handler(event, context): -# return serverless_wsgi.handle_request(application.app, event, context) diff --git a/lib/workload/stateless/metadata_manager/src/dbschema/audit.esdl b/lib/workload/stateless/metadata_manager/src/dbschema/audit.esdl new file mode 100644 index 000000000..729b1acb3 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/dbschema/audit.esdl @@ -0,0 +1,53 @@ +module audit { + + # NOTE: TODO How to query deleted library?? + + # ActionType definition + # Ref: http://hl7.org/fhir/audit-even t-action + scalar type ActionType extending enum<'C', 'R', 'U', 'D', 'E'>; + + # ActionOutcome definition + # Ref: http://hl7.org/fhir/ValueSet/audit-event-outcome + scalar type ActionOutcome extending enum<'fatal', 'error', 'warning', 'information', 'success'>; + + abstract type AuditEvent { + required actionCategory: ActionType; + required actionOutcome: ActionOutcome; + + # a string describing the action but with no details i.e. "Google metadata sync" + # any details will appear later in the details JSON + required actionDescription: str; + + # when this audit record has been made (should be close to occurredDateTime) + required recordedDateTime: datetime { + default := datetime_current(); + readonly := true; + } + required occurredDateTime: datetime { + default := datetime_current(); + } + required occurredDuration: duration { + rewrite insert, update using ( + select __subject__.occurredDateTime - __subject__.recordedDateTime + ) + } + + # when this audit record is last updated (e.g. completion/failure of an event) + # Using `rewrite` to re-update this automatically + required updatedDateTime: datetime { + rewrite insert, update using (datetime_of_statement()) + } + + + # bespoke JSON with details of the event + details: json; + + # Whether its expected that this audit event will be updated. + required inProgress: bool; + } + + type SystemAuditEvent extending AuditEvent { + } + + +} diff --git a/lib/workload/stateless/metadata_manager/src/dbschema/metadata.esdl b/lib/workload/stateless/metadata_manager/src/dbschema/metadata.esdl new file mode 100644 index 000000000..5d459f8f9 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/dbschema/metadata.esdl @@ -0,0 +1,64 @@ + +module metadata { + + scalar type Phenotype extending enum<'normal', 'tumor', 'negative-control'>; + scalar type Quality extending enum<'very-poor', 'poor', 'good', 'borderline'>; + scalar type WorkflowTypes extending enum<'clinical', 'research', 'qc', 'control', 'bcl', 'manual'>; + scalar type LibraryTypes extending enum< + '10X', + 'ctDNA', + 'ctTSO', + 'exome', + 'Metagenm', + 'MethylSeq', + 'other', + 'TSO-DNA', + 'TSO-RNA', + 'WGS', + 'WTS', + 'BiModal' + >; + + abstract type MetadataIdentifiable { + required orcaBusId: str { + constraint exclusive on (str_lower(__subject__)); + }; + required internalId: str { + constraint exclusive on (str_lower(__subject__)); + }; + externalId: str; + } + + type Library extending MetadataIdentifiable { + phenotype: Phenotype; + workflow: WorkflowTypes; + quality: Quality; + type: LibraryTypes; + assay: str; + coverage: decimal; + + single link specimen: Specimen { + on target delete allow + }; + + } + + type Specimen extending MetadataIdentifiable { + source: str; + + # Defining this to link to a single subject where it is possible to be multiple + # If from GSheet, how to tell if this specimen change subject OR addition to current one + single subject: Subject { + on target delete allow + }; + + # The backlink to all libraries that are connected + multi link libraries := .; + CREATE SCALAR TYPE audit::ActionType EXTENDING enum; + CREATE ABSTRACT TYPE audit::AuditEvent { + CREATE REQUIRED PROPERTY actionCategory: audit::ActionType; + CREATE REQUIRED PROPERTY actionDescription: std::str; + CREATE REQUIRED PROPERTY actionOutcome: audit::ActionOutcome; + CREATE PROPERTY details: std::json; + CREATE REQUIRED PROPERTY inProgress: std::bool; + CREATE REQUIRED PROPERTY occurredDateTime: std::datetime { + SET default := (std::datetime_current()); + }; + CREATE REQUIRED PROPERTY occurredDuration: std::duration; + CREATE REQUIRED PROPERTY recordedDateTime: std::datetime { + SET default := (std::datetime_current()); + SET readonly := true; + }; + CREATE REQUIRED PROPERTY updatedDateTime: std::datetime { + CREATE REWRITE + INSERT + USING (std::datetime_of_statement()); + CREATE REWRITE + UPDATE + USING (std::datetime_of_statement()); + }; + ALTER PROPERTY occurredDuration { + CREATE REWRITE + INSERT + USING (SELECT + (__subject__.occurredDateTime - __subject__.recordedDateTime) + ); + CREATE REWRITE + UPDATE + USING (SELECT + (__subject__.occurredDateTime - __subject__.recordedDateTime) + ); + }; + }; + CREATE TYPE audit::SystemAuditEvent EXTENDING audit::AuditEvent; + CREATE ABSTRACT TYPE metadata::MetadataIdentifiable { + CREATE PROPERTY externalId: std::str; + CREATE REQUIRED PROPERTY internalId: std::str { + CREATE CONSTRAINT std::exclusive ON (std::str_lower(__subject__)); + }; + CREATE REQUIRED PROPERTY orcaBusId: std::str { + CREATE CONSTRAINT std::exclusive ON (std::str_lower(__subject__)); + }; + }; + CREATE SCALAR TYPE metadata::LibraryTypes EXTENDING enum<`10X`, ctDNA, ctTSO, exome, Metagenm, MethylSeq, other, `TSO-DNA`, `TSO-RNA`, WGS, WTS, BiModal>; + CREATE SCALAR TYPE metadata::Phenotype EXTENDING enum; + CREATE SCALAR TYPE metadata::Quality EXTENDING enum<`very-poor`, poor, good, borderline>; + CREATE SCALAR TYPE metadata::WorkflowTypes EXTENDING enum; + CREATE TYPE metadata::Library EXTENDING metadata::MetadataIdentifiable { + CREATE PROPERTY assay: std::str; + CREATE PROPERTY coverage: std::decimal; + CREATE PROPERTY phenotype: metadata::Phenotype; + CREATE PROPERTY quality: metadata::Quality; + CREATE PROPERTY type: metadata::LibraryTypes; + CREATE PROPERTY workflow: metadata::WorkflowTypes; + }; + CREATE TYPE metadata::Specimen EXTENDING metadata::MetadataIdentifiable { + CREATE PROPERTY source: std::str; + }; + ALTER TYPE metadata::Library { + CREATE SINGLE LINK specimen: metadata::Specimen { + ON TARGET DELETE ALLOW; + }; + }; + ALTER TYPE metadata::Specimen { + CREATE MULTI LINK libraries := (.$actionCategory ?? ActionType.E, + actionDescription := $actionDescription ?? "", + actionOutcome := $actionOutcome ?? ActionOutcome.success, + + occurredDateTime := $occurredDateTime ?? datetime_current(), + details := $details ?? {}, + inProgress := $inProgress ?? false + +}; diff --git a/lib/workload/stateless/metadata_manager/src/dbschema/queries/audit/updateSystemAuditEvent.edgeql b/lib/workload/stateless/metadata_manager/src/dbschema/queries/audit/updateSystemAuditEvent.edgeql new file mode 100644 index 000000000..7e3af682b --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/dbschema/queries/audit/updateSystemAuditEvent.edgeql @@ -0,0 +1,11 @@ +# Update a system audit event. +with module audit +update SystemAuditEvent +filter .id = $auditDbId +set +{ + actionOutcome := $actionOutcome, + details := $details, + occurredDateTime := $occurredDateTime, + inProgress := $inProgress +} diff --git a/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/library/insertLibraryQuery.edgeql b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/library/insertLibraryQuery.edgeql new file mode 100644 index 000000000..6ee8f5285 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/library/insertLibraryQuery.edgeql @@ -0,0 +1,22 @@ +select ( + with module metadata + insert metadata::Library { + orcaBusId := $orcaBusId, + internalId := $internalId, + phenotype := $phenotype, + workflow := $workflow, + quality := $quality, + type := $type, + assay := $assay, + coverage := $coverage, + + specimen := ( + select assert_single(( + select Specimen filter .orcaBusId = $specimenOrcaBusId + )) + ) + } +){ + *, + specimenId := .specimen.internalId +} diff --git a/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/library/selectLibraryByIdQuery.edgeql b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/library/selectLibraryByIdQuery.edgeql new file mode 100644 index 000000000..0454d3117 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/library/selectLibraryByIdQuery.edgeql @@ -0,0 +1,7 @@ +select assert_single(( + select metadata::Library{ + *, + specimenId := .specimen.internalId + } + filter .internalId = $libraryId +)) diff --git a/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/library/updateLibraryQuery.edgeql b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/library/updateLibraryQuery.edgeql new file mode 100644 index 000000000..4736279f4 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/library/updateLibraryQuery.edgeql @@ -0,0 +1,25 @@ +select assert_single(( + with module metadata + update Library + filter + .orcaBusId = $orcaBusId + set { + internalId := $internalId ?? .internalId, + + phenotype := $phenotype ?? .phenotype, + workflow := $workflow ?? .workflow, + quality := $quality ?? .quality, + type := $type ?? .type, + assay := $assay ?? .assay, + coverage := $coverage ?? .coverage, + + specimen := ( + select assert_single(( + select Specimen filter .orcaBusId = $specimenOrcaBusId + )) + ) + } +)){ + *, + specimenId := .specimen.internalId +} diff --git a/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/specimen/insertSpecimenQuery.edgeql b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/specimen/insertSpecimenQuery.edgeql new file mode 100644 index 000000000..30b4631b7 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/specimen/insertSpecimenQuery.edgeql @@ -0,0 +1,18 @@ +select ( + with module metadata + insert Specimen { + orcaBusId := $orcaBusId, + internalId := $internalId, + externalId := $externalId, + source := $source, + + subject := ( + select assert_single(( + select Subject filter .orcaBusId = $subjectOrcaBusId + )) + ) + } +){ + *, + subjectId := .subject.internalId +} diff --git a/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/specimen/selectSpecimenByIdQuery.edgeql b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/specimen/selectSpecimenByIdQuery.edgeql new file mode 100644 index 000000000..05c367a68 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/specimen/selectSpecimenByIdQuery.edgeql @@ -0,0 +1,9 @@ +select assert_single(( + select metadata::Specimen{ + *, + subjectId := .subject.orcaBusId, + libraryIds := .libraries.orcaBusId + } + filter + .internalId = $internalId +)) diff --git a/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/specimen/updateSpecimenQuery.edgeql b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/specimen/updateSpecimenQuery.edgeql new file mode 100644 index 000000000..0e578abb5 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/specimen/updateSpecimenQuery.edgeql @@ -0,0 +1,20 @@ +select assert_single(( + with module metadata + update Specimen + filter + .orcaBusId = $orcaBusId + set { + internalId := $internalId ?? .internalId, + externalId := $externalId ?? .externalId, + source := $source ?? .source, + + subject := ( + select assert_single(( + select Subject filter .orcaBusId = $subjectOrcaBusId + )) + ) + } +)){ + *, + subjectId := .subject.internalId +} diff --git a/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/subject/insertSubjectQuery.edgeql b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/subject/insertSubjectQuery.edgeql new file mode 100644 index 000000000..728e0ae98 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/subject/insertSubjectQuery.edgeql @@ -0,0 +1,7 @@ +select ( + insert metadata::Subject { + orcaBusId := $orcaBusId, + internalId := $internalId, + externalId := $externalId + } +){ * } diff --git a/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/subject/selectSubjectByIdQuery.edgeql b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/subject/selectSubjectByIdQuery.edgeql new file mode 100644 index 000000000..90e2b6558 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/subject/selectSubjectByIdQuery.edgeql @@ -0,0 +1,9 @@ +select assert_single(( + select metadata::Subject{ + *, + specimenIds := .specimens.orcaBusId + } + filter ( + .internalId = $internalId + ) +)) diff --git a/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/subject/updateSubjectQuery.edgeql b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/subject/updateSubjectQuery.edgeql new file mode 100644 index 000000000..9c7cb3622 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/dbschema/queries/metadata/subject/updateSubjectQuery.edgeql @@ -0,0 +1,12 @@ +select assert_single(( + update metadata::Subject + filter + .orcaBusId = $orcaBusId + set { + internalId := $internalId ?? .internalId, + externalId := $externalId ?? .externalId + } +)){ + *, + specimenIds := .specimens.orcaBusId +} diff --git a/lib/workload/stateless/metadata_manager/src/edgedb.toml b/lib/workload/stateless/metadata_manager/src/edgedb.toml new file mode 100644 index 000000000..5ad3cbd21 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/edgedb.toml @@ -0,0 +1,2 @@ +[edgedb] +server-version = "3.1" diff --git a/lib/workload/stateless/metadata_manager/src/jest.config.ts b/lib/workload/stateless/metadata_manager/src/jest.config.ts new file mode 100644 index 000000000..26379f37a --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/jest.config.ts @@ -0,0 +1,6 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', +}; + +// jest.setTimeout(30000); diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/__init__.py b/lib/workload/stateless/metadata_manager/src/library_manager/__init__.py deleted file mode 100644 index 1e790e4fa..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -import pymysql - -# see https://github.com/PyMySQL/PyMySQL/issues/790 -pymysql.version_info = (1, 4, 6, "final", 0) -pymysql.install_as_MySQLdb() diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/fields.py b/lib/workload/stateless/metadata_manager/src/library_manager/fields.py deleted file mode 100644 index ba79fa4f7..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/fields.py +++ /dev/null @@ -1,48 +0,0 @@ -import hashlib - -from django.db import models - - -class HashField(models.CharField): - description = ( - "HashField is related to some base fields (other columns) in a model and" - "stores its hashed value for better indexing performance." - ) - - def __init__(self, base_fields, *args, **kwargs): - """ - :param base_fields: name of fields storing the value to be hashed - """ - self.base_fields = base_fields - kwargs["max_length"] = 64 - super(HashField, self).__init__(*args, **kwargs) - - def deconstruct(self): - name, path, args, kwargs = super().deconstruct() - del kwargs["max_length"] - if self.base_fields is not None: - kwargs["base_fields"] = self.base_fields - return name, path, args, kwargs - - def pre_save(self, instance, add): - self.calculate_hash(instance) - return super(HashField, self).pre_save(instance, add) - - def calculate_hash(self, instance): - sha256 = hashlib.sha256() - for field in self.base_fields: - value = getattr(instance, field) - sha256.update(value.encode("utf-8")) - setattr(instance, self.attname, sha256.hexdigest()) - - -class HashFieldHelper(object): - def __init__(self): - self.__sha256 = hashlib.sha256() - - def add(self, value): - self.__sha256.update(value.encode("utf-8")) - return self - - def calculate_hash(self): - return self.__sha256.hexdigest() diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/migrations/0001_initial.py b/lib/workload/stateless/metadata_manager/src/library_manager/migrations/0001_initial.py deleted file mode 100644 index 378b30ef3..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/migrations/0001_initial.py +++ /dev/null @@ -1,182 +0,0 @@ -# Generated by Django 4.2.3 on 2023-07-12 07:16 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - initial = True - - dependencies = [] - - operations = [ - migrations.CreateModel( - name="Library", - fields=[ - ("id", models.BigAutoField(primary_key=True, serialize=False)), - ("timestamp", models.DateTimeField(editable=False)), - ("library_id", models.CharField(max_length=255)), - ( - "sample_name", - models.CharField(blank=True, max_length=255, null=True), - ), - ("sample_id", models.CharField(max_length=255)), - ( - "external_sample_id", - models.CharField(blank=True, max_length=255, null=True), - ), - ("subject_id", models.CharField(blank=True, max_length=255, null=True)), - ( - "external_subject_id", - models.CharField(blank=True, max_length=255, null=True), - ), - ( - "phenotype", - models.CharField( - choices=[ - ("negative-control", "N Control"), - ("normal", "Normal"), - ("tumor", "Tumor"), - ], - max_length=255, - ), - ), - ( - "quality", - models.CharField( - choices=[ - ("ascites", "Acites"), - ("blood", "Blood"), - ("bone-marrow", "Bone"), - ("buccal", "Buccal"), - ("cell-line", "Cell Line"), - ("cfDNA", "Cf Dna"), - ("cyst-fluid", "Cyst"), - ("DNA", "Dna"), - ("eyebrow-hair", "Eyebrow"), - ("FFPE", "Ffpe"), - ("FNA", "Fna"), - ("OCT", "Oct"), - ("organoid", "Organoid"), - ("PDX-tissue", "Pdx"), - ("plasma-serum", "Plasma"), - ("RNA", "Rna"), - ("tissue", "Tissue"), - ("water", "Water"), - ], - max_length=255, - ), - ), - ( - "source", - models.CharField( - choices=[ - ("ascites", "Acites"), - ("blood", "Blood"), - ("bone-marrow", "Bone"), - ("buccal", "Buccal"), - ("cell-line", "Cell Line"), - ("cfDNA", "Cf Dna"), - ("cyst-fluid", "Cyst"), - ("DNA", "Dna"), - ("eyebrow-hair", "Eyebrow"), - ("FFPE", "Ffpe"), - ("FNA", "Fna"), - ("OCT", "Oct"), - ("organoid", "Organoid"), - ("PDX-tissue", "Pdx"), - ("plasma-serum", "Plasma"), - ("RNA", "Rna"), - ("tissue", "Tissue"), - ("water", "Water"), - ], - max_length=255, - ), - ), - ( - "project_name", - models.CharField(blank=True, max_length=255, null=True), - ), - ( - "project_owner", - models.CharField(blank=True, max_length=255, null=True), - ), - ( - "experiment_id", - models.CharField(blank=True, max_length=255, null=True), - ), - ( - "type", - models.CharField( - choices=[ - ("ctDNA", "Ct Dna"), - ("ctTSO", "Ct Tso"), - ("exome", "Exome"), - ("other", "Other"), - ("10X", "Ten X"), - ("TSO-DNA", "Tso Dna"), - ("TSO-RNA", "Tso Rna"), - ("WGS", "Wgs"), - ("WTS", "Wts"), - ], - max_length=255, - ), - ), - ( - "assay", - models.CharField( - choices=[ - ("AgSsCRE", "Ag Ss Cre"), - ("ctTSO", "Ct Tso"), - ("NebDNA", "Neb Dna"), - ("NebDNAu", "Neb Dna U"), - ("NebRNA", "Neb Rna"), - ("PCR-Free-Tagmentation", "Pcr Free"), - ("10X-3prime-expression", "Ten X 3Prime"), - ("10X-5prime-expression", "Ten X 5Prime"), - ("10X-ATAC", "Ten X Atac"), - ("10X-CITE-feature", "Ten X Cite Feat"), - ("10X-CITE-hashing", "Ten X Cite Hash"), - ("10X-CNV", "Ten X Cnv"), - ("10X-VDJ", "Ten X Vdj"), - ("10X-VDJ-TCR", "Ten X Vdj Tcr"), - ("TSODNA", "Tso Dna"), - ("TSORNA", "Tso Rna"), - ("TsqNano", "Tsq Nano"), - ("TsqSTR", "Tsq Str"), - ], - max_length=255, - ), - ), - ( - "override_cycles", - models.CharField(blank=True, max_length=255, null=True), - ), - ( - "workflow", - models.CharField( - choices=[ - ("bcl", "Bcl"), - ("clinical", "Clinical"), - ("control", "Control"), - ("manual", "Manual"), - ("qc", "Qc"), - ("research", "Research"), - ], - max_length=255, - ), - ), - ("coverage", models.CharField(blank=True, max_length=255, null=True)), - ( - "truseqindex", - models.CharField(blank=True, max_length=255, null=True), - ), - ], - ), - migrations.AddConstraint( - model_name="library", - constraint=models.UniqueConstraint( - fields=("timestamp", "library_id", "sample_id"), - name="library_id and sample_id must be unique at a given timestamp", - ), - ), - ] diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/migrations/__init__.py b/lib/workload/stateless/metadata_manager/src/library_manager/migrations/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/models/__init__.py b/lib/workload/stateless/metadata_manager/src/library_manager/models/__init__.py deleted file mode 100644 index 78bac039f..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/models/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# https://docs.djangoproject.com/en/4.1/topics/db/models/#organizing-models-in-a-package diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/models/base.py b/lib/workload/stateless/metadata_manager/src/library_manager/models/base.py deleted file mode 100644 index 44b50c35b..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/models/base.py +++ /dev/null @@ -1,105 +0,0 @@ -import logging -import operator -from functools import reduce -from typing import List - -from django.core.exceptions import FieldError -from django.db import models -from django.db.models import ( - Q, - ManyToManyField, - ForeignKey, - ForeignObject, - OneToOneField, - ForeignObjectRel, - ManyToOneRel, - ManyToManyRel, - OneToOneRel, - QuerySet, -) -from rest_framework.settings import api_settings - -from library_manager.pagination import PaginationConstant - -logger = logging.getLogger(__name__) - - -class OrcaBusBaseManager(models.Manager): - @staticmethod - def reduce_multi_values_qor(key: str, values: List[str]): - if isinstance( - values, - ( - str, - int, - float, - ), - ): - values = [values] - return reduce( - operator.or_, (Q(**{"%s__iexact" % key: value}) for value in values) - ) - - def get_model_fields_query(self, qs: QuerySet, **kwargs) -> QuerySet: - def exclude_params(params): - for param in params: - kwargs.pop(param) if param in kwargs.keys() else None - - exclude_params( - [ - api_settings.SEARCH_PARAM, - api_settings.ORDERING_PARAM, - PaginationConstant.PAGE, - PaginationConstant.ROWS_PER_PAGE, - "sortCol", - "sortAsc", - ] - ) - - query_string = None - - for key, values in kwargs.items(): - each_query = self.reduce_multi_values_qor(key, values) - if query_string: - query_string = query_string & each_query - else: - query_string = each_query - - try: - if query_string: - qs = qs.filter(query_string) - except FieldError as e: - logger.debug(e) - qs = qs.none() - - return qs - - -class OrcaBusBaseModel(models.Model): - class Meta: - abstract = True - - @classmethod - def get_fields(cls): - return [f.name for f in cls._meta.get_fields()] - - @classmethod - def get_base_fields(cls): - base_fields = set() - for f in cls._meta.get_fields(): - if isinstance( - f, - ( - ForeignKey, - ForeignObject, - OneToOneField, - ManyToManyField, - ForeignObjectRel, - ManyToOneRel, - ManyToManyRel, - OneToOneRel, - ), - ): - continue - base_fields.add(f.name) - return list(base_fields) diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/models/library.py b/lib/workload/stateless/metadata_manager/src/library_manager/models/library.py deleted file mode 100644 index ea100b658..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/models/library.py +++ /dev/null @@ -1,232 +0,0 @@ -from django.db import models, connection -from django.db.models import QuerySet, Value, Max, OuterRef, Subquery -from django.db.models.aggregates import Count -from django.db.models.functions import Concat - -from library_manager.models.base import OrcaBusBaseModel, OrcaBusBaseManager - - -class LibraryType(models.TextChoices): - CT_DNA = "ctDNA" - CT_TSO = "ctTSO" - EXOME = "exome" - OTHER = "other" - TEN_X = "10X" - TSO_DNA = "TSO-DNA" - TSO_RNA = "TSO-RNA" - WGS = "WGS" - WTS = "WTS" - - -class LibraryPhenotype(models.TextChoices): - N_CONTROL = "negative-control" - NORMAL = "normal" - TUMOR = "tumor" - - -class LibraryAssay(models.TextChoices): - AG_SS_CRE = "AgSsCRE" - CT_TSO = "ctTSO" - NEB_DNA = "NebDNA" - NEB_DNA_U = "NebDNAu" - NEB_RNA = "NebRNA" - PCR_FREE = "PCR-Free-Tagmentation" - TEN_X_3PRIME = "10X-3prime-expression" - TEN_X_5PRIME = "10X-5prime-expression" - TEN_X_ATAC = "10X-ATAC" - TEN_X_CITE_FEAT = "10X-CITE-feature" - TEN_X_CITE_HASH = "10X-CITE-hashing" - TEN_X_CNV = "10X-CNV" - TEN_X_VDJ = "10X-VDJ" - TEN_X_VDJ_TCR = "10X-VDJ-TCR" - TSO_DNA = "TSODNA" - TSO_RNA = "TSORNA" - TSQ_NANO = "TsqNano" - TSQ_STR = "TsqSTR" - - -class LibraryQuality(models.TextChoices): - BORDERLINE = "borderline" - GOOD = "good" - POOR = "poor" - VERY_POOR = "VeryPoor" - - -class LibrarySource(models.TextChoices): - ACITES = "ascites" - BLOOD = "blood" - BONE = "bone-marrow" - BUCCAL = "buccal" - CELL_LINE = "cell-line" - CF_DNA = "cfDNA" - CYST = "cyst-fluid" - DNA = "DNA" - EYEBROW = "eyebrow-hair" - FFPE = "FFPE" - FNA = "FNA" - OCT = "OCT" - ORGANOID = "organoid" - PDX = "PDX-tissue" - PLASMA = "plasma-serum" - RNA = "RNA" - TISSUE = "tissue" - WATER = "water" - - -class LibraryWorkflow(models.TextChoices): - BCL = "bcl" - CLINICAL = "clinical" - CONTROL = "control" - MANUAL = "manual" - QC = "qc" - RESEARCH = "research" - - -# TODO: Possibly to get sequenced library from the API and searched this libraries in this library Model -def remove_not_sequenced(qs: QuerySet) -> QuerySet: - # # filter library to those entries that were sequenced, i.e. have a LibraryRun entry - # inner_qs = LibraryRun.objects.values_list('library_id', flat=True) - # qs = qs.filter(library_id__in=inner_qs) - - # 1. Fetch the sequenced libraries from the library_run API - # 2. Filter the library which contain the sequenced libraryRun - - return qs - - -def filter_only_latest_library_id(qs: QuerySet) -> QuerySet: - """ - This function will reduce the QuerySet to only show the latest library_id in record - - :param qs: Initial QuerySet - :return: The filtered QuerySet - """ - qs = qs.filter( - id__in=qs.values("library_id") - .annotate( - latest_id=Subquery( - qs.filter(library_id=OuterRef("library_id")) - .order_by("-timestamp") - .values("id")[:1] - ) - ) - .values("latest_id") - ) - - return qs - - -class LibraryManager(OrcaBusBaseManager): - def get_by_keyword(self, **kwargs) -> QuerySet: - """ - Get QuerySet based on given keyword to filter the result. - - E.g. get_by_keyword(library_id="L001", library_id="L002"), this will - filter the querySet to show matched on library_id "L001" and "L002" - - :param show_history: The option to show history on the specific library_id - :param sequenced: The option to filter only for sequenced library - :return qs: A filtered django QuerySet from the Library Model - """ - qs: QuerySet = super().get_queryset() - - # If history of the db is NOT requested filter the rest - show_history = kwargs.pop("show_history", False) - if not show_history: - # GroupBy "library_id" and return the latest in record - qs = filter_only_latest_library_id(qs) - - # If only records for sequenced libs are requested, remove the ones that are not - sequenced = kwargs.pop("sequenced", False) - if sequenced: - qs = remove_not_sequenced(qs) - - # Filter with any other keywords - qs = self.get_model_fields_query(qs, **kwargs) - - return qs - - def get_single(self, **kwargs): - """ - Typically this is the same as the default Django `.get` function, - but it will do a distinct filter to pick the latest library_id in record - """ - qs: QuerySet = super().get_queryset() - qs = filter_only_latest_library_id(qs) - - return qs.get(**kwargs) - - def get_by_aggregate_count(self, field): - return self.values(field).annotate(count=Count(field)).order_by(field) - - def get_by_cube(self, field_left, field_right, field_sort): - return ( - self.values(field_left, field_right) - .annotate(count=Count(1)) - .order_by(field_sort) - ) - - -class Library(OrcaBusBaseModel): - """ - Models a row in the lab tracking sheet data. Fields are the columns. - - This will store all records (including changes at given timestamp) in the database. - """ - - # Portal internal auto incremental PK ID. Scheme may change as need be and may rebuild thereof. - # External system or business logic should not rely upon this ID field. - # Use any of unique fields or <>_id fields below. - id = models.BigAutoField(primary_key=True) - - # TODO: as far as Clarity is concerned, "external" lib id = tracking sheet. - # do we want to store clarity-generated lib id, and what do we want to call it? - # external_library_id = models.CharField(max_length=255) - - timestamp = models.DateTimeField(editable=False) - - library_id = models.CharField(max_length=255) - sample_name = models.CharField(max_length=255, null=True, blank=True) - sample_id = models.CharField(max_length=255) - external_sample_id = models.CharField(max_length=255, null=True, blank=True) - subject_id = models.CharField(max_length=255, null=True, blank=True) - external_subject_id = models.CharField(max_length=255, null=True, blank=True) - - phenotype = models.CharField(choices=LibraryPhenotype.choices, max_length=255) - quality = models.CharField(choices=LibrarySource.choices, max_length=255) - source = models.CharField(choices=LibrarySource.choices, max_length=255) - project_name = models.CharField(max_length=255, null=True, blank=True) - project_owner = models.CharField(max_length=255, null=True, blank=True) - experiment_id = models.CharField(max_length=255, null=True, blank=True) - type = models.CharField(choices=LibraryType.choices, max_length=255) - assay = models.CharField(choices=LibraryAssay.choices, max_length=255) - override_cycles = models.CharField(max_length=255, null=True, blank=True) - workflow = models.CharField(choices=LibraryWorkflow.choices, max_length=255) - coverage = models.CharField(max_length=255, null=True, blank=True) - truseqindex = models.CharField(max_length=255, null=True, blank=True) - - objects = LibraryManager() - - class Meta: - constraints = [ - models.UniqueConstraint( - fields=[ - "timestamp", - "library_id", - "sample_id", - ], - name="library_id and sample_id must be unique at a given timestamp", - ) - ] - - def __str__(self): - return f"""id={self.id}, library_id={self.library_id}, sample_id={self.sample_id}, subject_id={self.subject_id}, timestamp={self.timestamp}""" - - @classmethod - def get_table_name(cls): - return cls._meta.db_table - - @classmethod - def truncate(cls): - with connection.cursor() as cursor: - cursor.execute(f"TRUNCATE TABLE {cls.get_table_name()};") diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/pagination.py b/lib/workload/stateless/metadata_manager/src/library_manager/pagination.py deleted file mode 100644 index 3892ddde9..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/pagination.py +++ /dev/null @@ -1,33 +0,0 @@ -from abc import ABC - -from rest_framework.pagination import PageNumberPagination -from rest_framework.response import Response -from rest_framework.settings import api_settings - - -class PaginationConstant(ABC): - ROWS_PER_PAGE = "rowsPerPage" - PAGE = "page" - COUNT = "count" - - -class StandardResultsSetPagination(PageNumberPagination): - page_size = api_settings.PAGE_SIZE - page_size_query_param = PaginationConstant.ROWS_PER_PAGE - max_page_size = 1000 - - def get_paginated_response(self, data): - return Response( - { - "links": { - "next": self.get_next_link(), - "previous": self.get_previous_link(), - }, - "pagination": { - PaginationConstant.COUNT: self.page.paginator.count, - PaginationConstant.PAGE: self.page.number, - PaginationConstant.ROWS_PER_PAGE: self.get_page_size(self.request), - }, - "results": data, - } - ) diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/renderers.py b/lib/workload/stateless/metadata_manager/src/library_manager/renderers.py deleted file mode 100644 index 8d94c4f4d..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/renderers.py +++ /dev/null @@ -1,37 +0,0 @@ -from rest_framework.renderers import BaseRenderer, JSONRenderer, StaticHTMLRenderer - - -class BinaryRenderer(BaseRenderer): - media_type = "application/octet-stream" - charset = None - render_style = "binary" - - def render(self, data, media_type=None, renderer_context=None): - return data - - -class ImageRenderer(BaseRenderer): - media_type = "image/*" - charset = None - render_style = "binary" - - def render(self, data, media_type=None, renderer_context=None): - return data - - -class JPEGRenderer(ImageRenderer): - media_type = "image/jpeg" - format = "jpg" - - -class PNGRenderer(ImageRenderer): - media_type = "image/png" - format = "png" - - -class GIFRenderer(ImageRenderer): - media_type = "image/gif" - format = "gif" - - -content_renderers = [JSONRenderer, StaticHTMLRenderer, ImageRenderer, BinaryRenderer] diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/routers.py b/lib/workload/stateless/metadata_manager/src/library_manager/routers.py deleted file mode 100644 index 78bb4adc6..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/routers.py +++ /dev/null @@ -1,8 +0,0 @@ -from rest_framework import routers - - -class OptionalSlashDefaultRouter(routers.DefaultRouter): - def __init__(self, *args, **kwargs): - super(routers.DefaultRouter, self) - super().__init__(*args, **kwargs) - self.trailing_slash = "/?" diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/serializers.py b/lib/workload/stateless/metadata_manager/src/library_manager/serializers.py deleted file mode 100644 index df67bd10d..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/serializers.py +++ /dev/null @@ -1,41 +0,0 @@ -from typing import Dict, List - -from rest_framework import serializers -from rest_framework.fields import empty - -from library_manager.models.library import Library - -READ_ONLY_SERIALIZER = "READ ONLY SERIALIZER" - - -class LibrarySyncSerializer(serializers.Serializer): - sheets = serializers.ListField( - default=["2019", "2020", "2021", "2022", "2023"] - ) # OpenAPI swagger doc hint only - truncate = serializers.BooleanField(default=True) - - def update(self, instance, validated_data): - pass - - def create(self, validated_data): - pass - - -class SubjectIdSerializer(serializers.BaseSerializer): - def to_representation(self, instance): - return instance.subject_id - - def to_internal_value(self, data): - raise NotImplementedError(READ_ONLY_SERIALIZER) - - def update(self, instance, validated_data): - raise NotImplementedError(READ_ONLY_SERIALIZER) - - def create(self, validated_data): - raise NotImplementedError(READ_ONLY_SERIALIZER) - - -class LibraryModelSerializer(serializers.ModelSerializer): - class Meta: - model = Library - fields = "__all__" diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/settings/__init__.py b/lib/workload/stateless/metadata_manager/src/library_manager/settings/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/settings/aws.py b/lib/workload/stateless/metadata_manager/src/library_manager/settings/aws.py deleted file mode 100644 index e703d0d5d..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/settings/aws.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -"""AWS Django settings - -Usage: -- export DJANGO_SETTINGS_MODULE=library_manager.settings.aws -""" -import copy - -from environ import Env -from libumccr.aws import libssm - -from .base import * # noqa - -SECRET_KEY = libssm.get_secret("/orcabus/backend/django_secret_key") - -DEBUG = False - -db_conn_cfg = Env.db_url_config(libssm.get_secret("/orcabus/backend/full_db_url")) -db_conn_cfg["OPTIONS"] = { - "max_allowed_packet": MYSQL_CLIENT_MAX_ALLOWED_PACKET, -} - -DATABASES = {"default": db_conn_cfg} - -CORS_ORIGIN_ALLOW_ALL = False -CORS_ALLOW_CREDENTIALS = False - -# FIXME: https://github.com/umccr/infrastructure/issues/272 -CORS_ALLOWED_ORIGINS = [ - "https://portal.umccr.org", - "https://portal.prod.umccr.org", - "https://portal.stg.umccr.org", - "https://portal.dev.umccr.org", - "https://data.umccr.org", - "https://data.prod.umccr.org", - "https://data.dev.umccr.org", - "https://data.stg.umccr.org", -] - -CSRF_TRUSTED_ORIGINS = copy.deepcopy(CORS_ALLOWED_ORIGINS) diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/settings/base.py b/lib/workload/stateless/metadata_manager/src/library_manager/settings/base.py deleted file mode 100644 index 77d270da5..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/settings/base.py +++ /dev/null @@ -1,152 +0,0 @@ -"""DO NOT USE base SETTING IN PRODUCTION""" -import os -import uuid -from pathlib import Path - -import aws_xray_sdk -from corsheaders.defaults import default_headers - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv("DJANGO_SECRET_KEY", uuid.uuid4()) - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv("DJANGO_DEBUG", True) - -ALLOWED_HOSTS = ["*"] - -DB_PREFIX = "library_manager_" - -INSTALLED_APPS = [ - "django_database_prefix", - "corsheaders", - "django.contrib.admin", - "django.contrib.auth", - "django.contrib.contenttypes", - "django.contrib.sessions", - "django.contrib.messages", - "django.contrib.staticfiles", - "rest_framework", - "library_manager", - "aws_xray_sdk.ext.django", -] - -MIDDLEWARE = [ - "aws_xray_sdk.ext.django.middleware.XRayMiddleware", - "django.middleware.security.SecurityMiddleware", - "django.contrib.sessions.middleware.SessionMiddleware", - "corsheaders.middleware.CorsMiddleware", - "django.middleware.common.CommonMiddleware", - "django.middleware.csrf.CsrfViewMiddleware", - "django.contrib.auth.middleware.AuthenticationMiddleware", - "django.contrib.messages.middleware.MessageMiddleware", - "django.middleware.clickjacking.XFrameOptionsMiddleware", -] - -ROOT_URLCONF = "library_manager.urls.base" - -TEMPLATES = [ - { - "BACKEND": "django.template.backends.django.DjangoTemplates", - "DIRS": [], - "APP_DIRS": True, - "OPTIONS": { - "context_processors": [ - "django.template.context_processors.debug", - "django.template.context_processors.request", - "django.contrib.auth.context_processors.auth", - "django.contrib.messages.context_processors.messages", - ], - }, - }, -] - -WSGI_APPLICATION = "library_manager.wsgi.application" - -DATABASES = { - "default": { - "ENGINE": "django.db.backends.sqlite3", - "NAME": BASE_DIR / "db.sqlite3", - } -} - -AUTH_PASSWORD_VALIDATORS = [ - { - "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", - }, - { - "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", - }, - { - "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", - }, - { - "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", - }, -] - -LANGUAGE_CODE = "en-us" - -TIME_ZONE = "UTC" - -USE_I18N = True - -USE_TZ = True - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/4.2/howto/static-files/ - -STATIC_URL = "static/" - -DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" - -# --- - -# 1GB packet limit for MySQL. See https://dev.mysql.com/doc/refman/5.7/en/packet-too-large.html -MYSQL_CLIENT_MAX_ALLOWED_PACKET = 1073741824 - -LOGGING = { - "version": 1, - "disable_existing_loggers": False, - "formatters": { - "console": { - "format": "%(asctime)s %(name)-12s %(levelname)-8s %(message)s", - }, - }, - "handlers": { - "console": { - "class": "logging.StreamHandler", - "formatter": "console", - }, - }, - "loggers": { - "": { - "level": "INFO", - "handlers": ["console"], - }, - }, -} - -REST_FRAMEWORK = { - "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination", - "PAGE_SIZE": 10, -} - -CORS_ORIGIN_ALLOW_ALL = True - -CORS_ALLOW_HEADERS = list(default_headers) + [ - "x-amz-security-token", - "x-amz-date", - "Content-Disposition", -] - -XRAY_RECORDER = { - "AUTO_INSTRUMENT": True, - "AWS_XRAY_CONTEXT_MISSING": os.getenv("AWS_XRAY_CONTEXT_MISSING", "LOG_ERROR"), - "AWS_XRAY_TRACING_NAME": os.getenv("AWS_XRAY_TRACING_NAME", "library_manager"), -} - -# turn off xray more generally and, you can overwrite with env var AWS_XRAY_SDK_ENABLED=true at runtime -aws_xray_sdk.global_sdk_config.set_sdk_enabled(False) diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/settings/it.py b/lib/workload/stateless/metadata_manager/src/library_manager/settings/it.py deleted file mode 100644 index f91ad78ab..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/settings/it.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -"""integration tests Django settings - -Usage: -- export DJANGO_SETTINGS_MODULE=library_manager.settings.it -""" -from environ import Env - -from .base import * # noqa - -# pragma: allowlist nextline secret -db_conn_cfg = Env.db_url_config( - os.getenv( - "DB_URL", "mysql://root:root@localhost:3306/orcabus" # pragma: allowlist secret - ) -) - -DATABASES = {"default": db_conn_cfg} diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/settings/local.py b/lib/workload/stateless/metadata_manager/src/library_manager/settings/local.py deleted file mode 100644 index 951c259c6..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/settings/local.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -"""local development Django settings - -Usage: -- export DJANGO_SETTINGS_MODULE=library_manager.settings.local -""" -import sys - -from environ import Env - -from .base import * # noqa - -# pragma: allowlist nextline secret -db_conn_cfg = Env.db_url_config( - os.getenv( - "DB_URL", "mysql://root:root@localhost:3306/orcabus" # pragma: allowlist secret - ) -) -db_conn_cfg["OPTIONS"] = { - "max_allowed_packet": MYSQL_CLIENT_MAX_ALLOWED_PACKET, -} - -DATABASES = {"default": db_conn_cfg} - -INSTALLED_APPS += ( - "django_extensions", - "drf_yasg", -) - -ROOT_URLCONF = "library_manager.urls.local" - -RUNSERVER_PLUS_PRINT_SQL_TRUNCATE = sys.maxsize - -# --- drf_yasg swagger and redoc settings - -SWAGGER_SETTINGS = { - "SECURITY_DEFINITIONS": { - "Bearer": {"type": "apiKey", "name": "Authorization", "in": "header"} - }, - "USE_SESSION_AUTH": False, -} - -REDOC_SETTINGS = { - "LAZY_RENDERING": False, -} diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/tests/__init__.py b/lib/workload/stateless/metadata_manager/src/library_manager/tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/tests/case.py b/lib/workload/stateless/metadata_manager/src/library_manager/tests/case.py deleted file mode 100644 index bedf00260..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/tests/case.py +++ /dev/null @@ -1,16 +0,0 @@ -import logging - -from django.test import TestCase - -logger = logging.getLogger() -logger.setLevel(logging.INFO) - - -class LibraryUnitTestCase(TestCase): - def setUp(self) -> None: - logger.info("\n") - logger.info("-" * 64) - pass - - def tearDown(self) -> None: - pass diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/tests/factories.py b/lib/workload/stateless/metadata_manager/src/library_manager/tests/factories.py deleted file mode 100644 index b2ac5a4c2..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/tests/factories.py +++ /dev/null @@ -1,138 +0,0 @@ -from datetime import datetime, timezone -from enum import Enum - -import factory - -from library_manager.models.library import Library, LibraryType, LibraryPhenotype - - -utc_now_ts = int(datetime.utcnow().replace(tzinfo=timezone.utc).timestamp()) - - -class TestConstant(Enum): - wfr_id = f"wfr.j317paO8zB6yG25Zm6PsgSivJEoq4Ums" - wfr_id2 = f"wfr.Q5555aO8zB6yG25Zm6PsgSivGwDx_Uaa" - wfv_id = f"wfv.TKWp7hsFnVTCE8KhfXEurUfTCqSa6zVx" - wfl_id = f"wfl.Dc4GzACbjhzOf3NbqAYjSmzkE1oWKI9H" - umccrise_wfr_id = f"wfr.umccrisezB6yG25Zm6PsgSivJEoq4Ums" - umccrise_wfv_id = f"wfv.umccrisenVTCE8KhfXEurUfTCqSa6zVx" - umccrise_wfl_id = f"wfl.umccrisejhzOf3NbqAYjSmzkE1oWKI9H" - rnasum_wfr_id = f"wfr.rnasumzB6yG25Zm6PsgSivJEoq4Ums" - rnasum_wfv_id = f"wfv.rnasumnVTCE8KhfXEurUfTCqSa6zVx" - rnasum_wfl_id = f"wfl.rnasumjhzOf3NbqAYjSmzkE1oWKI9H" - version = "v1" - instrument_run_id = "200508_A01052_0001_BH5LY7ACGT" - instrument_run_id2 = "220101_A01052_0002_XR5LY7TGCA" - sqr_name = instrument_run_id - run_id = "r.ACGTlKjDgEy099ioQOeOWg" - run_id2 = "r.GACTlKjDgEy099io_0000" - override_cycles = "Y151;I8;I8;Y151" - subject_id = "SBJ00001" - library_id_normal = "L2100001" - lane_normal_library = 1 - library_id_tumor = "L2100002" - lane_tumor_library = 3 - sample_id = "PRJ210001" - sample_name_normal = f"{sample_id}_{library_id_normal}" - sample_name_tumor = f"{sample_id}_{library_id_tumor}" - wts_library_id_tumor = "L2100003" - wts_library_id_tumor2 = "L2200001" - wts_lane_tumor_library = 4 - wts_sample_id = "MDX210002" - - -class LibraryFactory(factory.django.DjangoModelFactory): - class Meta: - model = Library - - library_id = TestConstant.library_id_normal.value - sample_name = "Ambiguous Sample" - sample_id = TestConstant.sample_id.value - external_sample_id = "DNA123456" - subject_id = TestConstant.subject_id.value - external_subject_id = "PM1234567" - phenotype = LibraryPhenotype.NORMAL.value - quality = "good" - source = "blood" - project_name = "CUP" - project_owner = "UMCCR" - experiment_id = "TSqN123456LL" - type = "WGS" - assay = "TsqNano" - override_cycles = TestConstant.override_cycles.value - workflow = "clinical" - coverage = "40.0" - truseqindex = "A09" - timestamp = datetime.now(tz=timezone.utc) - - -class TumorLibraryFactory(factory.django.DjangoModelFactory): - class Meta: - model = Library - - library_id = TestConstant.library_id_tumor.value - sample_name = "Ambiguous Sample" - sample_id = TestConstant.sample_id.value - external_sample_id = "DNA123456" - subject_id = TestConstant.subject_id.value - external_subject_id = "PM1234567" - phenotype = LibraryPhenotype.TUMOR.value - quality = "good" - source = "blood" - project_name = "CUP" - project_owner = "UMCCR" - experiment_id = "TSqN123456LL" - type = "WGS" - assay = "TsqNano" - override_cycles = TestConstant.override_cycles.value - workflow = "clinical" - coverage = "40.0" - truseqindex = "A09" - - -class WtsTumorLibraryFactory(factory.django.DjangoModelFactory): - class Meta: - model = Library - - library_id = TestConstant.wts_library_id_tumor.value - sample_name = "Ambiguous WTS Sample" - sample_id = TestConstant.wts_sample_id.value - external_sample_id = "RNA123456" - subject_id = TestConstant.subject_id.value - external_subject_id = "PM1234567" - phenotype = LibraryPhenotype.TUMOR.value - quality = "good" - source = "blood" - project_name = "CUP" - project_owner = "UMCCR" - experiment_id = "TSqN123456LL" - type = LibraryType.WTS.value - assay = "NebRNA" - override_cycles = TestConstant.override_cycles.value - workflow = "clinical" - coverage = "40.0" - truseqindex = "A09" - - -class WtsTumorLibraryFactory2(factory.django.DjangoModelFactory): - class Meta: - model = Library - - library_id = TestConstant.wts_library_id_tumor2.value - sample_name = "Ambiguous WTS Sample 2" - sample_id = TestConstant.wts_sample_id.value - external_sample_id = "RNA123456" - subject_id = TestConstant.subject_id.value - external_subject_id = "PM1234567" - phenotype = LibraryPhenotype.TUMOR.value - quality = "good" - source = "blood" - project_name = "CUP" - project_owner = "UMCCR" - experiment_id = "TSqN123456LL" - type = LibraryType.WTS.value - assay = "NebRNA" - override_cycles = TestConstant.override_cycles.value - workflow = "clinical" - coverage = "40.0" - truseqindex = "A09" diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/tests/test_base.py b/lib/workload/stateless/metadata_manager/src/library_manager/tests/test_base.py deleted file mode 100644 index a1dc36968..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/tests/test_base.py +++ /dev/null @@ -1,49 +0,0 @@ -import logging - -from django.db.models import Q -from django.test import TestCase - -from library_manager.models.base import OrcaBusBaseManager, OrcaBusBaseModel -from library_manager.tests.case import LibraryUnitTestCase - -logger = logging.getLogger() -logger.setLevel(logging.INFO) - - -class OrcaBusBaseManagerTestCase(LibraryUnitTestCase): - def setUp(self) -> None: - pass - - def test_reduce_multi_values_qor(self): - """ - python manage.py test library_manager.tests.test_base.OrcaBusBaseManagerTestCase.test_reduce_multi_values_qor - """ - q = OrcaBusBaseManager.reduce_multi_values_qor( - "subject_id", ["SBJ000001", "SBJ000002"] - ) - logger.info(q) - self.assertIsNotNone(q) - self.assertIsInstance(q, Q) - self.assertIn(Q.OR, str(q)) - - def test_reduce_multi_values_qor_auto_pack(self): - """ - python manage.py test library_manager.tests.test_base.OrcaBusBaseManagerTestCase.test_reduce_multi_values_qor_auto_pack - """ - q = OrcaBusBaseManager.reduce_multi_values_qor("subject_id", "SBJ000001") - logger.info(q) - self.assertIsNotNone(q) - self.assertIsInstance(q, Q) - self.assertIn(Q.AND, str(q)) - - def test_base_model_must_abstract(self): - """ - python manage.py test library_manager.tests.test_base.OrcaBusBaseManagerTestCase.test_base_model_must_abstract - """ - try: - OrcaBusBaseModel() - except TypeError as e: - logger.exception( - f"THIS ERROR EXCEPTION IS INTENTIONAL FOR TEST. NOT ACTUAL ERROR. \n{e}" - ) - self.assertRaises(TypeError) diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/tests/test_models.py b/lib/workload/stateless/metadata_manager/src/library_manager/tests/test_models.py deleted file mode 100644 index b0fb00e52..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/tests/test_models.py +++ /dev/null @@ -1,133 +0,0 @@ -from datetime import datetime, timezone -import logging -import time - -from django.test import TestCase -from django.core.exceptions import ObjectDoesNotExist - -from library_manager.models.library import Library -from library_manager.tests.case import LibraryUnitTestCase -from library_manager.tests.factories import ( - LibraryFactory, - TumorLibraryFactory, - WtsTumorLibraryFactory, - TestConstant, -) - -logger = logging.getLogger() -logger.setLevel(logging.INFO) - - -class LibraryModelTests(LibraryUnitTestCase): - def test_save_library(self): - """ - python manage.py test library_manager.tests.test_models.LibraryModelTests.test_save_library - """ - logger.info("Testing creating a new library object") - - mock_library = Library() - mock_library.timestamp = datetime.now(tz=timezone.utc) - mock_library.save() - - self.assertEqual(1, Library.objects.count()) - - def test_get_library(self): - """ - python manage.py test library_manager.tests.test_models.LibraryModelTests.test_get_library - """ - logger.info("Testing get query for existing and non existing library") - - logger.debug("Create a mockup library") - LibraryFactory() - - logger.debug("Test get specific existing library by library_id") - tested_library = Library.objects.get( - library_id=TestConstant.library_id_normal.value - ) - self.assertEqual( - tested_library.library_id, - TestConstant.library_id_normal.value, - "Library exist as expected.", - ) - - logger.debug("Test get specific NON-existing library by library_id") - try: - tested_library = Library.objects.get(library_id="L000-NOT-EXIST") - except ObjectDoesNotExist: - logger.debug( - f"ObjectDoesNotExist exception raised which is the expected outcome" - ) - - def test_get_library_from_modified_library(self): - """ - python manage.py test library_manager.tests.test_models.LibraryModelTests.test_get_library_from_modified_library - """ - logger.info("Testing get query for modified library") - - mock_library_1 = Library() - mock_library_1.library_id = "L001" - mock_library_1.timestamp = datetime.now(tz=timezone.utc) - mock_library_1.project_name = "brwn-project" # name typos - mock_library_1.save() - - # Some buffer time to simulate different timestamp entries - time.sleep(1) - - mock_library_2 = Library() - mock_library_2.library_id = "L001" - mock_library_2.timestamp = datetime.now(tz=timezone.utc) - mock_library_2.project_name = "brown-project" - mock_library_2.save() - - library = Library.objects.get_single(library_id="L001") - self.assertEqual( - library.project_name, "brown-project", "Expect 1 library returned" - ) - - # NOT YET IMPLEMENT - - # def test_get_by_keyword_not_sequenced(self): - # # python manage.py test data_portal.models.tests.test_library.LibraryTestCase.test_get_by_keyword_not_sequenced - # - # logger.info("Test exclusion of library for unsequenced libraries") - # TumorLibraryFactory() # does not have a LibraryRun entry, i.e. not sequenced (yet) (tumor sample) - # LibraryRunFactory() # LibraryRun entry for library created with LibraryFactory() (normal sample) - # - # # The normal library has a LibraryRun entry, i,e. has been sequenced, therefore - # # we expect to find it in a full library search - # lib = Library.objects.get_by_keyword(library_id=TestConstant.library_id_normal.value) - # self.assertEqual(len(lib), 1, 'Expect library for normal library') - # # and when excluding unsequenced libraries - # lib = Library.objects.get_by_keyword(library_id=TestConstant.library_id_normal.value, sequenced=True) - # self.assertEqual(len(lib), 1, 'Expect library for normal library') - # - # # The tumor library has no LibraryRun entry, i,e. has NOT been sequenced, therefore - # # we expect to find it in a full library search - # lib = Library.objects.get_by_keyword(library_id=TestConstant.library_id_tumor.value) - # self.assertEqual(len(lib), 1, 'Expect matadata for tumor library') - # # and NOT when excluding unsequenced libraries - # lib = Library.objects.get_by_keyword(library_id=TestConstant.library_id_tumor.value, sequenced=True) - # self.assertEqual(len(lib), 0, 'Did NOT expect metadat for tumor library (not sequenced yet)') - # - # def test_get_by_keyword_in_not_sequenced(self): - # # python manage.py test data_portal.models.tests.test_library.LibraryTestCase.test_get_by_keyword_in_not_sequenced - # - # logger.info("Test exclusion of library for unsequenced libraries") - # TumorLibraryFactory() # does not have a LibraryRun entry, i.e. not sequenced (yet) (tumor sample) - # WtsTumorLibraryFactory() # does not have a LibraryRun entry, i.e. not sequenced (yet) (tumor sample) - # LibraryRunFactory() # LibraryRun entry for library created with LibraryFactory() (normal sample) - # - # # we expect to find both record in a full library search - # lib = Library.objects.get_by_keyword_in(libraries=[TestConstant.library_id_normal.value, TestConstant.wts_library_id_tumor.value]) - # self.assertEqual(len(lib), 2, 'Expect library for normal library') - # # but only the normal sample when excluding unsequenced libraries - # lib = Library.objects.get_by_keyword_in(libraries=[TestConstant.library_id_normal.value, TestConstant.wts_library_id_tumor.value], sequenced=True) - # self.assertEqual(len(lib), 1, 'Expect library for normal library') - # - # # The tumor libraries have no LibraryRun entry, i,e. have NOT been sequenced, therefore - # # we expect to find both in a full library search - # lib = Library.objects.get_by_keyword_in(libraries=[TestConstant.library_id_tumor.value, TestConstant.wts_library_id_tumor.value]) - # self.assertEqual(len(lib), 2, 'Expect matadata for tumor library') - # # but none when excluding unsequenced libraries - # lib = Library.objects.get_by_keyword_in(libraries=[TestConstant.library_id_tumor.value, TestConstant.wts_library_id_tumor.value], sequenced=True) - # self.assertEqual(len(lib), 0, 'Did NOT expect metadat for tumor library (not sequenced yet)') diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/tests/test_viewsets.py b/lib/workload/stateless/metadata_manager/src/library_manager/tests/test_viewsets.py deleted file mode 100644 index d2f7ddb60..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/tests/test_viewsets.py +++ /dev/null @@ -1,36 +0,0 @@ -import logging - -from django.test import TestCase - -from library_manager.models.library import Library -from library_manager.tests.case import LibraryUnitTestCase -from library_manager.tests.factories import LibraryFactory, TestConstant - -logger = logging.getLogger() -logger.setLevel(logging.INFO) - - -class LibraryViewSetTestCase(LibraryUnitTestCase): - def setUp(self): - logger.debug("Create mock library") - LibraryFactory() - - def test_get_api(self): - """ - python manage.py test library_manager.tests.test_viewsets.LibraryViewSetTestCase.test_get_api - """ - logger.info("Test if GET requests return the specific requested library\n") - - response = self.client.get("/library/") - self.assertEqual(response.status_code, 200, "Ok status response is expected") - - result_response = response.data["results"] - self.assertGreater(len(result_response), 0, "A result is expected") - - response = self.client.get( - f"""/library/?library_id={TestConstant.library_id_normal.value}""" - ) - results_response = response.data["results"] - self.assertEqual( - len(results_response), 1, "single result is expected for unique data" - ) diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/urls/__init__.py b/lib/workload/stateless/metadata_manager/src/library_manager/urls/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/urls/base.py b/lib/workload/stateless/metadata_manager/src/library_manager/urls/base.py deleted file mode 100644 index 0baa24e4f..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/urls/base.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.urls import path, include - -from library_manager.routers import OptionalSlashDefaultRouter -from library_manager.viewsets.library import LibraryViewSet - -router = OptionalSlashDefaultRouter() -router.register(r"library", LibraryViewSet, basename="library") - -urlpatterns = [path("", include(router.urls))] - -handler500 = "rest_framework.exceptions.server_error" -handler400 = "rest_framework.exceptions.bad_request" diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/urls/local.py b/lib/workload/stateless/metadata_manager/src/library_manager/urls/local.py deleted file mode 100644 index 44c195319..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/urls/local.py +++ /dev/null @@ -1,40 +0,0 @@ -from django.urls import path, include, re_path -from drf_yasg import openapi -from drf_yasg.views import get_schema_view -from rest_framework import permissions - -from .base import urlpatterns as base_urlpatterns, router - -schema_view = get_schema_view( - openapi.Info( - title="UMCCR OrcaBus library_manager API", - default_version="v1", - description="UMCCR OrcaBus library_manager API", - terms_of_service="https://umccr.org/", - contact=openapi.Contact(email="services@umccr.org"), - license=openapi.License(name="MIT License"), - ), - public=True, - permission_classes=[ - permissions.AllowAny, - ], - patterns=[ - path("", include(router.urls)), - ], -) - -urlpatterns = base_urlpatterns + [ - re_path( - r"^swagger(?P\.json|\.yaml)$", - schema_view.without_ui(cache_timeout=0), - name="schema-json", - ), - re_path( - r"^swagger/$", - schema_view.with_ui("swagger", cache_timeout=0), - name="schema-swagger-ui", - ), - re_path( - r"^redoc/$", schema_view.with_ui("redoc", cache_timeout=0), name="schema-redoc" - ), -] diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/viewsets/__init__.py b/lib/workload/stateless/metadata_manager/src/library_manager/viewsets/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/viewsets/library.py b/lib/workload/stateless/metadata_manager/src/library_manager/viewsets/library.py deleted file mode 100644 index 11c5070cc..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/viewsets/library.py +++ /dev/null @@ -1,16 +0,0 @@ -from rest_framework import filters -from rest_framework.viewsets import ModelViewSet - -from library_manager.models.library import Library -from library_manager.pagination import StandardResultsSetPagination -from library_manager.serializers import LibraryModelSerializer - - -class LibraryViewSet(ModelViewSet): - serializer_class = LibraryModelSerializer - pagination_class = StandardResultsSetPagination - filter_backends = [filters.OrderingFilter, filters.SearchFilter] - ordering_fields = "__all__" - search_fields = ordering_fields - ordering = ["-id"] - queryset = Library.objects.all() diff --git a/lib/workload/stateless/metadata_manager/src/library_manager/wsgi.py b/lib/workload/stateless/metadata_manager/src/library_manager/wsgi.py deleted file mode 100644 index 938a94a23..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager/wsgi.py +++ /dev/null @@ -1,5 +0,0 @@ -import os - -from django.core.wsgi import get_wsgi_application - -application = get_wsgi_application() diff --git a/lib/workload/stateless/metadata_manager/src/library_manager_proc/__init__.py b/lib/workload/stateless/metadata_manager/src/library_manager_proc/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/workload/stateless/metadata_manager/src/library_manager_proc/lambdas/__init__.py b/lib/workload/stateless/metadata_manager/src/library_manager_proc/lambdas/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/workload/stateless/metadata_manager/src/library_manager_proc/lambdas/library_proc.py b/lib/workload/stateless/metadata_manager/src/library_manager_proc/lambdas/library_proc.py deleted file mode 100644 index 652f57942..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager_proc/lambdas/library_proc.py +++ /dev/null @@ -1,56 +0,0 @@ -from library_manager_proc.services import library_srv -from libumccr import libjson -import os -import django - -import logging -from datetime import datetime -from django.utils import timezone - -django.setup() - - -logger = logging.getLogger() -logger.setLevel(logging.INFO) - -list_of_years = ["2019", "2020", "2021", "2022", "2023"] - - -def _halt(msg): - logger.error(msg) - return {"message": msg} - - -def sync_library_from_gdrive(event, context): - """ - event payload: - { - years: ["2019", "2020", "2021", "2022", "2023"], - } - """ - logger.info("Start processing LabLibrary update event") - logger.info(libjson.dumps(event)) - - requested_timestamp = datetime.now(tz=timezone.utc) - - timestamp_string = requested_timestamp.strftime("%Y-%m-%d %H:%M:%S") - logger.info(f"Reading LabLibrary sheet from google drive at {timestamp_string}") - - # By default it will sync up to the list specified - years = event.get("sheets", list_of_years) - - if not isinstance(years, list): - _halt( - f"Payload error. Must be array of string for sheets. Found: {type(years)}" - ) - - resp_d = {} - for year in years: - logger.info(f"Downloading {year} sheet") - df = library_srv.download_library(year) - stats_d = library_srv.append_new_library_records(df, requested_timestamp) - resp_d.update({year: stats_d}) - - logger.info(f"Update result from this sync {libjson.dumps(resp_d)}") - - return resp_d diff --git a/lib/workload/stateless/metadata_manager/src/library_manager_proc/services/__init__.py b/lib/workload/stateless/metadata_manager/src/library_manager_proc/services/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/workload/stateless/metadata_manager/src/library_manager_proc/services/library_srv.py b/lib/workload/stateless/metadata_manager/src/library_manager_proc/services/library_srv.py deleted file mode 100644 index 97aefbd34..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager_proc/services/library_srv.py +++ /dev/null @@ -1,138 +0,0 @@ -import logging -import re -from datetime import datetime - -import numpy as np -import pandas as pd -from django.db import transaction -from libumccr import libgdrive, libjson -from libumccr.aws import libssm - -from library_manager.models.library import Library - -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) - -# SSM Parameter Constant for accessing Gdrive -GDRIVE_SERVICE_ACCOUNT = "/umccr/google/drive/lims_service_account_json" -TRACKING_SHEET_ID = "/umccr/google/drive/tracking_sheet_id" - - -@transaction.atomic -def append_new_library_records(df: pd.DataFrame, df_timestamp: datetime): - """ - Append new library from a pandas DataFrame into the db - - The function will check if the latest library record is up to the with the current df, - if record is missing or different it will append a new record to the current database. - - :param df: DataFrame to persist - :param df_timestamp: The timestamp where the DF is fetched - :return: result statistics - count of LabLibrary rows created - """ - - if df.empty: - return {"message": "Empty data frame"} - - df = clean_columns(df) - df = df.applymap(_clean_data_cell) - df = df.drop_duplicates() - df = df.reset_index(drop=True) - - rows_created = list() - rows_invalid = list() - - for record in df.to_dict("records"): - library_id = record.get("library_id") or None - try: - df_object = { - "library_id": library_id, - "sample_name": record.get("sample_name") or None, - "sample_id": record.get("sample_id") or None, - "external_sample_id": record["external_sample_id"], - "subject_id": record["subject_id"], - "external_subject_id": record["external_subject_id"], - "phenotype": record["phenotype"], - "quality": record["quality"], - "source": record["source"], - "project_name": record["project_name"], - "project_owner": record["project_owner"], - "experiment_id": record["experiment_id"], - "type": record["type"], - "assay": record["assay"], - "override_cycles": record["override_cycles"], - "workflow": record["workflow"], - "coverage": record["coverage"], - "truseqindex": record.get("truseqindex", None), - } - - # We will use the manual get and create approach - try: - # Check if the latest record is up to date - obj = Library.objects.get_single(**df_object) - continue - except Library.DoesNotExist: - # if latest record is missing/not up to date, insert a new one - obj = Library(timestamp=df_timestamp, **df_object) - obj.save() - - # Add the append counter - rows_created.append(obj) - - except Exception as e: - if any(record.values()): # silent off iff blank row - logger.warning( - f"Invalid record: {libjson.dumps(record)} Exception: {e}" - ) - rows_invalid.append(record) - continue - - return { - "library_row_created_count": len(rows_created), - "library_row_invalid_count": len(rows_invalid), - } - - -def download_library(year: str) -> pd.DataFrame: - """Download the full original library from which to extract the required information - - :param year: the sheet in the library spreadsheet to load - """ - lab_sheet_id = libssm.get_secret(TRACKING_SHEET_ID) - account_info = libssm.get_secret(GDRIVE_SERVICE_ACCOUNT) - - return libgdrive.download_sheet(account_info, lab_sheet_id, sheet=year) - - -def clean_columns(df: pd.DataFrame) -> pd.DataFrame: - """ - clean a dataframe of lablibrary from a tracking sheet to correspond to the django object model - we do this by editing the columns to match the django object - """ - # remove unnamed - df = df.loc[:, ~df.columns.str.contains("^Unnamed")] - - # simplify verbose column names - df = df.rename( - columns={ - "Coverage (X)": "coverage", - "TruSeq Index, unless stated": "truseqindex", - } - ) - - # convert PascalCase headers to snake_case and fix ID going to _i_d - pattern = re.compile(r"(? None: - logger.info("\n") - logger.info("-" * 64) - # some code construct that share across all test cases under lims package - # pass for now - pass - - def tearDown(self) -> None: - # undo any construct done from setUp - # pass for now - pass - - -class LibraryIntegrationTestCase(TestCase): - pass diff --git a/lib/workload/stateless/metadata_manager/src/library_manager_proc/tests/test_library_proc.py b/lib/workload/stateless/metadata_manager/src/library_manager_proc/tests/test_library_proc.py deleted file mode 100644 index babadc29e..000000000 --- a/lib/workload/stateless/metadata_manager/src/library_manager_proc/tests/test_library_proc.py +++ /dev/null @@ -1,186 +0,0 @@ -import tempfile -from unittest import skip -from datetime import datetime, timezone - -import logging -import pandas as pd -from libumccr import libgdrive, libjson -from libumccr.aws import libssm -from mockito import when - -from library_manager.models.library import Library -from library_manager_proc.lambdas import library_proc -from library_manager_proc.tests.case import LibraryProcUnitTestCase - -logger = logging.getLogger() -logger.setLevel(logging.INFO) - -lablibrary_csv_columns = [ - "LibraryID", - "SampleName", - "SampleID", - "ExternalSampleID", - "SubjectID", - "ExternalSubjectID", - "Phenotype", - "Quality", - "Source", - "ProjectName", - "ProjectOwner", - "", - "ExperimentID", - "Type", - "Assay", - "OverrideCycles", - "Workflow", - "Coverage (X)", - "TruSeq Index, unless stated", - "Run#", - "Comments", - "rRNA", - "qPCR ID", - "Sample_ID (SampleSheet)", -] - -_mock_lablibrary_sheet_content = b""" -LibraryID,SampleName,SampleID,ExternalSampleID,SubjectID,ExternalSubjectID,Phenotype,Quality,Source,ProjectName,ProjectOwner,,ExperimentID,Type,Assay,OverrideCycles,Workflow,Coverage (X),"TruSeq Index, unless stated",Run#,Comments,rRNA,qPCR ID,Sample_ID (SampleSheet),,,,,,,,,, -LIB01,SAMIDA-EXTSAMA,SAMIDA,,SUBIDA,EXTSUBIDA,,,FFPE,MyPath,Alice,,Exper1,WTS,NebRNA,Y151;I8;I8;Y151,clinical,6.0,Neb2-F07,P30,,,#NAME?,SAMIDA_LIB01,,,,,,,,,, -LIB02,SAMIDB-EXTSAMB,SAMIDB,EXTSAMB,SUBIDB,EXTSUBIDB,tumor,poor,FFPE,Fake,Bob,,Exper1,WTS,NebRNA,Y151;I8;I8;Y151,clinical,6.0,Neb2-G07,P30,,,#NAME?,SAMIDB_LIB02,,,,,,,,,, -LIB03,SAMIDB-EXTSAMB,SAMIDB,EXTSAMB,SUBIDB,EXTSUBIDB,tumor,poor,FFPE,Fake,Bob,,Exper1,WTS,NebRNA,Y151;I8;I8;Y151,clinical,6.0,Neb2-H07,P30,,,#NAME?,SAMIDB_LIB03,,,,,,,,,, -LIB04,SAMIDA-EXTSAMA,SAMIDA,EXTSAMA,SUBIDA,EXTSUBIDA,tumor,poor,FFPE,MyPath,Alice,,Exper1,WTS,NebRNA,Y151;I8;I8;Y151,clinical,6.0,Neb2-F07,P30,,,#NAME?,SAMIDA_LIB01,,,,,,,,,, -""" - - -class LibraryProcUnitTests(LibraryProcUnitTestCase): - def test_library_append(self): - """ - python manage.py test library_manager_proc.tests.test_library_proc.LibraryProcUnitTests.test_library_append - """ - logger.info("Test sync library with existing database\n") - - mock_lablibrary_sheet = tempfile.NamedTemporaryFile(suffix=".csv", delete=True) - mock_lablibrary_sheet.write(_mock_lablibrary_sheet_content.lstrip().rstrip()) - mock_lablibrary_sheet.seek(0) - mock_lablibrary_sheet.flush() - - # print csv file in tmp dir -- if delete=False, you can see the mock csv content - logger.info(f"Path to mock tracking sheet: {mock_lablibrary_sheet.name}") - when(libssm).get_secret(...).thenReturn("SomeSecretString") - when(libgdrive).download_sheet(...).thenReturn( - pd.read_csv(mock_lablibrary_sheet) - ) - - # make a duplicate to test update, its phenotype is normal but in sheet it is tumor - library = Library( - library_id="LIB03", - sample_name="SAMIDB-EXTSAMB", - sample_id="SAMIDB", - external_sample_id="EXTSAMB", - subject_id="SUBIDB", - external_subject_id="EXTSUBIDB", - phenotype="NORMAL", - quality="poor", - source="FFPE", - project_name="Fake", - project_owner="Bob", - experiment_id="Exper1", - type="WTS", - assay="NebRNA", - override_cycles="Y151;I8;I8;Y151", - workflow="clinical", - coverage="6.0", - truseqindex="H07", - timestamp=datetime.now(tz=timezone.utc), - ) - library.save() - - mock_sheet_year = "2021" - result = library_proc.sync_library_from_gdrive( - { - "sheets": [mock_sheet_year], - }, - None, - ) - - logger.info("Example lablibrary.scheduled_update_handler lambda output:") - logger.info(libjson.dumps(result)) - - self.assertEqual(result[mock_sheet_year]["library_row_created_count"], 4) - self.assertEqual(result[mock_sheet_year]["library_row_invalid_count"], 0) - - lib_blank_ext_sample_id = Library.objects.get_single(library_id="LIB01") - self.assertEqual(lib_blank_ext_sample_id.external_sample_id, "") - - lib_created = Library.objects.get_single(library_id="LIB02") - self.assertIsNotNone(lib_created) - - # Check if lib is successfully updated - lib_updated = Library.objects.get_single(library_id="LIB03") - self.assertEqual(lib_updated.phenotype, "tumor") - - # Check if both record exist for the updated library - lib_updated_history = Library.objects.get_by_keyword( - library_id="LIB03", show_history=True - ) - self.assertEqual( - len(lib_updated_history), 2, "updated records should now have history" - ) - - # Check newly inserted timestamp are the same - lib_01 = Library.objects.get_single(library_id="LIB01") - lib_02 = Library.objects.get_single(library_id="LIB02") - self.assertEqual( - lib_01.timestamp, - lib_02.timestamp, - "newly inserted record must have the same timestamp", - ) - - # clean up - mock_lablibrary_sheet.close() - - def test_sync_idempotent(self): - """ - Not inserting new record if existing record has exist - - python manage.py test library_manager_proc.tests.test_library_proc.LibraryProcUnitTests.test_sync_idempotent - """ - logger.info( - "Test sync library is idempotent (without replacing existing one)\n" - ) - - mock_sheet_year = "2021" - mock_lablibrary_sheet = tempfile.NamedTemporaryFile(suffix=".csv", delete=True) - mock_lablibrary_sheet.write(_mock_lablibrary_sheet_content.lstrip().rstrip()) - mock_lablibrary_sheet.seek(0) - mock_lablibrary_sheet.flush() - - when(libssm).get_secret(...).thenReturn("SomeSecretString") - when(libgdrive).download_sheet(...).thenReturn( - pd.read_csv(mock_lablibrary_sheet) - ) - - # Inserting library into a black db - first_sync = library_proc.sync_library_from_gdrive( - { - "sheets": [mock_sheet_year], - }, - None, - ) - self.assertEqual( - first_sync[mock_sheet_year]["library_row_created_count"], - 4, - "expecting to insert all records", - ) - - # Test if sync from same library will result in no new records - second_sync = library_proc.sync_library_from_gdrive( - { - "sheets": [mock_sheet_year], - }, - None, - ) - self.assertEqual( - second_sync[mock_sheet_year]["library_row_created_count"], - 0, - "expecting no record as it is based from previous library", - ) diff --git a/lib/workload/stateless/metadata_manager/src/makefile b/lib/workload/stateless/metadata_manager/src/makefile deleted file mode 100644 index 649150d99..000000000 --- a/lib/workload/stateless/metadata_manager/src/makefile +++ /dev/null @@ -1,7 +0,0 @@ -.PHONY: test deep scan - -install: - @pip install -r requirements-dev.txt - -test: - @python manage.py test diff --git a/lib/workload/stateless/metadata_manager/src/manage.py b/lib/workload/stateless/metadata_manager/src/manage.py deleted file mode 100755 index 44eacb5f4..000000000 --- a/lib/workload/stateless/metadata_manager/src/manage.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python -"""Django's command-line utility for administrative tasks.""" -import os -import sys - - -def main(): - """Run administrative tasks.""" - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "library_manager.settings.local") - try: - from django.core.management import execute_from_command_line - except ImportError as exc: - raise ImportError( - "Couldn't import Django. Are you sure it's installed and " - "available on your PYTHONPATH environment variable? Did you " - "forget to activate a virtual environment?" - ) from exc - execute_from_command_line(sys.argv) - - -if __name__ == "__main__": - main() diff --git a/lib/workload/stateless/metadata_manager/src/migrate.py b/lib/workload/stateless/metadata_manager/src/migrate.py deleted file mode 100644 index 20c0a1029..000000000 --- a/lib/workload/stateless/metadata_manager/src/migrate.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -"""migrate lambda module - -Convenience AWS lambda handler for Django database migration command hook -""" -import os - -from django.core.management import execute_from_command_line - - -def handler(event, context) -> str: - execute_from_command_line(["./manage.py", "migrate"]) - return "Migration complete." diff --git a/lib/workload/stateless/metadata_manager/src/package.json b/lib/workload/stateless/metadata_manager/src/package.json new file mode 100644 index 000000000..d15f93672 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/package.json @@ -0,0 +1,38 @@ +{ + "name": "src", + "packageManager": "yarn@3.5.1", + "scripts": { + "watch": "NODE_ENV=development nodemon src/index.ts", + "typecheck": "tsc -p tsconfig.json", + "init-db": "edgedb project init", + "migrate-db": "edgedb migration create || true && edgedb migrate", + "start": "NODE_ENV=development ts-node src/index.ts", + "//edgetypes": "Generates Typescript classes that match the schema of the *current* project EdgeDb", + "edgetypes": "generate queries --file && generate edgeql-js && generate interfaces", + "test": "jest" + }, + "dependencies": { + "@aws-sdk/client-ssm": "^3.382.0", + "edgedb": "^1.3.4", + "fastify": "^4.20.0", + "google-auth-library": "^9.0.0", + "google-spreadsheet": "^4.0.2", + "lodash": "^4.17.21", + "pino-pretty": "^10.1.0", + "reflect-metadata": "^0.1.13", + "ts-node": "^10.9.1", + "tsyringe": "^4.8.0", + "ulid": "^2.3.0" + }, + "devDependencies": { + "@edgedb/generate": "^0.3.1", + "@types/jest": "^29.5.3", + "@types/lodash": "^4", + "@types/node": "^20.4.2", + "jest": "^29.6.2", + "nodemon": "^3.0.1", + "ts-jest": "^29.1.1", + "tsx": "^3.12.7", + "typescript": "^5.1.6" + } +} diff --git a/lib/workload/stateless/metadata_manager/src/requirements-dev.txt b/lib/workload/stateless/metadata_manager/src/requirements-dev.txt deleted file mode 100644 index 895ba4fb3..000000000 --- a/lib/workload/stateless/metadata_manager/src/requirements-dev.txt +++ /dev/null @@ -1,9 +0,0 @@ --r requirements-test.txt -drf_yasg==1.21.5 -pipdeptree==2.7.1 -django_extensions==3.2.1 -aws-requests-auth==0.4.3 -requests-aws4auth==1.2.3 -pre-commit -detect-secrets -ggshield diff --git a/lib/workload/stateless/metadata_manager/src/requirements-test.txt b/lib/workload/stateless/metadata_manager/src/requirements-test.txt deleted file mode 100644 index 37c3a2bde..000000000 --- a/lib/workload/stateless/metadata_manager/src/requirements-test.txt +++ /dev/null @@ -1,4 +0,0 @@ --r requirements.txt -factory_boy==3.2.1 -pytz==2023.3 -mockito==1.4.0 diff --git a/lib/workload/stateless/metadata_manager/src/requirements.txt b/lib/workload/stateless/metadata_manager/src/requirements.txt deleted file mode 100644 index dc90bc50c..000000000 --- a/lib/workload/stateless/metadata_manager/src/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -aws-xray-sdk==2.12.0 -boto3==1.28.0 -Django==4.2.3 -djangorestframework==3.14.0 -django-cors-headers==4.1.0 -django-environ==0.10.0 -django-database-prefix==0.1.0 -pymysql==1.1.0 -Werkzeug==2.3.6 -libica==2.2.1 -libumccr==0.4.0rc1 -serverless-wsgi==3.0.2 diff --git a/lib/workload/stateless/metadata_manager/src/src/api/routes/internal-routes.ts b/lib/workload/stateless/metadata_manager/src/src/api/routes/internal-routes.ts new file mode 100644 index 000000000..7e710428a --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/api/routes/internal-routes.ts @@ -0,0 +1,13 @@ +import { FastifyInstance } from 'fastify'; +import { DependencyContainer } from 'tsyringe'; + +export const internalRoutes = async ( + fastify: FastifyInstance, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _opts: { container: DependencyContainer } +) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + fastify.get('/hello', async (request, reply) => { + return 'Hello World!\n'; + }); +}; diff --git a/lib/workload/stateless/metadata_manager/src/src/app.ts b/lib/workload/stateless/metadata_manager/src/src/app.ts new file mode 100644 index 000000000..bfb215671 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/app.ts @@ -0,0 +1,48 @@ +import Fastify, { FastifyBaseLogger, FastifyInstance } from 'fastify'; +import e from '../dbschema/edgeql-js'; +import { DependencyContainer } from 'tsyringe'; +import { internalRoutes } from './api/routes/internal-routes'; +import insertScenario1 from './test-data/scenario-1'; +import { Client } from 'edgedb'; + +export class App { + public readonly server: FastifyInstance; + /** + * @param dc + */ + constructor(private readonly dc: DependencyContainer) { + this.server = Fastify({ + logger: dc.resolve('Logger'), + }); + + // inject a copy of the Elsa settings and a custom child DI container into every Fastify request + this.server.decorateRequest('container', null); + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + this.server.addHook('onRequest', async (req, reply) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (req as any).container = this.dc; + }); + } + + public async setupServer(dc: DependencyContainer): Promise { + // register global fastify plugins + // { + // } + const edgeDbClient = dc.resolve('Database'); + + // WARNING: THIS IS DEV MODE + await e.delete(e.metadata.Subject).run(edgeDbClient); + await e.delete(e.metadata.Specimen).run(edgeDbClient); + await e.delete(e.metadata.Library).run(edgeDbClient); + + await insertScenario1(dc); + + // Register Fastify routing + { + this.server.register(internalRoutes); + } + + return this.server; + } +} diff --git a/lib/workload/stateless/metadata_manager/src/src/bootstrap/dependency-injection.ts b/lib/workload/stateless/metadata_manager/src/src/bootstrap/dependency-injection.ts new file mode 100644 index 000000000..f9a732808 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/bootstrap/dependency-injection.ts @@ -0,0 +1,33 @@ +import { Client, Duration, createClient } from 'edgedb'; +import * as tsyringe from 'tsyringe'; +import { SSMClient } from '@aws-sdk/client-ssm'; +import { instanceCachingFactory } from 'tsyringe'; +import pino, { Logger } from 'pino'; + +export async function createDependencyContainer() { + const dc = tsyringe.container.createChildContainer(); + + dc.register('Database', { + // https://www.edgedb.com/docs/clients/js/driver#configuring-clients + useFactory: instanceCachingFactory(() => + createClient().withConfig({ + session_idle_transaction_timeout: Duration.from({ seconds: 60 }), + }) + ), + }); + + dc.register('Logger', { + useValue: pino({ + transport: { + target: 'pino-pretty', + }, + }), + }); + + dc.register('SSMClient', { + useFactory: () => new SSMClient({}), + }); + + // Note: dependencies of class constructors must be injected manually when using esbuild. + return dc; +} diff --git a/lib/workload/stateless/metadata_manager/src/src/bootstrap/settings.ts b/lib/workload/stateless/metadata_manager/src/src/bootstrap/settings.ts new file mode 100644 index 000000000..753b9397c --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/bootstrap/settings.ts @@ -0,0 +1,17 @@ +export type SettingsType = { + port: number; + host: string; +}; + +export default function getAppSettings(): SettingsType { + const isDevelopment = process.env.NODE_ENV === 'development'; + + if (isDevelopment) { + return { + port: parseInt(process.env.PORT ?? '8080'), + host: process.env.HOST ?? 'localhost', + }; + } else { + throw new Error('App is not ready for production'); + } +} diff --git a/lib/workload/stateless/metadata_manager/src/src/index.ts b/lib/workload/stateless/metadata_manager/src/src/index.ts new file mode 100644 index 000000000..11796b4dc --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/index.ts @@ -0,0 +1,24 @@ +// must be first and before any DI is used +import 'reflect-metadata'; + +import { App } from './app'; +import { createDependencyContainer } from './bootstrap/dependency-injection'; +import getAppSettings from './bootstrap/settings'; + +(async () => { + const appSettings = getAppSettings(); + + const dc = await createDependencyContainer(); + const app = new App(dc); + + // Setting/registering server routes + const server = await app.setupServer(dc); + + server.listen({ host: appSettings.host, port: appSettings.port }, (err, address) => { + if (err) { + console.error(err); + process.exit(1); + } + console.log(`Server listening at ${address}`); + }); +})(); diff --git a/lib/workload/stateless/metadata_manager/src/src/service/helpers/audit-helper.ts b/lib/workload/stateless/metadata_manager/src/src/service/helpers/audit-helper.ts new file mode 100644 index 000000000..5475b08f2 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/service/helpers/audit-helper.ts @@ -0,0 +1,94 @@ +import { Client, Executor } from 'edgedb'; +import { insertSystemAuditEvent, updateSystemAuditEvent } from '../../../dbschema/queries'; +import * as interfaces from '../../../dbschema/interfaces'; +import ActionOutcomeType = interfaces.audit.ActionOutcome; +import ActionType = interfaces.audit.ActionType; +import { Transaction } from 'edgedb/dist/transaction'; + +/** + * A pattern that encapsulate the function with try-catch mechanism and audit entry for the action + * + * @param edgeDbClient + * @param actionDescription + * @param transFunc + * @returns + */ +export const systemAuditEventPattern = async ( + edgeDbClient: Client, + actionCategory: ActionType = 'E', + actionDescription: string, + transFunc: (tx: Transaction) => Promise +): Promise => { + const auditEventId = await startSystemAuditEvent(edgeDbClient, actionCategory, actionDescription); + + try { + const transResult = await edgeDbClient.transaction(async (tx: Transaction) => { + return await transFunc(tx); + }); + await completeSystemAuditEvent(edgeDbClient, auditEventId, 'success', new Date(), transResult); + return transResult; + } catch (error) { + const errorString = error instanceof Error ? error.message : String(error); + + await completeSystemAuditEvent(edgeDbClient, auditEventId, 'error', new Date(), { + error: errorString, + }); + } +}; + +/** + * Start the entry for a system audit event. + * + * @param executor + * @param actionCategory + * @param actionDescription + * @param details + * @param inProgress + * @param actionOutcome + * @returns + */ +export const startSystemAuditEvent = async ( + executor: Executor, + actionCategory: ActionType, + actionDescription: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + details: any = { errorMessage: 'Audit entry not completed' }, + inProgress = true, + actionOutcome: ActionOutcomeType = 'error' +): Promise => { + return ( + await insertSystemAuditEvent(executor, { + actionCategory, + actionDescription, + actionOutcome, + details, + inProgress, + }) + ).id; +}; + +/** + * Complete the audit entry made at the beginning + * + * @param executor + * @param auditEventId + * @param outcome + * @param endDate + * @param details + */ +export const completeSystemAuditEvent = async ( + executor: Executor, + auditEventId: string, + outcome: ActionOutcomeType, + endDate: Date, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + details: any +): Promise => { + await updateSystemAuditEvent(executor, { + auditDbId: auditEventId, + actionOutcome: outcome, + details, + occurredDateTime: endDate, + inProgress: false, + }); +}; diff --git a/lib/workload/stateless/metadata_manager/src/src/service/helpers/metadata/library-helper.ts b/lib/workload/stateless/metadata_manager/src/src/service/helpers/metadata/library-helper.ts new file mode 100644 index 000000000..f1ce32a56 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/service/helpers/metadata/library-helper.ts @@ -0,0 +1,77 @@ +import { insertLibraryQuery } from '../../../../dbschema/queries'; +import { Transaction } from 'edgedb/dist/transaction'; +import { MetadataIdentifiableType } from './metadata-helper'; +import { metadata } from '../../../../dbschema/interfaces'; +import { isEqual } from 'lodash'; + +export type LibraryType = MetadataIdentifiableType & { + phenotype: metadata.Phenotype | null; + workflow: metadata.WorkflowTypes | null; + quality: metadata.Quality | null; + type: metadata.LibraryTypes | null; + assay: string | null; + coverage: string | null; + specimenOrcaBusId?: string; +}; + +export const isLibraryIdentical = ( + dbValue: Partial, + newValue: Partial +) => { + const old = { + inId: dbValue.internalId, + exId: dbValue.externalId, + phenotype: dbValue.phenotype, + workflow: dbValue.workflow, + quality: dbValue.quality, + type: dbValue.type, + assay: dbValue.assay, + coverage: dbValue.coverage, + specimenOrcaBusId: dbValue.specimenOrcaBusId, + }; + const new_ = { + inId: newValue.internalId, + exId: newValue.externalId, + phenotype: newValue.phenotype, + workflow: newValue.workflow, + quality: newValue.quality, + type: newValue.type, + assay: newValue.assay, + coverage: newValue.coverage, + specimenOrcaBusId: newValue.specimenOrcaBusId, + }; + + return !isEqual(old, new_); +}; + +export const insertLibraryRecord = async (tx: Transaction, props: LibraryType) => { + await insertLibraryQuery(tx, { + orcaBusId: props.orcaBusId, + internalId: props.internalId, + phenotype: props.phenotype, + workflow: props.workflow, + quality: props.quality, + type: props.type, + assay: props.assay, + coverage: props.coverage, + specimenOrcaBusId: props.specimenOrcaBusId, + }); + + return props; +}; + +export const updateLibraryRecord = async (tx: Transaction, props: LibraryType) => { + await insertLibraryQuery(tx, { + orcaBusId: props.orcaBusId, + internalId: props.internalId, + phenotype: props.phenotype, + workflow: props.workflow, + quality: props.quality, + type: props.type, + assay: props.assay, + coverage: props.coverage, + specimenOrcaBusId: props.specimenOrcaBusId, + }); + + return props; +}; diff --git a/lib/workload/stateless/metadata_manager/src/src/service/helpers/metadata/metadata-helper.ts b/lib/workload/stateless/metadata_manager/src/src/service/helpers/metadata/metadata-helper.ts new file mode 100644 index 000000000..49d4436fa --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/service/helpers/metadata/metadata-helper.ts @@ -0,0 +1,5 @@ +export type MetadataIdentifiableType = { + orcaBusId: string; + internalId: string; + externalId?: string | null; +}; diff --git a/lib/workload/stateless/metadata_manager/src/src/service/helpers/metadata/specimen-helper.ts b/lib/workload/stateless/metadata_manager/src/src/service/helpers/metadata/specimen-helper.ts new file mode 100644 index 000000000..06446f406 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/service/helpers/metadata/specimen-helper.ts @@ -0,0 +1,49 @@ +import { insertSpecimenQuery, updateSpecimenQuery } from '../../../../dbschema/queries'; +import { Transaction } from 'edgedb/dist/transaction'; +import { MetadataIdentifiableType } from './metadata-helper'; +import { isEqual } from 'lodash'; + +export type SpecimenType = MetadataIdentifiableType & { + subjectOrcaBusId?: string | null; + source: string | null; +}; + +export const isSpecimenIdentical = ( + dbValue: Partial, + newValue: Partial +) => { + const old = { + inId: dbValue.internalId, + exId: dbValue.externalId, + source: dbValue.source, + subjectOrcaBusId: dbValue.subjectOrcaBusId, + }; + const new_ = { + inId: newValue.internalId, + exId: newValue.externalId, + source: newValue.source, + subjectOrcaBusId: newValue.subjectOrcaBusId, + }; + + return !isEqual(old, new_); +}; + +export const insertSpecimenRecord = async (tx: Transaction, props: SpecimenType) => { + return await insertSpecimenQuery(tx, { + orcaBusId: props.orcaBusId, + internalId: props.internalId, + externalId: props.externalId, + source: props.source, + subjectOrcaBusId: props.subjectOrcaBusId, + }); +}; + +export const updateSpecimenRecord = async (tx: Transaction, props: SpecimenType) => { + return await updateSpecimenQuery(tx, { + orcaBusId: props.orcaBusId, + internalId: props.internalId, + externalId: props.externalId, + source: props.source, + subjectOrcaBusId: props.subjectOrcaBusId, + }); +}; diff --git a/lib/workload/stateless/metadata_manager/src/src/service/helpers/metadata/subject-helper.ts b/lib/workload/stateless/metadata_manager/src/src/service/helpers/metadata/subject-helper.ts new file mode 100644 index 000000000..1b1c9949d --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/service/helpers/metadata/subject-helper.ts @@ -0,0 +1,33 @@ +import { insertSubjectQuery, updateSubjectQuery } from '../../../../dbschema/queries'; +import { Transaction } from 'edgedb/dist/transaction'; +import { MetadataIdentifiableType } from './metadata-helper'; +import { isEqual } from 'lodash'; + +export type SubjectType = MetadataIdentifiableType; + +export const isSubjectIdentical = (dbValue: SubjectType, newValue: Partial) => { + const old = { + exId: dbValue.externalId, + inId: dbValue.internalId, + }; + const new_ = { + exId: newValue.externalId, + inId: newValue.internalId, + }; + return !isEqual(old, new_); +}; + +export const insertSubjectRecord = async (tx: Transaction, props: SubjectType) => { + return await insertSubjectQuery(tx, { + orcaBusId: props.orcaBusId, + internalId: props.internalId, + externalId: props.externalId, + }); +}; +export const updateSubjectRecord = async (tx: Transaction, props: SubjectType) => { + return await updateSubjectQuery(tx, { + orcaBusId: props.orcaBusId, + internalId: props.internalId, + externalId: props.externalId, + }); +}; diff --git a/lib/workload/stateless/metadata_manager/src/src/service/loader-method/googleSheet.ts b/lib/workload/stateless/metadata_manager/src/src/service/loader-method/googleSheet.ts new file mode 100644 index 000000000..cb3e4ffbf --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/service/loader-method/googleSheet.ts @@ -0,0 +1,344 @@ +import { Client } from 'edgedb'; +import { ulid } from 'ulid'; +import { metadata } from '../../../dbschema/interfaces'; +import { inject, injectable } from 'tsyringe'; +import { Logger } from 'pino'; +import { JWT } from 'google-auth-library'; +import { GetParameterCommand, SSMClient } from '@aws-sdk/client-ssm'; +import { GoogleSpreadsheet } from 'google-spreadsheet'; +import { + selectLibraryByIdQuery, + selectSpecimenByIdQuery, + selectSubjectByIdQuery, +} from '../../../dbschema/queries'; +import { + isSubjectIdentical, + insertSubjectRecord, + updateSubjectRecord, +} from '../helpers/metadata/subject-helper'; +import { systemAuditEventPattern } from '../helpers/audit-helper'; +import { Transaction } from 'edgedb/dist/transaction'; +import { + insertSpecimenRecord, + isSpecimenIdentical, + updateSpecimenRecord, +} from '../helpers/metadata/specimen-helper'; +import { + insertLibraryRecord, + isLibraryIdentical, + updateLibraryRecord, +} from '../helpers/metadata/library-helper'; + +const GDRIVE_SERVICE_ACCOUNT = '/umccr/google/drive/lims_service_account_json'; +const TRACKING_SHEET_ID = '/umccr/google/drive/tracking_sheet_id'; +// const LIMS_SHEET_ID = '/umccr/google/drive/lims_sheet_id'; // DEPRECATE? + +// This will tell from which year the system should query the worksheet +// Note: The title of the sheet are supposed to be th year +const YEAR_START = 2017; + +type GoogleMetadataTrackingHeader = + | 'LibraryID' + | 'SampleID' + | 'ExternalSampleID' + | 'SubjectID' + | 'ExternalSubjectID' + | 'Phenotype' + | 'Quality' + | 'Source' + | 'ProjectOwner' + | 'ProjectName' + | 'ExperimentID' + | 'Type' + | 'Assay' + | 'Workflow' + | 'Coverage (X)'; + +@injectable() +export class MetadataGoogleService { + constructor( + @inject('Database') private readonly edgeDbClient: Client, + @inject('Settings') private readonly settings: Record, + @inject('Logger') private readonly logger: Logger, + @inject('SSMClient') private readonly ssmClient: SSMClient + ) {} + + private async getParameterValue(parameterString: string) { + const input = { + Name: parameterString, + WithDecryption: true, + }; + const command = new GetParameterCommand(input); + return (await this.ssmClient.send(command)).Parameter?.Value; + } + + /** + * Get SpreadSheet values from Google Drive + * @param sheetTitle + * @returns + */ + public async getSheetObject( + sheetTitle: string + ): Promise[]> { + const googleAuthString = await this.getParameterValue(GDRIVE_SERVICE_ACCOUNT); + if (!googleAuthString) throw new Error('No GDrive credential found!'); + + const googleSheetId = await this.getParameterValue(TRACKING_SHEET_ID); + if (!googleSheetId) throw new Error('No Google Sheet Id found!'); + + const googleAuthJson = JSON.parse(googleAuthString); + const jwt = new JWT({ + email: googleAuthJson.client_email, + key: googleAuthJson.private_key, + scopes: ['https://www.googleapis.com/auth/spreadsheets.readonly'], + }); + + const doc = new GoogleSpreadsheet(googleSheetId, jwt); + await doc.loadInfo(); + + const sheet = doc.sheetsByTitle[sheetTitle]; + if (!sheet) throw new Error(`No sheet found with title: ${sheetTitle}`); + + const rows = await sheet.getRows(); + return rows.map( + (row) => >row.toObject() + ); + } + + /** + * Insert or Update for the subject specified in the properties + * @param props + * @returns + */ + protected async syncSubject(props: { internalId: string; externalId: string | null }) { + const subject = await selectSubjectByIdQuery(this.edgeDbClient, { + internalId: props.internalId, + }); + + // If subject does not exist => insert one + if (!subject) { + return systemAuditEventPattern( + this.edgeDbClient, + 'C', + `Insert new subject record: ${props.internalId}`, + async (tx: Transaction) => { + const r = await insertSubjectRecord(tx, { + orcaBusId: `sbj.${ulid()}`, + internalId: props.internalId, + externalId: props.externalId, + }); + return r; + } + ); + } + + // Check if there it is the same with what we had in record and update if not + if (isSubjectIdentical(subject, props)) { + return systemAuditEventPattern( + this.edgeDbClient, + 'U', + `Update existing subject record: ${props.internalId}`, + async (tx: Transaction) => { + const r = await updateSubjectRecord(tx, { + orcaBusId: subject.orcaBusId, + internalId: props.internalId, + externalId: props.externalId, + }); + return r; + } + ); + } + return subject; + } + + /** + * Insert or Update for the specimen specified in the properties + * @param props + * @returns + */ + protected async syncSpecimen(props: { + internalId: string; + externalId: string | null; + subjectOrcaBusId?: string; + source: string | null; + }) { + const specimen = await selectSpecimenByIdQuery(this.edgeDbClient, { + internalId: props.internalId, + }); + + // If subject does not exist => insert one + if (!specimen) { + return systemAuditEventPattern( + this.edgeDbClient, + 'C', + `Insert new specimen record: ${props.internalId}`, + async (tx: Transaction) => { + const r = await insertSpecimenRecord(tx, { + orcaBusId: `spc.${ulid()}`, + internalId: props.internalId, + externalId: props.externalId, + subjectOrcaBusId: props.subjectOrcaBusId, + source: props.source, + }); + return r; + } + ); + } + + // Check if specimen is the same with what we had in record and update if not + if ( + isSpecimenIdentical( + { + internalId: specimen.internalId, + externalId: specimen.externalId, + source: specimen.source, + subjectOrcaBusId: specimen.subjectId, + }, + { ...props } + ) + ) { + return systemAuditEventPattern( + this.edgeDbClient, + 'U', + `Update existing specimen record: ${props.internalId}`, + async (tx: Transaction) => { + const r = await updateSpecimenRecord(tx, { + orcaBusId: specimen.orcaBusId, + internalId: props.internalId, + externalId: props.externalId, + source: props.source, + subjectOrcaBusId: props.subjectOrcaBusId, + }); + return r; + } + ); + } + return specimen; + } + + /** + * Insert or Update for the library specified in the properties + * @param props + * @returns + */ + protected async syncLibrary(props: { + internalId: string; + phenotype: metadata.Phenotype | null; + workflow: metadata.WorkflowTypes | null; + quality: metadata.Quality | null; + type: metadata.LibraryTypes | null; + assay: string | null; + coverage: string | null; + specimenId?: string; + }) { + const library = await selectLibraryByIdQuery(this.edgeDbClient, { + libraryId: props.internalId, + }); + // If library does not exist => insert one + if (!library) { + return systemAuditEventPattern( + this.edgeDbClient, + 'C', + `Insert new library record: ${props.internalId}`, + async (tx: Transaction) => { + const r = await insertLibraryRecord(tx, { + orcaBusId: `lib.${ulid()}`, + internalId: props.internalId, + phenotype: props.phenotype, + workflow: props.workflow, + quality: props.quality, + type: props.type, + assay: props.assay, + coverage: props.coverage, + specimenOrcaBusId: props.specimenId, + }); + return r; + } + ); + } + + // Check if specimen is the same with what we had in record and update if not + if (isLibraryIdentical(library, props)) { + return systemAuditEventPattern( + this.edgeDbClient, + 'U', + `Update existing specimen record: ${props.internalId}`, + async (tx: Transaction) => { + const r = await updateLibraryRecord(tx, { + orcaBusId: library.orcaBusId, + internalId: props.internalId, + phenotype: props.phenotype, + workflow: props.workflow, + quality: props.quality, + type: props.type, + assay: props.assay, + coverage: props.coverage, + specimenOrcaBusId: props.specimenId, + }); + return r; + } + ); + } + return library; + } + + /** + * Sync Google Metadata record + * + * NOTE (in DEV): Does not handle deletion (from gsheet) and if record is half filled. + * @param sheetRecords + */ + public async syncGoogleMetadataRecords( + sheetRecords: Record[] + ) { + for (const rec of sheetRecords) { + // Sync subject + const subject = rec.SubjectID + ? await this.syncSubject({ + internalId: rec.SubjectID, + externalId: rec.ExternalSubjectID ?? null, + }) + : undefined; + + // Sync Sample + const sample = rec.SampleID + ? await this.syncSpecimen({ + internalId: rec.SampleID, + externalId: rec.ExternalSampleID ?? null, + subjectOrcaBusId: subject?.orcaBusId, + source: rec.Source ?? null, + }) + : undefined; + + // Sync Library + if (rec.LibraryID) { + await this.syncLibrary({ + internalId: rec.LibraryID, + phenotype: rec.Phenotype ? rec.Phenotype : null, + workflow: rec.Workflow + ? rec.Workflow + : null, + quality: rec.Quality ? rec.Quality : null, + type: rec.Type ? rec.Type : null, + assay: rec.Assay ? rec.Assay : null, + coverage: rec['Coverage (X)'] ? rec['Coverage (X)'] : null, + specimenId: sample?.orcaBusId, + }); + } + } + } + + public async downloadGoogleMetadata() { + let year = YEAR_START; + for (;;) { + try { + // TODO: Deal with deletion!!! + const metadata_object = await this.getSheetObject(year.toString()); + this.syncGoogleMetadataRecords(metadata_object); + year += 1; + } catch (error) { + break; + } + } + } +} diff --git a/lib/workload/stateless/metadata_manager/src/src/service/loader-method/qlims.ts b/lib/workload/stateless/metadata_manager/src/src/service/loader-method/qlims.ts new file mode 100644 index 000000000..dd2b49a83 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/service/loader-method/qlims.ts @@ -0,0 +1 @@ +// ToDo: Implement when it is used diff --git a/lib/workload/stateless/metadata_manager/src/src/service/metadata-loader.ts b/lib/workload/stateless/metadata_manager/src/src/service/metadata-loader.ts new file mode 100644 index 000000000..84f1f8985 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/service/metadata-loader.ts @@ -0,0 +1,11 @@ +import { Client } from 'edgedb'; +import { injectable, inject } from 'tsyringe'; + +@injectable() +export class LibraryLoaderService { + constructor(@inject('Database') private readonly edgeDbClient: Client) {} + + public fetchAndLoad() { + console.log('fetching'); + } +} diff --git a/lib/workload/stateless/metadata_manager/src/src/test-data/scenario-1.ts b/lib/workload/stateless/metadata_manager/src/src/test-data/scenario-1.ts new file mode 100644 index 000000000..88642065d --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/src/test-data/scenario-1.ts @@ -0,0 +1,12 @@ +import { DependencyContainer } from 'tsyringe'; +import { Logger } from 'pino'; +import { MetadataGoogleService } from '../service/loader-method/googleSheet'; +import { METADATA_GOOGLE_OBJ } from '../../tests/service/gsheet.common'; + +export default async function insertScenario1(dc: DependencyContainer) { + const logger = dc.resolve('Logger'); + const gService = dc.resolve(MetadataGoogleService); + + logger.info('inserting scenario 1'); + await gService.syncGoogleMetadataRecords(METADATA_GOOGLE_OBJ); +} diff --git a/lib/workload/stateless/metadata_manager/src/tests/service/gsheet.common.ts b/lib/workload/stateless/metadata_manager/src/tests/service/gsheet.common.ts new file mode 100644 index 000000000..40192de09 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/tests/service/gsheet.common.ts @@ -0,0 +1,105 @@ +export const METADATA_REC_1 = { + LibraryID: 'LIB01', + SampleName: 'SAMIDA-EXTSAMA', + SampleID: 'SAMIDA', + ExternalSampleID: '', + SubjectID: 'SUBIDA', + ExternalSubjectID: 'EXTSUBIDA', + Phenotype: '', + Quality: '', + Source: 'FFPE', + ProjectName: 'MyPath', + ProjectOwner: 'Alice', + ExperimentID: 'Exper1', + Type: 'WTS', + Assay: 'NebRNA', + OverrideCycles: 'Y151;I8;I8;Y151', + Workflow: 'clinical', + 'Coverage (X)': '6.0', + 'TruSeq Index, unless stated': 'Neb2-F07', + 'Run#': 'P30', + Comments: '', + rRNA: undefined, + 'qPCR ID': '#NAME?', + 'Sample_ID (SampleSheet)': 'SAMIDA_LIB01', +}; + +export const METADATA_REC_2 = { + LibraryID: 'LIB02', + SampleName: 'SAMIDB-EXTSAMB', + SampleID: 'SAMIDB', + ExternalSampleID: 'EXTSAMB', + SubjectID: 'SUBIDB', + ExternalSubjectID: 'EXTSUBIDB', + Phenotype: 'tumor', + Quality: 'poor', + Source: 'FFPE', + ProjectName: 'Fake', + ProjectOwner: 'Bob', + ExperimentID: 'Exper1', + Type: 'WTS', + Assay: 'NebRNA', + OverrideCycles: 'Y151;I8;I8;Y151', + Workflow: 'clinical', + 'Coverage (X)': '6.3', + 'TruSeq Index, unless stated': 'Neb2-G07', + 'Run#': 'P30', + Comments: '', + rRNA: undefined, + 'qPCR ID': '#NAME?', + 'Sample_ID (SampleSheet)': 'SAMIDB_LIB02', +}; + +export const METADATA_REC_3 = { + LibraryID: 'LIB03', + SampleName: 'SAMIDB-EXTSAMB', + SampleID: 'SAMIDB', + ExternalSampleID: 'EXTSAMB', + SubjectID: 'SUBIDB', + ExternalSubjectID: 'EXTSUBIDB', + Phenotype: 'tumor', + Quality: 'poor', + Source: 'FFPE', + ProjectName: 'Fake', + ProjectOwner: 'Bob', + ExperimentID: 'Exper1', + Type: 'WTS', + Assay: 'NebRNA', + OverrideCycles: 'Y151;I8;I8;Y151', + Workflow: 'clinical', + 'Coverage (X)': '6.0', + 'TruSeq Index, unless stated': 'Neb2-H07', + 'Run#': 'P30', + Comments: '', + rRNA: undefined, + 'qPCR ID': '#NAME?', + 'Sample_ID (SampleSheet)': 'SAMIDB_LIB03', +}; + +export const METADATA_REC_4 = { + LibraryID: 'LIB04', + SampleName: 'SAMIDA-EXTSAMA', + SampleID: 'SAMIDA', + ExternalSampleID: 'EXTSAMA', + SubjectID: 'SUBIDA', + ExternalSubjectID: 'EXTSUBIDA', + Phenotype: 'tumor', + Quality: 'poor', + Source: 'FFPE', + ProjectName: 'MyPath', + ProjectOwner: 'Alice', + ExperimentID: 'Exper1', + Type: 'WTS', + Assay: 'NebRNA', + OverrideCycles: 'Y151;I8;I8;Y151', + Workflow: 'clinical', + 'Coverage (X)': '6.0', + 'TruSeq Index, unless stated': 'Neb2-F07', + 'Run#': 'P30', + Comments: '', + rRNA: '', + 'qPCR ID': '#NAME?', + 'Sample_ID (SampleSheet)': 'SAMIDA_LIB01', +}; + +export const METADATA_GOOGLE_OBJ = [METADATA_REC_1, METADATA_REC_2, METADATA_REC_3, METADATA_REC_4]; diff --git a/lib/workload/stateless/metadata_manager/src/tests/service/gsheet.test.ts b/lib/workload/stateless/metadata_manager/src/tests/service/gsheet.test.ts new file mode 100644 index 000000000..fb463f720 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/tests/service/gsheet.test.ts @@ -0,0 +1,94 @@ +import e from '../../dbschema/edgeql-js'; +import { registerTypes } from './test-dependency.common'; +import { MetadataGoogleService } from '../../src/service/loader-method/googleSheet'; +import { METADATA_GOOGLE_OBJ, METADATA_REC_1, METADATA_REC_4 } from './gsheet.common'; +import { Client } from 'edgedb'; +import { resetDb } from './utils'; + +const testContainer = registerTypes(); +let edgeDbClient: Client; +let gService: MetadataGoogleService; + +describe('sync metadata from google spreadsheet', () => { + beforeAll(async () => { + gService = testContainer.resolve(MetadataGoogleService); + edgeDbClient = testContainer.resolve('Database'); + }); + + beforeEach(async () => { + await resetDb(edgeDbClient); + // jest.useFakeTimers(); + }); + + it('libraries with the same specimen', async () => { + await gService.syncGoogleMetadataRecords([METADATA_REC_1, METADATA_REC_4]); + + const libraries = await e + .select(e.metadata.Library, () => ({ + ...e.metadata.Library['*'], + specimen: { + internalId: true, + }, + })) + .run(edgeDbClient); + + const specimens = await e + .select(e.metadata.Specimen, () => ({ + ...e.metadata.Specimen['*'], + })) + .run(edgeDbClient); + + // Expecting 2 library record belong to the same subject + expect(specimens.length).toBe(1); + expect(libraries.length).toBe(2); + + // Checks if both libraries belong to the same subject + const subjectId = specimens[0].internalId; + for (const l of libraries) { + expect(l.specimen?.internalId).toBe(subjectId); + } + }); + + it('libraries with both the same specimen and subject', async () => { + await gService.syncGoogleMetadataRecords([METADATA_REC_1, METADATA_REC_4]); + + const specimens = await e + .select(e.metadata.Specimen, () => ({ + ...e.metadata.Specimen['*'], + subject: { internalId: true }, + })) + .run(edgeDbClient); + + const subjects = await e + .select(e.metadata.Subject, () => ({ ...e.metadata.Subject['*'] })) + .run(edgeDbClient); + + expect(subjects.length).toBe(1); + expect(specimens.length).toBe(1); + + expect(specimens[0].subject?.internalId).toBe(subjects[0].internalId); + }); + + it('test insert and update works', async () => { + await gService.syncGoogleMetadataRecords(METADATA_GOOGLE_OBJ); + + const libraries = await e + .select(e.metadata.Library, () => ({ ...e.metadata.Library['*'] })) + .run(edgeDbClient); + + const specimens = await e + .select(e.metadata.Specimen, () => ({ ...e.metadata.Specimen['*'] })) + .run(edgeDbClient); + + const subjects = await e + .select(e.metadata.Subject, () => ({ ...e.metadata.Subject['*'] })) + .run(edgeDbClient); + + // Testing for all google object exist in Db + for (const m of METADATA_GOOGLE_OBJ) { + expect(libraries.find((l) => l.internalId == m.LibraryID)); + expect(specimens.find((s) => s.internalId == m.SampleID)); + expect(subjects.find((s) => s.internalId == m.SubjectID)); + } + }); +}); diff --git a/lib/workload/stateless/metadata_manager/src/tests/service/test-dependency.common.ts b/lib/workload/stateless/metadata_manager/src/tests/service/test-dependency.common.ts new file mode 100644 index 000000000..92270c523 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/tests/service/test-dependency.common.ts @@ -0,0 +1,38 @@ +import 'reflect-metadata'; + +import { container, instanceCachingFactory } from 'tsyringe'; +import { Client, Duration, createClient } from 'edgedb'; +import { Logger, pino } from 'pino'; +import { SSMClient } from '@aws-sdk/client-ssm'; + +export function registerTypes() { + const dc = container.createChildContainer(); + + dc.register>('Settings', { + useValue: {}, + }); + + dc.register('Database', { + // https://www.edgedb.com/docs/clients/js/driver#configuring-clients + useFactory: instanceCachingFactory(() => + createClient().withConfig({ + session_idle_transaction_timeout: Duration.from({ seconds: 60 }), + }) + ), + }); + + dc.register('Logger', { + useValue: pino({ + transport: { + target: 'pino-pretty', + }, + }), + }); + + dc.register('SSMClient', { + useFactory: () => new SSMClient({}), + }); + + // Note: dependencies of class constructors must be injected manually when using esbuild. + return dc; +} diff --git a/lib/workload/stateless/metadata_manager/src/tests/service/utils.ts b/lib/workload/stateless/metadata_manager/src/tests/service/utils.ts new file mode 100644 index 000000000..59ec1ea9f --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/tests/service/utils.ts @@ -0,0 +1,7 @@ +import { Executor } from 'edgedb'; +import e from '../../dbschema/edgeql-js'; + +export const resetDb = async (executor: Executor) => { + await e.delete(e.audit.AuditEvent).run(executor); + await e.delete(e.metadata.MetadataIdentifiable).run(executor); +}; diff --git a/lib/workload/stateless/metadata_manager/src/tsconfig.json b/lib/workload/stateless/metadata_manager/src/tsconfig.json new file mode 100644 index 000000000..0b9690ae0 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/tsconfig.json @@ -0,0 +1,113 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + "paths": { + "@orcabus/*": ["../../../../../*"] + }, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": ["./src/**/*"], + "exclude": ["node_modules"] +} diff --git a/lib/workload/stateless/metadata_manager/src/yarn.lock b/lib/workload/stateless/metadata_manager/src/yarn.lock new file mode 100644 index 000000000..0e5e77417 --- /dev/null +++ b/lib/workload/stateless/metadata_manager/src/yarn.lock @@ -0,0 +1,6187 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@ampproject/remapping@npm:^2.2.0": + version: 2.2.1 + resolution: "@ampproject/remapping@npm:2.2.1" + dependencies: + "@jridgewell/gen-mapping": ^0.3.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 03c04fd526acc64a1f4df22651186f3e5ef0a9d6d6530ce4482ec9841269cf7a11dbb8af79237c282d721c5312024ff17529cd72cc4768c11e999b58e2302079 + languageName: node + linkType: hard + +"@aws-crypto/crc32@npm:3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/crc32@npm:3.0.0" + dependencies: + "@aws-crypto/util": ^3.0.0 + "@aws-sdk/types": ^3.222.0 + tslib: ^1.11.1 + checksum: 9fdb3e837fc54119b017ea34fd0a6d71d2c88075d99e1e818a5158e0ad30ced67ddbcc423a11ceeef6cc465ab5ffd91830acab516470b48237ca7abd51be9642 + languageName: node + linkType: hard + +"@aws-crypto/ie11-detection@npm:^3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/ie11-detection@npm:3.0.0" + dependencies: + tslib: ^1.11.1 + checksum: 299b2ddd46eddac1f2d54d91386ceb37af81aef8a800669281c73d634ed17fd855dcfb8b3157f2879344b93a2666a6d602550eb84b71e4d7868100ad6da8f803 + languageName: node + linkType: hard + +"@aws-crypto/sha256-browser@npm:3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/sha256-browser@npm:3.0.0" + dependencies: + "@aws-crypto/ie11-detection": ^3.0.0 + "@aws-crypto/sha256-js": ^3.0.0 + "@aws-crypto/supports-web-crypto": ^3.0.0 + "@aws-crypto/util": ^3.0.0 + "@aws-sdk/types": ^3.222.0 + "@aws-sdk/util-locate-window": ^3.0.0 + "@aws-sdk/util-utf8-browser": ^3.0.0 + tslib: ^1.11.1 + checksum: ca89456bf508db2e08060a7f656460db97ac9a15b11e39d6fa7665e2b156508a1758695bff8e82d0a00178d6ac5c36f35eb4bcfac2e48621265224ca14a19bd2 + languageName: node + linkType: hard + +"@aws-crypto/sha256-js@npm:3.0.0, @aws-crypto/sha256-js@npm:^3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/sha256-js@npm:3.0.0" + dependencies: + "@aws-crypto/util": ^3.0.0 + "@aws-sdk/types": ^3.222.0 + tslib: ^1.11.1 + checksum: 644ded32ea310237811afae873d3c7320739cb6f6cc39dced9c94801379e68e5ee2cca0c34f0384793fa9e750a7e0a5e2468f95754bd08e6fd72ab833c8fe23c + languageName: node + linkType: hard + +"@aws-crypto/supports-web-crypto@npm:^3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/supports-web-crypto@npm:3.0.0" + dependencies: + tslib: ^1.11.1 + checksum: 35479a1558db9e9a521df6877a99f95670e972c602f2a0349303477e5d638a5baf569fb037c853710e382086e6fd77e8ed58d3fb9b49f6e1186a9d26ce7be006 + languageName: node + linkType: hard + +"@aws-crypto/util@npm:^3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/util@npm:3.0.0" + dependencies: + "@aws-sdk/types": ^3.222.0 + "@aws-sdk/util-utf8-browser": ^3.0.0 + tslib: ^1.11.1 + checksum: d29d5545048721aae3d60b236708535059733019a105f8a64b4e4a8eab7cf8dde1546dc56bff7de20d36140a4d1f0f4693e639c5732a7059273a7b1e56354776 + languageName: node + linkType: hard + +"@aws-sdk/client-ssm@npm:^3.382.0": + version: 3.382.0 + resolution: "@aws-sdk/client-ssm@npm:3.382.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sts": 3.382.0 + "@aws-sdk/credential-provider-node": 3.382.0 + "@aws-sdk/middleware-host-header": 3.379.1 + "@aws-sdk/middleware-logger": 3.378.0 + "@aws-sdk/middleware-recursion-detection": 3.378.0 + "@aws-sdk/middleware-signing": 3.379.1 + "@aws-sdk/middleware-user-agent": 3.382.0 + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-endpoints": 3.382.0 + "@aws-sdk/util-user-agent-browser": 3.378.0 + "@aws-sdk/util-user-agent-node": 3.378.0 + "@smithy/config-resolver": ^2.0.1 + "@smithy/fetch-http-handler": ^2.0.1 + "@smithy/hash-node": ^2.0.1 + "@smithy/invalid-dependency": ^2.0.1 + "@smithy/middleware-content-length": ^2.0.1 + "@smithy/middleware-endpoint": ^2.0.1 + "@smithy/middleware-retry": ^2.0.1 + "@smithy/middleware-serde": ^2.0.1 + "@smithy/middleware-stack": ^2.0.0 + "@smithy/node-config-provider": ^2.0.1 + "@smithy/node-http-handler": ^2.0.1 + "@smithy/protocol-http": ^2.0.1 + "@smithy/smithy-client": ^2.0.1 + "@smithy/types": ^2.0.2 + "@smithy/url-parser": ^2.0.1 + "@smithy/util-base64": ^2.0.0 + "@smithy/util-body-length-browser": ^2.0.0 + "@smithy/util-body-length-node": ^2.0.0 + "@smithy/util-defaults-mode-browser": ^2.0.1 + "@smithy/util-defaults-mode-node": ^2.0.1 + "@smithy/util-retry": ^2.0.0 + "@smithy/util-utf8": ^2.0.0 + "@smithy/util-waiter": ^2.0.1 + tslib: ^2.5.0 + uuid: ^8.3.2 + checksum: 350e2f3bf489d5faa08fc5b92802133c6557980e764296f4e598de1d069065e136aa5254322d11e841531cc43c96439be9a738017cb7e7205b576e612d1bd814 + languageName: node + linkType: hard + +"@aws-sdk/client-sso-oidc@npm:3.382.0": + version: 3.382.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.382.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/middleware-host-header": 3.379.1 + "@aws-sdk/middleware-logger": 3.378.0 + "@aws-sdk/middleware-recursion-detection": 3.378.0 + "@aws-sdk/middleware-user-agent": 3.382.0 + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-endpoints": 3.382.0 + "@aws-sdk/util-user-agent-browser": 3.378.0 + "@aws-sdk/util-user-agent-node": 3.378.0 + "@smithy/config-resolver": ^2.0.1 + "@smithy/fetch-http-handler": ^2.0.1 + "@smithy/hash-node": ^2.0.1 + "@smithy/invalid-dependency": ^2.0.1 + "@smithy/middleware-content-length": ^2.0.1 + "@smithy/middleware-endpoint": ^2.0.1 + "@smithy/middleware-retry": ^2.0.1 + "@smithy/middleware-serde": ^2.0.1 + "@smithy/middleware-stack": ^2.0.0 + "@smithy/node-config-provider": ^2.0.1 + "@smithy/node-http-handler": ^2.0.1 + "@smithy/protocol-http": ^2.0.1 + "@smithy/smithy-client": ^2.0.1 + "@smithy/types": ^2.0.2 + "@smithy/url-parser": ^2.0.1 + "@smithy/util-base64": ^2.0.0 + "@smithy/util-body-length-browser": ^2.0.0 + "@smithy/util-body-length-node": ^2.0.0 + "@smithy/util-defaults-mode-browser": ^2.0.1 + "@smithy/util-defaults-mode-node": ^2.0.1 + "@smithy/util-retry": ^2.0.0 + "@smithy/util-utf8": ^2.0.0 + tslib: ^2.5.0 + checksum: 8e63db2ed9d27326d4afe897f7debbe4d7f6c2b27015d5a5e2ce0656adc3757860c313403c1f0e5bfb6790e610d63c8ef3d6ce103abaa07155b4578e4fae768d + languageName: node + linkType: hard + +"@aws-sdk/client-sso@npm:3.382.0": + version: 3.382.0 + resolution: "@aws-sdk/client-sso@npm:3.382.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/middleware-host-header": 3.379.1 + "@aws-sdk/middleware-logger": 3.378.0 + "@aws-sdk/middleware-recursion-detection": 3.378.0 + "@aws-sdk/middleware-user-agent": 3.382.0 + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-endpoints": 3.382.0 + "@aws-sdk/util-user-agent-browser": 3.378.0 + "@aws-sdk/util-user-agent-node": 3.378.0 + "@smithy/config-resolver": ^2.0.1 + "@smithy/fetch-http-handler": ^2.0.1 + "@smithy/hash-node": ^2.0.1 + "@smithy/invalid-dependency": ^2.0.1 + "@smithy/middleware-content-length": ^2.0.1 + "@smithy/middleware-endpoint": ^2.0.1 + "@smithy/middleware-retry": ^2.0.1 + "@smithy/middleware-serde": ^2.0.1 + "@smithy/middleware-stack": ^2.0.0 + "@smithy/node-config-provider": ^2.0.1 + "@smithy/node-http-handler": ^2.0.1 + "@smithy/protocol-http": ^2.0.1 + "@smithy/smithy-client": ^2.0.1 + "@smithy/types": ^2.0.2 + "@smithy/url-parser": ^2.0.1 + "@smithy/util-base64": ^2.0.0 + "@smithy/util-body-length-browser": ^2.0.0 + "@smithy/util-body-length-node": ^2.0.0 + "@smithy/util-defaults-mode-browser": ^2.0.1 + "@smithy/util-defaults-mode-node": ^2.0.1 + "@smithy/util-retry": ^2.0.0 + "@smithy/util-utf8": ^2.0.0 + tslib: ^2.5.0 + checksum: ef6c13d334913e05d3f4e0296259312beb8e257a8ed2a7421bf3239e96b8712259e8f94c12d26dc2b3b2948dfd1ea1141bde24931916c55ab398f7556e05bb6b + languageName: node + linkType: hard + +"@aws-sdk/client-sts@npm:3.382.0": + version: 3.382.0 + resolution: "@aws-sdk/client-sts@npm:3.382.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/credential-provider-node": 3.382.0 + "@aws-sdk/middleware-host-header": 3.379.1 + "@aws-sdk/middleware-logger": 3.378.0 + "@aws-sdk/middleware-recursion-detection": 3.378.0 + "@aws-sdk/middleware-sdk-sts": 3.379.1 + "@aws-sdk/middleware-signing": 3.379.1 + "@aws-sdk/middleware-user-agent": 3.382.0 + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-endpoints": 3.382.0 + "@aws-sdk/util-user-agent-browser": 3.378.0 + "@aws-sdk/util-user-agent-node": 3.378.0 + "@smithy/config-resolver": ^2.0.1 + "@smithy/fetch-http-handler": ^2.0.1 + "@smithy/hash-node": ^2.0.1 + "@smithy/invalid-dependency": ^2.0.1 + "@smithy/middleware-content-length": ^2.0.1 + "@smithy/middleware-endpoint": ^2.0.1 + "@smithy/middleware-retry": ^2.0.1 + "@smithy/middleware-serde": ^2.0.1 + "@smithy/middleware-stack": ^2.0.0 + "@smithy/node-config-provider": ^2.0.1 + "@smithy/node-http-handler": ^2.0.1 + "@smithy/protocol-http": ^2.0.1 + "@smithy/smithy-client": ^2.0.1 + "@smithy/types": ^2.0.2 + "@smithy/url-parser": ^2.0.1 + "@smithy/util-base64": ^2.0.0 + "@smithy/util-body-length-browser": ^2.0.0 + "@smithy/util-body-length-node": ^2.0.0 + "@smithy/util-defaults-mode-browser": ^2.0.1 + "@smithy/util-defaults-mode-node": ^2.0.1 + "@smithy/util-retry": ^2.0.0 + "@smithy/util-utf8": ^2.0.0 + fast-xml-parser: 4.2.5 + tslib: ^2.5.0 + checksum: e13fe8cfc271ea8fb56718e3e844a9715960165b65f6f8b226f02859d34344f1380987a4ce808530444c78853033ec37048dd4fa9c93ac0df8de89eeba71bd8e + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-env@npm:3.378.0": + version: 3.378.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.378.0" + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/property-provider": ^2.0.0 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: ff32e595305f93756bb8fe9b26ca9a5336ca0517ca0d62dfc4cfa36d3bb990a65ebe7b0afcebaf102e4037ddb5b03132a6dde268f421bb72cbbd4249a22715b6 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-ini@npm:3.382.0": + version: 3.382.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.382.0" + dependencies: + "@aws-sdk/credential-provider-env": 3.378.0 + "@aws-sdk/credential-provider-process": 3.378.0 + "@aws-sdk/credential-provider-sso": 3.382.0 + "@aws-sdk/credential-provider-web-identity": 3.378.0 + "@aws-sdk/types": 3.378.0 + "@smithy/credential-provider-imds": ^2.0.0 + "@smithy/property-provider": ^2.0.0 + "@smithy/shared-ini-file-loader": ^2.0.0 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: c52c431f03864d46d23e3515516c62a91af175995fba9dadb7cff4e005d7d2ed19b9b5508859768ce4d98746da260709e7caf703c7211b1a21c62a6a1606ef5d + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-node@npm:3.382.0": + version: 3.382.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.382.0" + dependencies: + "@aws-sdk/credential-provider-env": 3.378.0 + "@aws-sdk/credential-provider-ini": 3.382.0 + "@aws-sdk/credential-provider-process": 3.378.0 + "@aws-sdk/credential-provider-sso": 3.382.0 + "@aws-sdk/credential-provider-web-identity": 3.378.0 + "@aws-sdk/types": 3.378.0 + "@smithy/credential-provider-imds": ^2.0.0 + "@smithy/property-provider": ^2.0.0 + "@smithy/shared-ini-file-loader": ^2.0.0 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 895405b84fc938b0c3e34f73c63b5426761de3bc2dcfa06e1a06f55ae0f8135d81530c0340c0b1b33b4bcb479f5048a9ec0390288503a261c692a0df2a0b933d + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-process@npm:3.378.0": + version: 3.378.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.378.0" + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/property-provider": ^2.0.0 + "@smithy/shared-ini-file-loader": ^2.0.0 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 6b8343fb9266ef490bf8e654f0d0b53585498ecf755e0e5cbee9bc93426927703637d02740050c491738a83c097a4d848244f3a66a633fd526d9339d846bdbdd + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-sso@npm:3.382.0": + version: 3.382.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.382.0" + dependencies: + "@aws-sdk/client-sso": 3.382.0 + "@aws-sdk/token-providers": 3.382.0 + "@aws-sdk/types": 3.378.0 + "@smithy/property-provider": ^2.0.0 + "@smithy/shared-ini-file-loader": ^2.0.0 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: ec0d216077a0dd5724fed30cdbc4a235b998c5b5821ba250be749e0e4c0410ce1e06c1a2531281570798b77fbe7a9ff36a0d9960853d8f6b2d98247702649d68 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-web-identity@npm:3.378.0": + version: 3.378.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.378.0" + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/property-provider": ^2.0.0 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 22cf227f609ea654749517e25c88e9c5e7b9dd97cc781d168b1f7cedf26a692a0d1643c3933a1975a95414c0d6a7dbcef6255ca4f13a788e101f95372e17a3af + languageName: node + linkType: hard + +"@aws-sdk/middleware-host-header@npm:3.379.1": + version: 3.379.1 + resolution: "@aws-sdk/middleware-host-header@npm:3.379.1" + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/protocol-http": ^2.0.1 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 32651531108e43edf745721828feab703ab7f39837da8214bb37593200daab71042336a25b58bd9b3e9b78ac647a828674a48ebbc1f5946a533f8642fb16b92d + languageName: node + linkType: hard + +"@aws-sdk/middleware-logger@npm:3.378.0": + version: 3.378.0 + resolution: "@aws-sdk/middleware-logger@npm:3.378.0" + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: c1c32a5ba4ae92cf988d2c0fed3a15975e1b4612cb546133ac74eb91276fc0714278e3aa30e88d0fae00596208baed76b58e97d952daafd63777b79f185a6c3f + languageName: node + linkType: hard + +"@aws-sdk/middleware-recursion-detection@npm:3.378.0": + version: 3.378.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.378.0" + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/protocol-http": ^2.0.1 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 2104b3834ac6674afac7a50eb4430277ef789f3fbf439d2adab9d43b6dca5dad7518f2a8cb578d3f2ff2c9883ee4e756c7fa10166c0e49f8ea307555f69b06f0 + languageName: node + linkType: hard + +"@aws-sdk/middleware-sdk-sts@npm:3.379.1": + version: 3.379.1 + resolution: "@aws-sdk/middleware-sdk-sts@npm:3.379.1" + dependencies: + "@aws-sdk/middleware-signing": 3.379.1 + "@aws-sdk/types": 3.378.0 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 22fd2f565c5270ca0de75fbd7d751e15639a8d5fb75656bd8caf62091eda8e47ea208514964a1ae211db63b4d7e98d9a8a8f6e4067953e18a74c039e1a8b9084 + languageName: node + linkType: hard + +"@aws-sdk/middleware-signing@npm:3.379.1": + version: 3.379.1 + resolution: "@aws-sdk/middleware-signing@npm:3.379.1" + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/property-provider": ^2.0.0 + "@smithy/protocol-http": ^2.0.1 + "@smithy/signature-v4": ^2.0.0 + "@smithy/types": ^2.0.2 + "@smithy/util-middleware": ^2.0.0 + tslib: ^2.5.0 + checksum: f36f6de13624f504f14db8039e02a6473d366eb11c670f555613ddeb0feac523d08f7d66a985c2a7c1eee548c66f55ac4ed7c148e79efe3fa1f5ad165af627f4 + languageName: node + linkType: hard + +"@aws-sdk/middleware-user-agent@npm:3.382.0": + version: 3.382.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.382.0" + dependencies: + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-endpoints": 3.382.0 + "@smithy/protocol-http": ^2.0.1 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: e53150ecc07f408caa6fa69e6e30ebf9aa000fb59737eeb350fdf4db4789e0d2163bf14f17f4ff4223174e932ce5b71bd9ec662efc61a78a963e12891ecfed6f + languageName: node + linkType: hard + +"@aws-sdk/token-providers@npm:3.382.0": + version: 3.382.0 + resolution: "@aws-sdk/token-providers@npm:3.382.0" + dependencies: + "@aws-sdk/client-sso-oidc": 3.382.0 + "@aws-sdk/types": 3.378.0 + "@smithy/property-provider": ^2.0.0 + "@smithy/shared-ini-file-loader": ^2.0.0 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 813dc973f616c2d7ec6f71da14e92d7c4b84c28309ac4d8426fe88d0c6bbe70006f9df0a984985cfcf232976188afc3d17ac5168e832e717ae4db41a21c6d67d + languageName: node + linkType: hard + +"@aws-sdk/types@npm:3.378.0, @aws-sdk/types@npm:^3.222.0": + version: 3.378.0 + resolution: "@aws-sdk/types@npm:3.378.0" + dependencies: + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: c4c7ebb48a625cb990a1288466f2dd8f0d770078cc77b60d5ee4a803b473ff41df474271dff26d3dadad151d5a016b398167738dd4926266ff1cd04585d4d8e8 + languageName: node + linkType: hard + +"@aws-sdk/util-endpoints@npm:3.382.0": + version: 3.382.0 + resolution: "@aws-sdk/util-endpoints@npm:3.382.0" + dependencies: + "@aws-sdk/types": 3.378.0 + tslib: ^2.5.0 + checksum: 9573e0d30ef7aafb5f51a51d7cf0416b8fe21af6456bff2c1e660a615325012177b70bf78f6591dbb6d863f4e57ac6ac3279bfa3eca2d504a9121f82edf73118 + languageName: node + linkType: hard + +"@aws-sdk/util-locate-window@npm:^3.0.0": + version: 3.310.0 + resolution: "@aws-sdk/util-locate-window@npm:3.310.0" + dependencies: + tslib: ^2.5.0 + checksum: d552ce5f0f836ecb13d7920ae650552c56706f26a5e8abf894ba471e18775a3791869bda95269153735bac9d211efc3ba78ea01c34428c3fed4318ac693a08bc + languageName: node + linkType: hard + +"@aws-sdk/util-user-agent-browser@npm:3.378.0": + version: 3.378.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.378.0" + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/types": ^2.0.2 + bowser: ^2.11.0 + tslib: ^2.5.0 + checksum: 412ef9ffdcd3d32b9e9bb62dfa252871bc9fbee19814553aeff65bffb21de6ca236199b47eb646c4af8cb326aebab3d63ef4b303050e61fb08eed0d12bb73f8c + languageName: node + linkType: hard + +"@aws-sdk/util-user-agent-node@npm:3.378.0": + version: 3.378.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.378.0" + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/node-config-provider": ^2.0.1 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + peerDependencies: + aws-crt: ">=1.0.0" + peerDependenciesMeta: + aws-crt: + optional: true + checksum: b37271d56a8d91072b7af5d71351e388a822b389167638d779ce0b099a1024b412fd3b50a6b6334687a3ae0bebec89479e48a9dceed2262f8801e76e3b5f89ad + languageName: node + linkType: hard + +"@aws-sdk/util-utf8-browser@npm:^3.0.0": + version: 3.259.0 + resolution: "@aws-sdk/util-utf8-browser@npm:3.259.0" + dependencies: + tslib: ^2.3.1 + checksum: b6a1e580da1c9b62c749814182a7649a748ca4253edb4063aa521df97d25b76eae3359eb1680b86f71aac668e05cc05c514379bca39ebf4ba998ae4348412da8 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/code-frame@npm:7.22.5" + dependencies: + "@babel/highlight": ^7.22.5 + checksum: cfe804f518f53faaf9a1d3e0f9f74127ab9a004912c3a16fda07fb6a633393ecb9918a053cb71804204c1b7ec3d49e1699604715e2cfb0c9f7bc4933d324ebb6 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.22.9": + version: 7.22.9 + resolution: "@babel/compat-data@npm:7.22.9" + checksum: bed77d9044ce948b4327b30dd0de0779fa9f3a7ed1f2d31638714ed00229fa71fc4d1617ae0eb1fad419338d3658d0e9a5a083297451e09e73e078d0347ff808 + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": + version: 7.22.9 + resolution: "@babel/core@npm:7.22.9" + dependencies: + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.22.5 + "@babel/generator": ^7.22.9 + "@babel/helper-compilation-targets": ^7.22.9 + "@babel/helper-module-transforms": ^7.22.9 + "@babel/helpers": ^7.22.6 + "@babel/parser": ^7.22.7 + "@babel/template": ^7.22.5 + "@babel/traverse": ^7.22.8 + "@babel/types": ^7.22.5 + convert-source-map: ^1.7.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.2 + semver: ^6.3.1 + checksum: 7bf069aeceb417902c4efdaefab1f7b94adb7dea694a9aed1bda2edf4135348a080820529b1a300c6f8605740a00ca00c19b2d5e74b5dd489d99d8c11d5e56d1 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.22.7, @babel/generator@npm:^7.22.9, @babel/generator@npm:^7.7.2": + version: 7.22.9 + resolution: "@babel/generator@npm:7.22.9" + dependencies: + "@babel/types": ^7.22.5 + "@jridgewell/gen-mapping": ^0.3.2 + "@jridgewell/trace-mapping": ^0.3.17 + jsesc: ^2.5.1 + checksum: 7c9d2c58b8d5ac5e047421a6ab03ec2ff5d9a5ff2c2212130a0055e063ac349e0b19d435537d6886c999771aef394832e4f54cd9fc810100a7f23d982f6af06b + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.22.9": + version: 7.22.9 + resolution: "@babel/helper-compilation-targets@npm:7.22.9" + dependencies: + "@babel/compat-data": ^7.22.9 + "@babel/helper-validator-option": ^7.22.5 + browserslist: ^4.21.9 + lru-cache: ^5.1.1 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: ea0006c6a93759025f4a35a25228ae260538c9f15023e8aac2a6d45ca68aef4cf86cfc429b19af9a402cbdd54d5de74ad3fbcf6baa7e48184dc079f1a791e178 + languageName: node + linkType: hard + +"@babel/helper-environment-visitor@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-environment-visitor@npm:7.22.5" + checksum: 248532077d732a34cd0844eb7b078ff917c3a8ec81a7f133593f71a860a582f05b60f818dc5049c2212e5baa12289c27889a4b81d56ef409b4863db49646c4b1 + languageName: node + linkType: hard + +"@babel/helper-function-name@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-function-name@npm:7.22.5" + dependencies: + "@babel/template": ^7.22.5 + "@babel/types": ^7.22.5 + checksum: 6b1f6ce1b1f4e513bf2c8385a557ea0dd7fa37971b9002ad19268ca4384bbe90c09681fe4c076013f33deabc63a53b341ed91e792de741b4b35e01c00238177a + languageName: node + linkType: hard + +"@babel/helper-hoist-variables@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-hoist-variables@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: 394ca191b4ac908a76e7c50ab52102669efe3a1c277033e49467913c7ed6f7c64d7eacbeabf3bed39ea1f41731e22993f763b1edce0f74ff8563fd1f380d92cc + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-module-imports@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: 9ac2b0404fa38b80bdf2653fbeaf8e8a43ccb41bd505f9741d820ed95d3c4e037c62a1bcdcb6c9527d7798d2e595924c4d025daed73283badc180ada2c9c49ad + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.22.9": + version: 7.22.9 + resolution: "@babel/helper-module-transforms@npm:7.22.9" + dependencies: + "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-module-imports": ^7.22.5 + "@babel/helper-simple-access": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/helper-validator-identifier": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 2751f77660518cf4ff027514d6f4794f04598c6393be7b04b8e46c6e21606e11c19f3f57ab6129a9c21bacdf8b3ffe3af87bb401d972f34af2d0ffde02ac3001 + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.22.5 + resolution: "@babel/helper-plugin-utils@npm:7.22.5" + checksum: c0fc7227076b6041acd2f0e818145d2e8c41968cc52fb5ca70eed48e21b8fe6dd88a0a91cbddf4951e33647336eb5ae184747ca706817ca3bef5e9e905151ff5 + languageName: node + linkType: hard + +"@babel/helper-simple-access@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-simple-access@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: fe9686714caf7d70aedb46c3cce090f8b915b206e09225f1e4dbc416786c2fdbbee40b38b23c268b7ccef749dd2db35f255338fb4f2444429874d900dede5ad2 + languageName: node + linkType: hard + +"@babel/helper-split-export-declaration@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/helper-split-export-declaration@npm:7.22.6" + dependencies: + "@babel/types": ^7.22.5 + checksum: e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-string-parser@npm:7.22.5" + checksum: 836851ca5ec813077bbb303acc992d75a360267aa3b5de7134d220411c852a6f17de7c0d0b8c8dcc0f567f67874c00f4528672b2a4f1bc978a3ada64c8c78467 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-validator-identifier@npm:7.22.5" + checksum: 7f0f30113474a28298c12161763b49de5018732290ca4de13cdaefd4fd0d635a6fe3f6686c37a02905fb1e64f21a5ee2b55140cf7b070e729f1bd66866506aea + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-validator-option@npm:7.22.5" + checksum: bbeca8a85ee86990215c0424997438b388b8d642d69b9f86c375a174d3cdeb270efafd1ff128bc7a1d370923d13b6e45829ba8581c027620e83e3a80c5c414b3 + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/helpers@npm:7.22.6" + dependencies: + "@babel/template": ^7.22.5 + "@babel/traverse": ^7.22.6 + "@babel/types": ^7.22.5 + checksum: 5c1f33241fe7bf7709868c2105134a0a86dca26a0fbd508af10a89312b1f77ca38ebae43e50be3b208613c5eacca1559618af4ca236f0abc55d294800faeff30 + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/highlight@npm:7.22.5" + dependencies: + "@babel/helper-validator-identifier": ^7.22.5 + chalk: ^2.0.0 + js-tokens: ^4.0.0 + checksum: f61ae6de6ee0ea8d9b5bcf2a532faec5ab0a1dc0f7c640e5047fc61630a0edb88b18d8c92eb06566d30da7a27db841aca11820ecd3ebe9ce514c9350fbed39c4 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.22.7": + version: 7.22.7 + resolution: "@babel/parser@npm:7.22.7" + bin: + parser: ./bin/babel-parser.js + checksum: 02209ddbd445831ee8bf966fdf7c29d189ed4b14343a68eb2479d940e7e3846340d7cc6bd654a5f3d87d19dc84f49f50a58cf9363bee249dc5409ff3ba3dab54 + languageName: node + linkType: hard + +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 + languageName: node + linkType: hard + +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.8.3": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": ^7.12.13 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.22.5 + resolution: "@babel/plugin-syntax-jsx@npm:7.22.5" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8829d30c2617ab31393d99cec2978e41f014f4ac6f01a1cecf4c4dd8320c3ec12fdc3ce121126b2d8d32f6887e99ca1a0bad53dedb1e6ad165640b92b24980ce + languageName: node + linkType: hard + +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 + languageName: node + linkType: hard + +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.8.3": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.22.5 + resolution: "@babel/plugin-syntax-typescript@npm:7.22.5" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8ab7718fbb026d64da93681a57797d60326097fd7cb930380c8bffd9eb101689e90142c760a14b51e8e69c88a73ba3da956cb4520a3b0c65743aee5c71ef360a + languageName: node + linkType: hard + +"@babel/template@npm:^7.22.5, @babel/template@npm:^7.3.3": + version: 7.22.5 + resolution: "@babel/template@npm:7.22.5" + dependencies: + "@babel/code-frame": ^7.22.5 + "@babel/parser": ^7.22.5 + "@babel/types": ^7.22.5 + checksum: c5746410164039aca61829cdb42e9a55410f43cace6f51ca443313f3d0bdfa9a5a330d0b0df73dc17ef885c72104234ae05efede37c1cc8a72dc9f93425977a3 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.22.6, @babel/traverse@npm:^7.22.8": + version: 7.22.8 + resolution: "@babel/traverse@npm:7.22.8" + dependencies: + "@babel/code-frame": ^7.22.5 + "@babel/generator": ^7.22.7 + "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-function-name": ^7.22.5 + "@babel/helper-hoist-variables": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/parser": ^7.22.7 + "@babel/types": ^7.22.5 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: a381369bc3eedfd13ed5fef7b884657f1c29024ea7388198149f0edc34bd69ce3966e9f40188d15f56490a5e12ba250ccc485f2882b53d41b054fccefb233e33 + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.5, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.22.5 + resolution: "@babel/types@npm:7.22.5" + dependencies: + "@babel/helper-string-parser": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.5 + to-fast-properties: ^2.0.0 + checksum: c13a9c1dc7d2d1a241a2f8363540cb9af1d66e978e8984b400a20c4f38ba38ca29f06e26a0f2d49a70bad9e57615dac09c35accfddf1bb90d23cd3e0a0bab892 + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa + languageName: node + linkType: hard + +"@edgedb/generate@npm:^0.3.1": + version: 0.3.1 + resolution: "@edgedb/generate@npm:0.3.1" + peerDependencies: + edgedb: ^1.3.2 + bin: + generate: dist/cli.js + checksum: 06ad779a1a9a96977e22b941a96e0fbdcda4b5403e3047f2257811f43ea61644f00e81feb7ea23f0ae57efa2b8f89ea34a312e0a29671265e46b1e23e4cdc185 + languageName: node + linkType: hard + +"@esbuild-kit/cjs-loader@npm:^2.4.2": + version: 2.4.2 + resolution: "@esbuild-kit/cjs-loader@npm:2.4.2" + dependencies: + "@esbuild-kit/core-utils": ^3.0.0 + get-tsconfig: ^4.4.0 + checksum: e346e339bfc7eff5c52c270fd0ec06a7f2341b624adfb69f84b7d83f119c35070420906f2761a0b4604e0a0ec90e35eaf12544585476c428ed6d6ee3b250c0fe + languageName: node + linkType: hard + +"@esbuild-kit/core-utils@npm:^3.0.0": + version: 3.1.0 + resolution: "@esbuild-kit/core-utils@npm:3.1.0" + dependencies: + esbuild: ~0.17.6 + source-map-support: ^0.5.21 + checksum: d54fd5adb3ce6784d84bb025ad54ddcfbab99267071a7f65298e547f56696f0b9d0dba96c535f9678a30d4887ec71cd445fdd277d65fbec1f3b504f6808f693e + languageName: node + linkType: hard + +"@esbuild-kit/esm-loader@npm:^2.5.5": + version: 2.5.5 + resolution: "@esbuild-kit/esm-loader@npm:2.5.5" + dependencies: + "@esbuild-kit/core-utils": ^3.0.0 + get-tsconfig: ^4.4.0 + checksum: 9d4a03ffc937fbec75a8456c3d45d7cdb1a65768416791a5720081753502bc9f485ba27942a46f564b12483b140a8a46c12433a4496430d93e4513e430484ec7 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-arm64@npm:0.17.19" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-arm@npm:0.17.19" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-x64@npm:0.17.19" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/darwin-arm64@npm:0.17.19" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/darwin-x64@npm:0.17.19" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/freebsd-arm64@npm:0.17.19" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/freebsd-x64@npm:0.17.19" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-arm64@npm:0.17.19" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-arm@npm:0.17.19" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-ia32@npm:0.17.19" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-loong64@npm:0.17.19" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-mips64el@npm:0.17.19" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-ppc64@npm:0.17.19" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-riscv64@npm:0.17.19" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-s390x@npm:0.17.19" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-x64@npm:0.17.19" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/netbsd-x64@npm:0.17.19" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/openbsd-x64@npm:0.17.19" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/sunos-x64@npm:0.17.19" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/win32-arm64@npm:0.17.19" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/win32-ia32@npm:0.17.19" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/win32-x64@npm:0.17.19" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@fastify/ajv-compiler@npm:^3.5.0": + version: 3.5.0 + resolution: "@fastify/ajv-compiler@npm:3.5.0" + dependencies: + ajv: ^8.11.0 + ajv-formats: ^2.1.1 + fast-uri: ^2.0.0 + checksum: 5e5b16469f8d586473d0b32e3a9cf38c0d86ef2a6fb7ea12ed7f3665642bd8eb2dde9adcc317814369cb5a58210bfdac35996fa87d1cc23e88bbc799f0b128b0 + languageName: node + linkType: hard + +"@fastify/deepmerge@npm:^1.0.0": + version: 1.3.0 + resolution: "@fastify/deepmerge@npm:1.3.0" + checksum: 33ec927905dca320d7ae9535a1521909f7c82339706345324ab6287ad100589a799b8257c15b0e582c7bb74e2aa4883d82ba0228d7b116aa8789ada4f78d6974 + languageName: node + linkType: hard + +"@fastify/error@npm:^3.2.0": + version: 3.3.0 + resolution: "@fastify/error@npm:3.3.0" + checksum: 202507c8c7f49922cac2f5afc82802151b0bd9c583ca1c2850bf43d0f4cd97eedb3a3388b9016da74f8a01b517a5861d1f666c506dd64fd22995e559bc139264 + languageName: node + linkType: hard + +"@fastify/fast-json-stringify-compiler@npm:^4.3.0": + version: 4.3.0 + resolution: "@fastify/fast-json-stringify-compiler@npm:4.3.0" + dependencies: + fast-json-stringify: ^5.7.0 + checksum: 2734afabe2539d3e15d2bd9f8dfee756d9cd969f7303dc085dd91c744ff61742bb0d3ebd3b561cf3c32be54567048a634b4962f943eb6bd9ed3fbd71cbf6a4fa + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: ^5.1.2 + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: ^7.0.1 + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: ^8.1.0 + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb + languageName: node + linkType: hard + +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: ^5.3.1 + find-up: ^4.1.0 + get-package-type: ^0.1.0 + js-yaml: ^3.13.1 + resolve-from: ^5.0.0 + checksum: d578da5e2e804d5c93228450a1380e1a3c691de4953acc162f387b717258512a3e07b83510a936d9fab03eac90817473917e24f5d16297af3867f59328d58568 + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 + languageName: node + linkType: hard + +"@jest/console@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/console@npm:29.6.2" + dependencies: + "@jest/types": ^29.6.1 + "@types/node": "*" + chalk: ^4.0.0 + jest-message-util: ^29.6.2 + jest-util: ^29.6.2 + slash: ^3.0.0 + checksum: 1198667bda0430770c3e9b92681c0ee9f8346394574071c633f306192ac5f08e12972d6a5fdf03eb0d441051c8439bce0f6f9f355dc60d98777a35328331ba2e + languageName: node + linkType: hard + +"@jest/core@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/core@npm:29.6.2" + dependencies: + "@jest/console": ^29.6.2 + "@jest/reporters": ^29.6.2 + "@jest/test-result": ^29.6.2 + "@jest/transform": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + ci-info: ^3.2.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-changed-files: ^29.5.0 + jest-config: ^29.6.2 + jest-haste-map: ^29.6.2 + jest-message-util: ^29.6.2 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.6.2 + jest-resolve-dependencies: ^29.6.2 + jest-runner: ^29.6.2 + jest-runtime: ^29.6.2 + jest-snapshot: ^29.6.2 + jest-util: ^29.6.2 + jest-validate: ^29.6.2 + jest-watcher: ^29.6.2 + micromatch: ^4.0.4 + pretty-format: ^29.6.2 + slash: ^3.0.0 + strip-ansi: ^6.0.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 6bbb3886430248c0092f275b1b946a701406732f7442c04e63e4ee2297c2ec02d8ceeec508a202e08128197699b2bcddbae2c2f74adb2cf30f2f0d7d94a7c2dc + languageName: node + linkType: hard + +"@jest/environment@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/environment@npm:29.6.2" + dependencies: + "@jest/fake-timers": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + jest-mock: ^29.6.2 + checksum: c7de0e4c0d9166e02d0eb166574e05ec460e1db3b69d6476e63244edd52d7c917e6876af55fe723ff3086f52c0b1869dec60654054735a7a48c9d4ac43af2a25 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/expect-utils@npm:29.6.2" + dependencies: + jest-get-type: ^29.4.3 + checksum: 0decf2009aa3735f9df469e78ce1721c2815e4278439887e0cf0321ca8979541a22515d114a59b2445a6cd70a074b09dc9c00b5e7b3b3feac5174b9c4a78b2e1 + languageName: node + linkType: hard + +"@jest/expect@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/expect@npm:29.6.2" + dependencies: + expect: ^29.6.2 + jest-snapshot: ^29.6.2 + checksum: bd2d88a4e7c5420079c239afef341ec53dc7e353816cd13acbb42631a31fd321fe58677bb43a4dba851028f4c7e31da7980314e9094cd5b348896cb6cd3d42b2 + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/fake-timers@npm:29.6.2" + dependencies: + "@jest/types": ^29.6.1 + "@sinonjs/fake-timers": ^10.0.2 + "@types/node": "*" + jest-message-util: ^29.6.2 + jest-mock: ^29.6.2 + jest-util: ^29.6.2 + checksum: 1abcda02f22d2ba32e178b7ab80a9180235a6c75ec9faef33324627b19a70dad64889a9ea49b8f07230e14a6e683b9120542c6d1d6b2ecaf937f4efde32dad88 + languageName: node + linkType: hard + +"@jest/globals@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/globals@npm:29.6.2" + dependencies: + "@jest/environment": ^29.6.2 + "@jest/expect": ^29.6.2 + "@jest/types": ^29.6.1 + jest-mock: ^29.6.2 + checksum: aa4a54f19cc025205bc696546940e1fe9c752c2d4d825852088aa76d44677ebba1ec66fabb78e615480cff23a06a70b5a3f893ab5163d901cdfa0d2267870b10 + languageName: node + linkType: hard + +"@jest/reporters@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/reporters@npm:29.6.2" + dependencies: + "@bcoe/v8-coverage": ^0.2.3 + "@jest/console": ^29.6.2 + "@jest/test-result": ^29.6.2 + "@jest/transform": ^29.6.2 + "@jest/types": ^29.6.1 + "@jridgewell/trace-mapping": ^0.3.18 + "@types/node": "*" + chalk: ^4.0.0 + collect-v8-coverage: ^1.0.0 + exit: ^0.1.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + istanbul-lib-coverage: ^3.0.0 + istanbul-lib-instrument: ^5.1.0 + istanbul-lib-report: ^3.0.0 + istanbul-lib-source-maps: ^4.0.0 + istanbul-reports: ^3.1.3 + jest-message-util: ^29.6.2 + jest-util: ^29.6.2 + jest-worker: ^29.6.2 + slash: ^3.0.0 + string-length: ^4.0.1 + strip-ansi: ^6.0.0 + v8-to-istanbul: ^9.0.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 7cf880d0730cee7d24ee96928003ef6946bf93423b0ae9a2edb53cae2c231b8ac50ec264f48a73744e3f11ca319cd414edacf99b2e7bf37cd72fe0b362090dd1 + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/schemas@npm:29.6.0" + dependencies: + "@sinclair/typebox": ^0.27.8 + checksum: c00511c69cf89138a7d974404d3a5060af375b5a52b9c87215d91873129b382ca11c1ff25bd6d605951404bb381ddce5f8091004a61e76457da35db1f5c51365 + languageName: node + linkType: hard + +"@jest/source-map@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/source-map@npm:29.6.0" + dependencies: + "@jridgewell/trace-mapping": ^0.3.18 + callsites: ^3.0.0 + graceful-fs: ^4.2.9 + checksum: 9c6c40387410bb70b2fae8124287fc28f6bdd1b2d7f24348e8611e1bb638b404518228a4ce64a582365b589c536ae8e7ebab0126cef59a87874b71061d19783b + languageName: node + linkType: hard + +"@jest/test-result@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/test-result@npm:29.6.2" + dependencies: + "@jest/console": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/istanbul-lib-coverage": ^2.0.0 + collect-v8-coverage: ^1.0.0 + checksum: 8aff37f18c8d2df4d9f453d57ec018a6479eb697fabcf74b1ca06e34553da1d7a2b85580a290408ba0b02e58543263244a2cb065c7c7180c8d8180cc78444fbd + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/test-sequencer@npm:29.6.2" + dependencies: + "@jest/test-result": ^29.6.2 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.6.2 + slash: ^3.0.0 + checksum: 12dc2577e45eeb98b85d1769846b7d6effa536907986ad3c4cbd014df9e24431a564cc8cd94603332e4b1f9bfb421371883efc6a5085b361a52425ffc2a52dc6 + languageName: node + linkType: hard + +"@jest/transform@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/transform@npm:29.6.2" + dependencies: + "@babel/core": ^7.11.6 + "@jest/types": ^29.6.1 + "@jridgewell/trace-mapping": ^0.3.18 + babel-plugin-istanbul: ^6.1.1 + chalk: ^4.0.0 + convert-source-map: ^2.0.0 + fast-json-stable-stringify: ^2.1.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.6.2 + jest-regex-util: ^29.4.3 + jest-util: ^29.6.2 + micromatch: ^4.0.4 + pirates: ^4.0.4 + slash: ^3.0.0 + write-file-atomic: ^4.0.2 + checksum: ffb8c3c344cd48bedadec295d9c436737eccc39c1f0868aa9753b76397b33b2e5b121058af6f287ba6f2036181137e37df1212334bfa9d9a712986a4518cdc18 + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.1": + version: 29.6.1 + resolution: "@jest/types@npm:29.6.1" + dependencies: + "@jest/schemas": ^29.6.0 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: 89fc1ccf71a84fe0da643e0675b1cfe6a6f19ea72e935b2ab1dbdb56ec547e94433fb59b3536d3832a6e156c077865b7176fe9dae707dab9c3d2f9405ba6233c + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": + version: 0.3.3 + resolution: "@jridgewell/gen-mapping@npm:0.3.3" + dependencies: + "@jridgewell/set-array": ^1.0.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:3.1.0": + version: 3.1.0 + resolution: "@jridgewell/resolve-uri@npm:3.1.0" + checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.0.1": + version: 1.1.2 + resolution: "@jridgewell/set-array@npm:1.1.2" + checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:1.4.14": + version: 1.4.14 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" + checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.18 + resolution: "@jridgewell/trace-mapping@npm:0.3.18" + dependencies: + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + checksum: 0572669f855260808c16fe8f78f5f1b4356463b11d3f2c7c0b5580c8ba1cbf4ae53efe9f627595830856e57dbac2325ac17eb0c3dd0ec42102e6f227cc289c02 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: ^7.3.5 + checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 00bd7362a3439021aa1ea51b0e0d0a0e8ca1351a3d54c606b115fdcc49b51b16db6e5f43b4fe7a28c38688523e22a94d49dd31168868b655f0d4d50f032d07a1 + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^3.0.0": + version: 3.0.0 + resolution: "@sinonjs/commons@npm:3.0.0" + dependencies: + type-detect: 4.0.8 + checksum: b4b5b73d4df4560fb8c0c7b38c7ad4aeabedd362f3373859d804c988c725889cde33550e4bcc7cd316a30f5152a2d1d43db71b6d0c38f5feef71fd8d016763f8 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" + dependencies: + "@sinonjs/commons": ^3.0.0 + checksum: 614d30cb4d5201550c940945d44c9e0b6d64a888ff2cd5b357f95ad6721070d6b8839cd10e15b76bf5e14af0bcc1d8f9ec00d49a46318f1f669a4bec1d7f3148 + languageName: node + linkType: hard + +"@smithy/abort-controller@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/abort-controller@npm:2.0.1" + dependencies: + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: ec126164886a6f44ed83bde7599cd1a16e20cf429c05bf68897d06220b638aab6c7b6b3b937e65fc25d383d015ed2218ca8c1afaed2ff65fad197d0df2ccebc7 + languageName: node + linkType: hard + +"@smithy/config-resolver@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/config-resolver@npm:2.0.1" + dependencies: + "@smithy/types": ^2.0.2 + "@smithy/util-config-provider": ^2.0.0 + "@smithy/util-middleware": ^2.0.0 + tslib: ^2.5.0 + checksum: ded6c77fd29ab026b5dcc1b4c4adb417515f7fd18af80f487f1868273ae98003d35ff7c6286207895fc74f5098e6eb8a94555a5af89818796a2fb8bb01a80c60 + languageName: node + linkType: hard + +"@smithy/credential-provider-imds@npm:^2.0.0, @smithy/credential-provider-imds@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/credential-provider-imds@npm:2.0.1" + dependencies: + "@smithy/node-config-provider": ^2.0.1 + "@smithy/property-provider": ^2.0.1 + "@smithy/types": ^2.0.2 + "@smithy/url-parser": ^2.0.1 + tslib: ^2.5.0 + checksum: cf0ee4b50da5584685afc9019af1a8e8c910890dc3128a574b606b7845d898cd65429263682ef27da79dc358286f48b4452617a2fe9fcb98e5483908ac05ce8b + languageName: node + linkType: hard + +"@smithy/eventstream-codec@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/eventstream-codec@npm:2.0.1" + dependencies: + "@aws-crypto/crc32": 3.0.0 + "@smithy/types": ^2.0.2 + "@smithy/util-hex-encoding": ^2.0.0 + tslib: ^2.5.0 + checksum: 2b7dc1f974b5302dd9fc0982c2484a4d6286e512db78c1c0b8796a5916c3846644b02c6dbbc8433181aeb41c5468d73635459e9f37d640a0bdaf3fe670da8914 + languageName: node + linkType: hard + +"@smithy/fetch-http-handler@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/fetch-http-handler@npm:2.0.1" + dependencies: + "@smithy/protocol-http": ^2.0.1 + "@smithy/querystring-builder": ^2.0.1 + "@smithy/types": ^2.0.2 + "@smithy/util-base64": ^2.0.0 + tslib: ^2.5.0 + checksum: ba80a2182d3c68a88212a99cbeb1bd645f5f6f7584081763faf5590443266e9f32b15e8f7380eaf92ed61fe9fdfbdec1ec030eb0c02b68ed48b4fa710c6718e3 + languageName: node + linkType: hard + +"@smithy/hash-node@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/hash-node@npm:2.0.1" + dependencies: + "@smithy/types": ^2.0.2 + "@smithy/util-buffer-from": ^2.0.0 + "@smithy/util-utf8": ^2.0.0 + tslib: ^2.5.0 + checksum: e1a1b1ea44f42eacd982680877c31ce4ea4243455bc16e89357981c60902f93074874148701bc82776f41e66eacc6b16c8cc46cd7c99f4135ba13f4ba4a44edf + languageName: node + linkType: hard + +"@smithy/invalid-dependency@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/invalid-dependency@npm:2.0.1" + dependencies: + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: d50f5781c9e0b1cb336fa20979ee69640bfa586139237eacae9f9068e40c8c729b3b4646af5fab0250e8e49649acab14262d3524f515ecbecc58cd24b68b7ef5 + languageName: node + linkType: hard + +"@smithy/is-array-buffer@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/is-array-buffer@npm:2.0.0" + dependencies: + tslib: ^2.5.0 + checksum: 6d101cf509a7818667f42d297894f88f86ef41d3cc9d02eae38bbe5e69b16edf83b8e67eb691964d859a16a4e39db1aad323d83f6ae55ae4512a14ff6406c02d + languageName: node + linkType: hard + +"@smithy/middleware-content-length@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/middleware-content-length@npm:2.0.1" + dependencies: + "@smithy/protocol-http": ^2.0.1 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: f9074ba2d5780b0d55e46aeacff8276fb11acf828afdc813ec3c5f118323533f774dd2b99ae00c946993c5ba91c66afa5b40d66ce5f035a456cf6c4cd38a83e1 + languageName: node + linkType: hard + +"@smithy/middleware-endpoint@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/middleware-endpoint@npm:2.0.1" + dependencies: + "@smithy/middleware-serde": ^2.0.1 + "@smithy/types": ^2.0.2 + "@smithy/url-parser": ^2.0.1 + "@smithy/util-middleware": ^2.0.0 + tslib: ^2.5.0 + checksum: 5aa0a4c6972a533936dba5eb0d719bb9b534484a401f1a6135a201fc683083aa925d207f2155e15656b2c941c05de2a2aa74dae5e0b9d1a183371a3c3b90b3f6 + languageName: node + linkType: hard + +"@smithy/middleware-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/middleware-retry@npm:2.0.1" + dependencies: + "@smithy/protocol-http": ^2.0.1 + "@smithy/service-error-classification": ^2.0.0 + "@smithy/types": ^2.0.2 + "@smithy/util-middleware": ^2.0.0 + "@smithy/util-retry": ^2.0.0 + tslib: ^2.5.0 + uuid: ^8.3.2 + checksum: a1dd6d1feb560632075f3b3be2f3d406635dc3a158e286eb43f3b93c52deacb2a7c7262f3c911cb652f42e4cb4091155482b04a6c0c61360b650468a54f944b2 + languageName: node + linkType: hard + +"@smithy/middleware-serde@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/middleware-serde@npm:2.0.1" + dependencies: + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 115d2b94925f24e3592d6e3889179c30c8992957021bfdc67496f9e36dcb3ffe2282a01c0e439282e89c0a5b56bf125a1bec2c87aed02e325316e3b6050ed9fa + languageName: node + linkType: hard + +"@smithy/middleware-stack@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/middleware-stack@npm:2.0.0" + dependencies: + tslib: ^2.5.0 + checksum: dd23dff4da44964e936c5ae465de9416bb8dd67da2ae72ffe450156ad52e82475836ed5c18d82cef7edeca421b33d363889549e34482008eeb9ca0bb97f061f2 + languageName: node + linkType: hard + +"@smithy/node-config-provider@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/node-config-provider@npm:2.0.1" + dependencies: + "@smithy/property-provider": ^2.0.1 + "@smithy/shared-ini-file-loader": ^2.0.1 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 9752c8e7c01fc991b93bb080e8486b82d55d592a2c7573004c2e296c192c153b967c79c03be0924c59e14ffc3de04ca861e99370d2ae9a0d8c54f25ea3f99be8 + languageName: node + linkType: hard + +"@smithy/node-http-handler@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/node-http-handler@npm:2.0.1" + dependencies: + "@smithy/abort-controller": ^2.0.1 + "@smithy/protocol-http": ^2.0.1 + "@smithy/querystring-builder": ^2.0.1 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 04705e7c28fb71a5800a511f64dd182230a501742f779860b1d2155a02eec9c9df3b573e2ad9cd3a0148891f02b780edb7803c95b321dd4a2659715ac73566ee + languageName: node + linkType: hard + +"@smithy/property-provider@npm:^2.0.0, @smithy/property-provider@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/property-provider@npm:2.0.1" + dependencies: + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 56ea840032911b37a2e602144cf4cf08401a79a3ab06e226a4cf65a14b77e70e4d0bd8f762d172e322a0cf75f45bd1886a265687e090a2848798225e276f2882 + languageName: node + linkType: hard + +"@smithy/protocol-http@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/protocol-http@npm:2.0.1" + dependencies: + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: cc3d354fad3f27ab29cf7053bbdbbd150dca1864595a46d463abf06595af68e5c31cfc2d03b971fbb693cb9abd3be5763a195497a4fe19f8aed3132069ae3246 + languageName: node + linkType: hard + +"@smithy/querystring-builder@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/querystring-builder@npm:2.0.1" + dependencies: + "@smithy/types": ^2.0.2 + "@smithy/util-uri-escape": ^2.0.0 + tslib: ^2.5.0 + checksum: f8ec37623054fcbad8317b57ef41fc906f3f22260b365e7c3b107219dcf456c5c7347165f3bf25d47a4c592548d835778f9c8bc7cc7306b65aa6ce429d94a345 + languageName: node + linkType: hard + +"@smithy/querystring-parser@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/querystring-parser@npm:2.0.1" + dependencies: + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: a6107281ae33beb5518b85de82fea7692cfcb6c15155719c6ba6ee44cc75b20f07ce28214c635ee38b0474995c0a23b4872feef8bd9f98a7811b7ccf59bac819 + languageName: node + linkType: hard + +"@smithy/service-error-classification@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/service-error-classification@npm:2.0.0" + checksum: f6f9b869dca8e74871c428e1277dd3700f67b0ca61de69fc838ac55187bbc602193a7d1073113ea6916892babf3f8fe4938b182fc902ce0a415928799a7e3f9a + languageName: node + linkType: hard + +"@smithy/shared-ini-file-loader@npm:^2.0.0, @smithy/shared-ini-file-loader@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/shared-ini-file-loader@npm:2.0.1" + dependencies: + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 0f67d0ba9e44286a444301e603260a2ae5973324d43bc89f6ca15d2a830b32c1232474ff452cf3d607ee08d4fa6d17517fd901a4e6fd4dddbc571aa6b1ae3b6d + languageName: node + linkType: hard + +"@smithy/signature-v4@npm:^2.0.0": + version: 2.0.1 + resolution: "@smithy/signature-v4@npm:2.0.1" + dependencies: + "@smithy/eventstream-codec": ^2.0.1 + "@smithy/is-array-buffer": ^2.0.0 + "@smithy/types": ^2.0.2 + "@smithy/util-hex-encoding": ^2.0.0 + "@smithy/util-middleware": ^2.0.0 + "@smithy/util-uri-escape": ^2.0.0 + "@smithy/util-utf8": ^2.0.0 + tslib: ^2.5.0 + checksum: 2c4bc499251dfbdbea0359fc5196002ac805df7f6f87d7cba36164d8fcd16a749a3c1a52259569134628511dc496724d5e76744c1c39fee3a3f42c5fbfe3749b + languageName: node + linkType: hard + +"@smithy/smithy-client@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/smithy-client@npm:2.0.1" + dependencies: + "@smithy/middleware-stack": ^2.0.0 + "@smithy/types": ^2.0.2 + "@smithy/util-stream": ^2.0.1 + tslib: ^2.5.0 + checksum: 5c4abe0a0a67f2c2aa47cbf2806d0d44a34f97ebc83f1add9654d95cef3303fc0dff41237a7e360ae6c2be721e945c889bf869f11476a759c0ad82d61df18f5a + languageName: node + linkType: hard + +"@smithy/types@npm:^2.0.2": + version: 2.0.2 + resolution: "@smithy/types@npm:2.0.2" + dependencies: + tslib: ^2.5.0 + checksum: 4afdd7c77b212abd9e0770a1489057aa0470f8a59061c4fb2175b1f12e02180db3d85e16f2cd870a95c17bd28a5a4b8ef1dff1ade6852f85eafea12872d9588e + languageName: node + linkType: hard + +"@smithy/url-parser@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/url-parser@npm:2.0.1" + dependencies: + "@smithy/querystring-parser": ^2.0.1 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: 653bdeff812b972fa88a4e2d795c38df1aca68055818d150727b8b7d2b7b6bb00aed003b113febe371ed2e38e8dd4715b31af6afce7e883d937aed75e7ff48fb + languageName: node + linkType: hard + +"@smithy/util-base64@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/util-base64@npm:2.0.0" + dependencies: + "@smithy/util-buffer-from": ^2.0.0 + tslib: ^2.5.0 + checksum: 52124a684dfac853288acd2a0ffff02559c21bf7faaa3db58a914e4acb4b1f7925fd48593e7545db87f8f962250824d1249dc8be645ecbd2c1dd1728cfe1069b + languageName: node + linkType: hard + +"@smithy/util-body-length-browser@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/util-body-length-browser@npm:2.0.0" + dependencies: + tslib: ^2.5.0 + checksum: 4bccdd857bd24c9dcb6e9f2d5be03d59415f9a94d660ec7b3efb45e9aa04017f34c387368f176f24233a071af3b7a2b5f8236a2f5a83bfc884d24dfcc341e836 + languageName: node + linkType: hard + +"@smithy/util-body-length-node@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/util-body-length-node@npm:2.0.0" + dependencies: + tslib: ^2.5.0 + checksum: 47ded0cc99f880eda353700e10d6131289683164d4ef98a24a2d79449d33f3bbf70c1ce0a66fc457e0c8d14be9fb2a3430fa09302bbc3daa5d23129e11fff478 + languageName: node + linkType: hard + +"@smithy/util-buffer-from@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/util-buffer-from@npm:2.0.0" + dependencies: + "@smithy/is-array-buffer": ^2.0.0 + tslib: ^2.5.0 + checksum: d33cbf3e488d23390c88705ddae71b08de7a87b6453e38b508cd37a22a02e8b5be9f0cd46c1347b496c3977a815a7399b18840544ecdc4cce8cf3dcd0f5bb009 + languageName: node + linkType: hard + +"@smithy/util-config-provider@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/util-config-provider@npm:2.0.0" + dependencies: + tslib: ^2.5.0 + checksum: cdc34db5b42658a7c98652ddb2e35b31e0d76f22a051d71724927999a53467fb38fe6dcf228585544bc168cbd54ded3913e14cbc33c947d3c8a45ca518a9b7b0 + languageName: node + linkType: hard + +"@smithy/util-defaults-mode-browser@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/util-defaults-mode-browser@npm:2.0.1" + dependencies: + "@smithy/property-provider": ^2.0.1 + "@smithy/types": ^2.0.2 + bowser: ^2.11.0 + tslib: ^2.5.0 + checksum: b436183ca880c1bb607116c780e7e8d1e252aeb51daf5f35740281671a4553431f393847d74ad180e9388bf11aeab1c675f61bb3a34a0d2fa9943111b063b17d + languageName: node + linkType: hard + +"@smithy/util-defaults-mode-node@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/util-defaults-mode-node@npm:2.0.1" + dependencies: + "@smithy/config-resolver": ^2.0.1 + "@smithy/credential-provider-imds": ^2.0.1 + "@smithy/node-config-provider": ^2.0.1 + "@smithy/property-provider": ^2.0.1 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: ffd9601a8b37e1ea7a2c23bcaa70bf297c5c95113e8bab41a2f533d1a2f9f9631e66b5360312e202980dbd03ed3c8d8146dd33c8d4e5d3caf30c78a39b301de2 + languageName: node + linkType: hard + +"@smithy/util-hex-encoding@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/util-hex-encoding@npm:2.0.0" + dependencies: + tslib: ^2.5.0 + checksum: 884373e089d909e3c9805bdb78f367d1f3612e4e1e6d8f0263cc82a8b9689eddc0bc80b8b58aa711bd5b48d9cb124f9996906c172e951c9dac78984459e831cf + languageName: node + linkType: hard + +"@smithy/util-middleware@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/util-middleware@npm:2.0.0" + dependencies: + tslib: ^2.5.0 + checksum: 10401734a10e0c48ed684f20b7a34c40ed85f2e906e61adb6295963d035f2a93b524e80149a252a259a4bca3626773bf89c5eaa2423fd565358c6b4eb9b6d4e0 + languageName: node + linkType: hard + +"@smithy/util-retry@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/util-retry@npm:2.0.0" + dependencies: + "@smithy/service-error-classification": ^2.0.0 + tslib: ^2.5.0 + checksum: d5bfe5e81f41dffce6ba5aaf784f08247602d00f883c10c0de9e34a7f04f5369d7ac43901dd75eecc3864882b7390ad40885d07b3dcb35a366411b639482e673 + languageName: node + linkType: hard + +"@smithy/util-stream@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/util-stream@npm:2.0.1" + dependencies: + "@smithy/fetch-http-handler": ^2.0.1 + "@smithy/node-http-handler": ^2.0.1 + "@smithy/types": ^2.0.2 + "@smithy/util-base64": ^2.0.0 + "@smithy/util-buffer-from": ^2.0.0 + "@smithy/util-hex-encoding": ^2.0.0 + "@smithy/util-utf8": ^2.0.0 + tslib: ^2.5.0 + checksum: 3a190a9e5e3675e69ffdb72bec00216cb8c3e5a565cdcea47bff593c8aac34bc39897c870c4ad82ea369a5be5caa63b08a20516653b6de0e0a19a291315c3773 + languageName: node + linkType: hard + +"@smithy/util-uri-escape@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/util-uri-escape@npm:2.0.0" + dependencies: + tslib: ^2.5.0 + checksum: d201cee524ece997c406902463b5ea0b72599994f7b3ac1d923d5645497e9ef93126d146016f13dd4afafe33b9a3e92faf4e023cf0af510b270c1b9ce3d78da8 + languageName: node + linkType: hard + +"@smithy/util-utf8@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/util-utf8@npm:2.0.0" + dependencies: + "@smithy/util-buffer-from": ^2.0.0 + tslib: ^2.5.0 + checksum: bc8cda84f85b513380a61352635b306ae50d3b92974454db32835b39bbaa38150332b89346098ba9dea2e0002e2963fcbdd622bc9b3eec7b7ea8fa3f8c7ce737 + languageName: node + linkType: hard + +"@smithy/util-waiter@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/util-waiter@npm:2.0.1" + dependencies: + "@smithy/abort-controller": ^2.0.1 + "@smithy/types": ^2.0.2 + tslib: ^2.5.0 + checksum: d85893533b4222545151d8a0e4c67400a8370bc3dce34c17f5ce0c19b4dadf102ffa7b3ef2b5004abcf0892c318825b07498f8a86f2430cc886f55bf7369a57f + languageName: node + linkType: hard + +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.14": + version: 7.20.1 + resolution: "@types/babel__core@npm:7.20.1" + dependencies: + "@babel/parser": ^7.20.7 + "@babel/types": ^7.20.7 + "@types/babel__generator": "*" + "@types/babel__template": "*" + "@types/babel__traverse": "*" + checksum: 9fcd9691a33074802d9057ff70b0e3ff3778f52470475b68698a0f6714fbe2ccb36c16b43dc924eb978cd8a81c1f845e5ff4699e7a47606043b539eb8c6331a8 + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.4 + resolution: "@types/babel__generator@npm:7.6.4" + dependencies: + "@babel/types": ^7.0.0 + checksum: 20effbbb5f8a3a0211e95959d06ae70c097fb6191011b73b38fe86deebefad8e09ee014605e0fd3cdaedc73d158be555866810e9166e1f09e4cfd880b874dcb0 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.1 + resolution: "@types/babel__template@npm:7.4.1" + dependencies: + "@babel/parser": ^7.1.0 + "@babel/types": ^7.0.0 + checksum: 649fe8b42c2876be1fd28c6ed9b276f78152d5904ec290b6c861d9ef324206e0a5c242e8305c421ac52ecf6358fa7e32ab7a692f55370484825c1df29b1596ee + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.20.1 + resolution: "@types/babel__traverse@npm:7.20.1" + dependencies: + "@babel/types": ^7.20.7 + checksum: 58341e23c649c0eba134a1682d4f20d027fad290d92e5740faa1279978f6ed476fc467ae51ce17a877e2566d805aeac64eae541168994367761ec883a4150221 + languageName: node + linkType: hard + +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.6 + resolution: "@types/graceful-fs@npm:4.1.6" + dependencies: + "@types/node": "*" + checksum: c3070ccdc9ca0f40df747bced1c96c71a61992d6f7c767e8fd24bb6a3c2de26e8b84135ede000b7e79db530a23e7e88dcd9db60eee6395d0f4ce1dae91369dd4 + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.4 + resolution: "@types/istanbul-lib-coverage@npm:2.0.4" + checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.0 + resolution: "@types/istanbul-lib-report@npm:3.0.0" + dependencies: + "@types/istanbul-lib-coverage": "*" + checksum: 656398b62dc288e1b5226f8880af98087233cdb90100655c989a09f3052b5775bf98ba58a16c5ae642fb66c61aba402e07a9f2bff1d1569e3b306026c59f3f36 + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.1 + resolution: "@types/istanbul-reports@npm:3.0.1" + dependencies: + "@types/istanbul-lib-report": "*" + checksum: f1ad54bc68f37f60b30c7915886b92f86b847033e597f9b34f2415acdbe5ed742fa559a0a40050d74cdba3b6a63c342cac1f3a64dba5b68b66a6941f4abd7903 + languageName: node + linkType: hard + +"@types/jest@npm:^29.5.3": + version: 29.5.3 + resolution: "@types/jest@npm:29.5.3" + dependencies: + expect: ^29.0.0 + pretty-format: ^29.0.0 + checksum: e36bb92e0b9e5ea7d6f8832baa42f087fc1697f6cd30ec309a07ea4c268e06ec460f1f0cfd2581daf5eff5763475190ec1ad8ac6520c49ccfe4f5c0a48bfa676 + languageName: node + linkType: hard + +"@types/lodash@npm:^4": + version: 4.14.196 + resolution: "@types/lodash@npm:4.14.196" + checksum: 201d17c3e62ae02a93c99ec78e024b2be9bd75564dd8fd8c26f6ac51a985ab280d28ce2688c3bcdfe785b0991cd9814edff19ee000234c7b45d9a697f09feb6a + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 20.4.7 + resolution: "@types/node@npm:20.4.7" + checksum: a40d7003f66b56220a2028179e49f950b46fa6dbf860a4a6ecbd6ba7976f05b2f0b31ced39689ec88a7d9e32d07e088c6a06d270b99d5bc13a28291ac2f30ca7 + languageName: node + linkType: hard + +"@types/node@npm:^20.4.2": + version: 20.4.2 + resolution: "@types/node@npm:20.4.2" + checksum: 99e544ea7560d51f01f95627fc40394c24a13da8f041121a0da13e4ef0a2aa332932eaf9a5e8d0e30d1c07106e96a183be392cbba62e8cf0bf6a085d5c0f4149 + languageName: node + linkType: hard + +"@types/stack-utils@npm:^2.0.0": + version: 2.0.1 + resolution: "@types/stack-utils@npm:2.0.1" + checksum: 205fdbe3326b7046d7eaf5e494d8084f2659086a266f3f9cf00bccc549c8e36e407f88168ad4383c8b07099957ad669f75f2532ed4bc70be2b037330f7bae019 + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.0 + resolution: "@types/yargs-parser@npm:21.0.0" + checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.24 + resolution: "@types/yargs@npm:17.0.24" + dependencies: + "@types/yargs-parser": "*" + checksum: 5f3ac4dc4f6e211c1627340160fbe2fd247ceba002190da6cf9155af1798450501d628c9165a183f30a224fc68fa5e700490d740ff4c73e2cdef95bc4e8ba7bf + languageName: node + linkType: hard + +"abbrev@npm:1, abbrev@npm:^1.0.0": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 + languageName: node + linkType: hard + +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: ^5.0.0 + checksum: 170bdba9b47b7e65906a28c8ce4f38a7a369d78e2271706f020849c1bfe0ee2067d4261df8bbb66eb84f79208fd5b710df759d64191db58cfba7ce8ef9c54b75 + languageName: node + linkType: hard + +"abstract-logging@npm:^2.0.1": + version: 2.0.1 + resolution: "abstract-logging@npm:2.0.1" + checksum: 6967d15e5abbafd17f56eaf30ba8278c99333586fa4f7935fd80e93cfdc006c37fcc819c5d63ee373a12e6cb2d0417f7c3c6b9e42b957a25af9937d26749415e + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1": + version: 8.10.0 + resolution: "acorn@npm:8.10.0" + bin: + acorn: bin/acorn + checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d + languageName: node + linkType: hard + +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" + dependencies: + debug: ^4.3.4 + checksum: f7828f991470a0cc22cb579c86a18cbae83d8a3cbed39992ab34fc7217c4d126017f1c74d0ab66be87f71455318a8ea3e757d6a37881b8d0f2a2c6aa55e5418f + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.2.1": + version: 4.3.0 + resolution: "agentkeepalive@npm:4.3.0" + dependencies: + debug: ^4.1.0 + depd: ^2.0.0 + humanize-ms: ^1.2.1 + checksum: 982453aa44c11a06826c836025e5162c846e1200adb56f2d075400da7d32d87021b3b0a58768d949d824811f5654223d5a8a3dad120921a2439625eb847c6260 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: ^2.0.0 + indent-string: ^4.0.0 + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: ^8.0.0 + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 + languageName: node + linkType: hard + +"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.11.0": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: ^0.21.3 + checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + +"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: ^3.0.0 + picomatch: ^2.0.4 + checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + +"aproba@npm:^1.0.3 || ^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 + languageName: node + linkType: hard + +"archy@npm:^1.0.0": + version: 1.0.0 + resolution: "archy@npm:1.0.0" + checksum: 504ae7af655130bab9f471343cfdb054feaec7d8e300e13348bc9fe9e660f83d422e473069584f73233c701ae37d1c8452ff2522f2a20c38849e0f406f1732ac + languageName: node + linkType: hard + +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" + dependencies: + delegates: ^1.0.0 + readable-stream: ^3.6.0 + checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: ~1.0.2 + checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + +"atomic-sleep@npm:^1.0.0": + version: 1.0.0 + resolution: "atomic-sleep@npm:1.0.0" + checksum: b95275afb2f80732f22f43a60178430c468906a415a7ff18bcd0feeebc8eec3930b51250aeda91a476062a90e07132b43a1794e8d8ffcf9b650e8139be75fa36 + languageName: node + linkType: hard + +"avvio@npm:^8.2.1": + version: 8.2.1 + resolution: "avvio@npm:8.2.1" + dependencies: + archy: ^1.0.0 + debug: ^4.0.0 + fastq: ^1.6.1 + checksum: 4c96922ea123d13b26cb78a071a8989fde62ee8580352b6d2f05b7976ed3d23efa663c12ee1be35501dfe65e12a769a2ea522bcdb7ca35a5ba4d86766467075a + languageName: node + linkType: hard + +"axios@npm:^1.4.0": + version: 1.4.0 + resolution: "axios@npm:1.4.0" + dependencies: + follow-redirects: ^1.15.0 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: 7fb6a4313bae7f45e89d62c70a800913c303df653f19eafec88e56cea2e3821066b8409bc68be1930ecca80e861c52aa787659df0ffec6ad4d451c7816b9386b + languageName: node + linkType: hard + +"babel-jest@npm:^29.6.2": + version: 29.6.2 + resolution: "babel-jest@npm:29.6.2" + dependencies: + "@jest/transform": ^29.6.2 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.1.1 + babel-preset-jest: ^29.5.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 3936b5d6ed6f08670c830ed919e38a4a593d0643b8e30fdeb16f4588b262ea5255fb96fd1849c02fba0b082ecfa4e788ce9a128ad1b9e654d46aac09c3a55504 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": ^7.0.0 + "@istanbuljs/load-nyc-config": ^1.0.0 + "@istanbuljs/schema": ^0.1.2 + istanbul-lib-instrument: ^5.0.4 + test-exclude: ^6.0.0 + checksum: cb4fd95738219f232f0aece1116628cccff16db891713c4ccb501cddbbf9272951a5df81f2f2658dfdf4b3e7b236a9d5cbcf04d5d8c07dd5077297339598061a + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-plugin-jest-hoist@npm:29.5.0" + dependencies: + "@babel/template": ^7.3.3 + "@babel/types": ^7.3.3 + "@types/babel__core": ^7.1.14 + "@types/babel__traverse": ^7.0.6 + checksum: 099b5254073b6bc985b6d2d045ad26fb8ed30ff8ae6404c4fe8ee7cd0e98a820f69e3dfb871c7c65aae0f4b65af77046244c07bb92d49ef9005c90eedf681539 + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.0.1 + resolution: "babel-preset-current-node-syntax@npm:1.0.1" + dependencies: + "@babel/plugin-syntax-async-generators": ^7.8.4 + "@babel/plugin-syntax-bigint": ^7.8.3 + "@babel/plugin-syntax-class-properties": ^7.8.3 + "@babel/plugin-syntax-import-meta": ^7.8.3 + "@babel/plugin-syntax-json-strings": ^7.8.3 + "@babel/plugin-syntax-logical-assignment-operators": ^7.8.3 + "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + "@babel/plugin-syntax-numeric-separator": ^7.8.3 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + "@babel/plugin-syntax-optional-chaining": ^7.8.3 + "@babel/plugin-syntax-top-level-await": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: d118c2742498c5492c095bc8541f4076b253e705b5f1ad9a2e7d302d81a84866f0070346662355c8e25fc02caa28dc2da8d69bcd67794a0d60c4d6fab6913cc8 + languageName: node + linkType: hard + +"babel-preset-jest@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-preset-jest@npm:29.5.0" + dependencies: + babel-plugin-jest-hoist: ^29.5.0 + babel-preset-current-node-syntax: ^1.0.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 5566ca2762766c9319b4973d018d2fa08c0fcf6415c72cc54f4c8e7199e851ea8f5e6c6730f03ed7ed44fc8beefa959dd15911f2647dee47c615ff4faeddb1ad + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 + languageName: node + linkType: hard + +"bignumber.js@npm:^9.0.0": + version: 9.1.1 + resolution: "bignumber.js@npm:9.1.1" + checksum: ad243b7e2f9120b112d670bb3d674128f0bd2ca1745b0a6c9df0433bd2c0252c43e6315d944c2ac07b4c639e7496b425e46842773cf89c6a2dcd4f31e5c4b11e + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.2.0 + resolution: "binary-extensions@npm:2.2.0" + checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 + languageName: node + linkType: hard + +"bowser@npm:^2.11.0": + version: 2.11.0 + resolution: "bowser@npm:2.11.0" + checksum: 29c3f01f22e703fa6644fc3b684307442df4240b6e10f6cfe1b61c6ca5721073189ca97cdeedb376081148c8518e33b1d818a57f781d70b0b70e1f31fb48814f + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.2, braces@npm:~3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + languageName: node + linkType: hard + +"browserslist@npm:^4.21.9": + version: 4.21.10 + resolution: "browserslist@npm:4.21.10" + dependencies: + caniuse-lite: ^1.0.30001517 + electron-to-chromium: ^1.4.477 + node-releases: ^2.0.13 + update-browserslist-db: ^1.0.11 + bin: + browserslist: cli.js + checksum: 1e27c0f111a35d1dd0e8fc2c61781b0daefabc2c9471b0b10537ce54843014bceb2a1ce4571af1a82b2bf1e6e6e05d38865916689a158f03bc2c7a4ec2577db8 + languageName: node + linkType: hard + +"bs-logger@npm:0.x": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: 2.x + checksum: d34bdaf68c64bd099ab97c3ea608c9ae7d3f5faa1178b3f3f345acd94e852e608b2d4f9103fb2e503f5e69780e98293df41691b84be909b41cf5045374d54606 + languageName: node + linkType: hard + +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: ^0.4.0 + checksum: 9ba4dc58ce86300c862bffc3ae91f00b2a03b01ee07f3564beeeaf82aa243b8b03ba53f123b0b842c190d4399b94697970c8e7cf7b1ea44b61aa28c3526a4449 + languageName: node + linkType: hard + +"buffer-equal-constant-time@npm:1.0.1": + version: 1.0.1 + resolution: "buffer-equal-constant-time@npm:1.0.1" + checksum: 80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.2.1 + checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 + languageName: node + linkType: hard + +"cacache@npm:^17.0.0": + version: 17.1.3 + resolution: "cacache@npm:17.1.3" + dependencies: + "@npmcli/fs": ^3.1.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^7.7.1 + minipass: ^5.0.0 + minipass-collect: ^1.0.2 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^4.0.0 + ssri: ^10.0.0 + tar: ^6.1.11 + unique-filename: ^3.0.0 + checksum: 385756781e1e21af089160d89d7462b7ed9883c978e848c7075b90b73cb823680e66092d61513050164588387d2ca87dd6d910e28d64bc13a9ac82cd8580c796 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b + languageName: node + linkType: hard + +"camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001517": + version: 1.0.30001519 + resolution: "caniuse-lite@npm:1.0.30001519" + checksum: 66085133ede05d947e30b62fed2cbae18e5767afda8b0de38840883e1cfe5846bf1568ddbafd31647544e59112355abedaf9c867ac34541bfc20d69e7a19d94c + languageName: node + linkType: hard + +"chalk@npm:^2.0.0": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: b563e4b6039b15213114626621e7a3d12f31008bdce20f9c741d69987f62aeaace7ec30f6018890ad77b2e9b4d95324c9f5acfca58a9441e3b1dcdd1e2525d17 + languageName: node + linkType: hard + +"chokidar@npm:^3.5.2": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" + dependencies: + anymatch: ~3.1.2 + braces: ~3.0.2 + fsevents: ~2.3.2 + glob-parent: ~5.1.2 + is-binary-path: ~2.1.0 + is-glob: ~4.0.1 + normalize-path: ~3.0.0 + readdirp: ~3.6.0 + dependenciesMeta: + fsevents: + optional: true + checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.8.0 + resolution: "ci-info@npm:3.8.0" + checksum: d0a4d3160497cae54294974a7246202244fff031b0a6ea20dd57b10ec510aa17399c41a1b0982142c105f3255aff2173e5c0dd7302ee1b2f28ba3debda375098 + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.2.3 + resolution: "cjs-module-lexer@npm:1.2.3" + checksum: 5ea3cb867a9bb609b6d476cd86590d105f3cfd6514db38ff71f63992ab40939c2feb68967faa15a6d2b1f90daa6416b79ea2de486e9e2485a6f8b66a21b4fb0a + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 5210d9223010eb95b29df06a91116f2cf7c8e0748a9013ed853b53f362ea0e822f1e5bb054fb3cefc645239a4cf966af1f6133a3b43f40d591f3b68ed6cf0510 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.2 + resolution: "collect-v8-coverage@npm:1.0.2" + checksum: c10f41c39ab84629d16f9f6137bc8a63d332244383fc368caf2d2052b5e04c20cd1fd70f66fcf4e2422b84c8226598b776d39d5f2d2a51867cc1ed5d1982b4da + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b + languageName: node + linkType: hard + +"colorette@npm:^2.0.7": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed + languageName: node + linkType: hard + +"convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 63ae9933be5a2b8d4509daca5124e20c14d023c820258e484e32dc324d34c2754e71297c94a05784064ad27615037ef677e3f0c00469fb55f409d2bb21261035 + languageName: node + linkType: hard + +"cookie@npm:^0.5.0": + version: 0.5.0 + resolution: "cookie@npm:0.5.0" + checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180 + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"dateformat@npm:^4.6.3": + version: 4.6.3 + resolution: "dateformat@npm:4.6.3" + checksum: c3aa0617c0a5b30595122bc8d1bee6276a9221e4d392087b41cbbdf175d9662ae0e50d0d6dcdf45caeac5153c4b5b0844265f8cd2b2245451e3da19e39e3b65d + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.3, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: ^2.1.1 + checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c + languageName: node + linkType: hard + +"dedent@npm:^1.0.0": + version: 1.5.1 + resolution: "dedent@npm:1.5.1" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: c3c300a14edf1bdf5a873f9e4b22e839d62490bc5c8d6169c1f15858a1a76733d06a9a56930e963d677a2ceeca4b6b0894cc5ea2f501aa382ca5b92af3413c2a + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd + languageName: node + linkType: hard + +"depd@npm:^2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 + languageName: node + linkType: hard + +"diff-sequences@npm:^29.4.3": + version: 29.4.3 + resolution: "diff-sequences@npm:29.4.3" + checksum: 28b265e04fdddcf7f9f814effe102cc95a9dec0564a579b5aed140edb24fc345c611ca52d76d725a3cab55d3888b915b5e8a4702e0f6058968a90fa5f41fcde7 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + +"ecdsa-sig-formatter@npm:1.0.11, ecdsa-sig-formatter@npm:^1.0.11": + version: 1.0.11 + resolution: "ecdsa-sig-formatter@npm:1.0.11" + dependencies: + safe-buffer: ^5.0.1 + checksum: 207f9ab1c2669b8e65540bce29506134613dd5f122cccf1e6a560f4d63f2732d427d938f8481df175505aad94583bcb32c688737bb39a6df0625f903d6d93c03 + languageName: node + linkType: hard + +"edgedb@npm:^1.3.4": + version: 1.3.4 + resolution: "edgedb@npm:1.3.4" + bin: + edgeql-js: dist/cli.js + checksum: 44f52f629329e9928c0b097d6bf6bce857127da8267962176171aeff62ceda77d3f610c2872be53d7880bb8e5117ed3ba390414667c38b6e89b000fda4460ec6 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.477": + version: 1.4.484 + resolution: "electron-to-chromium@npm:1.4.484" + checksum: 30e1df1f2d32b4be0fab07622d6ac3cc05dfdb70aa8901cfbf0511d7834df82d06478bd3d5fa2c37ca114dc8b3da44fa8f8b8cb994c8ac629f0ecbc351b0c0bb + languageName: node + linkType: hard + +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 2b089ab6306f38feaabf4f6f02792f9ec85fc054fda79f44f6790e61bbf6bc4e1616afb9b232e0c5ec5289a8a452f79bfa6d905a6fd64e94b49981f0934001c6 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: ^0.6.2 + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: ^1.4.0 + checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: ^0.2.1 + checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + languageName: node + linkType: hard + +"esbuild@npm:~0.17.6": + version: 0.17.19 + resolution: "esbuild@npm:0.17.19" + dependencies: + "@esbuild/android-arm": 0.17.19 + "@esbuild/android-arm64": 0.17.19 + "@esbuild/android-x64": 0.17.19 + "@esbuild/darwin-arm64": 0.17.19 + "@esbuild/darwin-x64": 0.17.19 + "@esbuild/freebsd-arm64": 0.17.19 + "@esbuild/freebsd-x64": 0.17.19 + "@esbuild/linux-arm": 0.17.19 + "@esbuild/linux-arm64": 0.17.19 + "@esbuild/linux-ia32": 0.17.19 + "@esbuild/linux-loong64": 0.17.19 + "@esbuild/linux-mips64el": 0.17.19 + "@esbuild/linux-ppc64": 0.17.19 + "@esbuild/linux-riscv64": 0.17.19 + "@esbuild/linux-s390x": 0.17.19 + "@esbuild/linux-x64": 0.17.19 + "@esbuild/netbsd-x64": 0.17.19 + "@esbuild/openbsd-x64": 0.17.19 + "@esbuild/sunos-x64": 0.17.19 + "@esbuild/win32-arm64": 0.17.19 + "@esbuild/win32-ia32": 0.17.19 + "@esbuild/win32-x64": 0.17.19 + dependenciesMeta: + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: ac11b1a5a6008e4e37ccffbd6c2c054746fc58d0ed4a2f9ee643bd030cfcea9a33a235087bc777def8420f2eaafb3486e76adb7bdb7241a9143b43a69a10afd8 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + languageName: node + linkType: hard + +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 1ffe3bb22a6d51bdeb6bf6f7cf97d2ff4a74b017ad12284cc9e6a279e727dc30a5de6bb613e5596ff4dc3e517841339ad09a7eec44266eccb1aa201a30448166 + languageName: node + linkType: hard + +"events@npm:^3.3.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^6.0.0 + human-signals: ^2.1.0 + is-stream: ^2.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^4.0.1 + onetime: ^5.1.2 + signal-exit: ^3.0.3 + strip-final-newline: ^2.0.0 + checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: abc407f07a875c3961e4781dfcb743b58d6c93de9ab263f4f8c9d23bb6da5f9b7764fc773f86b43dd88030444d5ab8abcb611cb680fba8ca075362b77114bba3 + languageName: node + linkType: hard + +"expect@npm:^29.0.0, expect@npm:^29.6.2": + version: 29.6.2 + resolution: "expect@npm:29.6.2" + dependencies: + "@jest/expect-utils": ^29.6.2 + "@types/node": "*" + jest-get-type: ^29.4.3 + jest-matcher-utils: ^29.6.2 + jest-message-util: ^29.6.2 + jest-util: ^29.6.2 + checksum: 71f7b0c560e58bf6d27e0fded261d4bdb7ef81552a6bb4bd1ee09ce7a1f7dca67fbf83cf9b07a6645a88ef52e65085a0dcbe17f6c063b53ff7c2f0f3ea4ef69e + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + languageName: node + linkType: hard + +"extend@npm:^3.0.2": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: a50a8309ca65ea5d426382ff09f33586527882cf532931cb08ca786ea3146c0553310bda688710ff61d7668eba9f96b923fe1420cdf56a2c3eaf30fcab87b515 + languageName: node + linkType: hard + +"fast-content-type-parse@npm:^1.0.0": + version: 1.0.0 + resolution: "fast-content-type-parse@npm:1.0.0" + checksum: 9e9187be17bea18a2ee715c5737b983181cbe84f286a291db0595e421e04b578da10ca10845639be08664a4db6a793f7709822935cf38cfdf9ecba38d84ead9e + languageName: node + linkType: hard + +"fast-copy@npm:^3.0.0": + version: 3.0.1 + resolution: "fast-copy@npm:3.0.1" + checksum: 5496b5cf47df29eea479deef03b6b7188626a2cbc356b3015649062846729de6f1a9f555f937e772da8feae0a1231fab13096ed32424b2d61e4d065abc9969fe + languageName: node + linkType: hard + +"fast-decode-uri-component@npm:^1.0.1": + version: 1.0.1 + resolution: "fast-decode-uri-component@npm:1.0.1" + checksum: 427a48fe0907e76f0e9a2c228e253b4d8a8ab21d130ee9e4bb8339c5ba4086235cf9576831f7b20955a752eae4b525a177ff9d5825dd8d416e7726939194fbee + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.1.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fast-json-stringify@npm:^5.7.0": + version: 5.7.0 + resolution: "fast-json-stringify@npm:5.7.0" + dependencies: + "@fastify/deepmerge": ^1.0.0 + ajv: ^8.10.0 + ajv-formats: ^2.1.1 + fast-deep-equal: ^3.1.3 + fast-uri: ^2.1.0 + rfdc: ^1.2.0 + checksum: ca834cd8afa654f50c8f14b8489ae74ccc1d2d695fd9eafc7b8eebe251e6d0305664e8dc9d50f3074a4a0572a34c2b96e8adb84096b813d7e6f1aafce34ecf9c + languageName: node + linkType: hard + +"fast-querystring@npm:^1.0.0": + version: 1.1.2 + resolution: "fast-querystring@npm:1.1.2" + dependencies: + fast-decode-uri-component: ^1.0.1 + checksum: 7149f82ee9ac39a9c08c7ffe435b9f6deade76ae5e3675fe1835720513e8c4bc541e666b4b7b1c0c07e08f369dcf4828d00f2bee39889a90a168e1439cf27b0b + languageName: node + linkType: hard + +"fast-redact@npm:^3.1.1": + version: 3.2.0 + resolution: "fast-redact@npm:3.2.0" + checksum: 7305740bbc708b0c5662f46fc30ec910da519275574fea84f6df0bea0cfe6066ddf90c6c4b879642c509e692edf862edd22eaccb2a647db122eebe8259942888 + languageName: node + linkType: hard + +"fast-safe-stringify@npm:^2.1.1": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: a851cbddc451745662f8f00ddb622d6766f9bd97642dabfd9a405fb0d646d69fc0b9a1243cbf67f5f18a39f40f6fa821737651ff1bceeba06c9992ca2dc5bd3d + languageName: node + linkType: hard + +"fast-uri@npm:^2.0.0, fast-uri@npm:^2.1.0": + version: 2.2.0 + resolution: "fast-uri@npm:2.2.0" + checksum: edac64d50628f21d562cdc19ea86f5af00902dbb09d2f96fff5974e5317157825e9aa163af9defd11a0818aac6ea2e9958597bed98dd041200a08a976809d08b + languageName: node + linkType: hard + +"fast-xml-parser@npm:4.2.5": + version: 4.2.5 + resolution: "fast-xml-parser@npm:4.2.5" + dependencies: + strnum: ^1.0.5 + bin: + fxparser: src/cli/cli.js + checksum: d32b22005504eeb207249bf40dc82d0994b5bb9ca9dcc731d335a1f425e47fe085b3cace3cf9d32172dd1a5544193c49e8615ca95b4bf95a4a4920a226b06d80 + languageName: node + linkType: hard + +"fastify@npm:^4.20.0": + version: 4.20.0 + resolution: "fastify@npm:4.20.0" + dependencies: + "@fastify/ajv-compiler": ^3.5.0 + "@fastify/error": ^3.2.0 + "@fastify/fast-json-stringify-compiler": ^4.3.0 + abstract-logging: ^2.0.1 + avvio: ^8.2.1 + fast-content-type-parse: ^1.0.0 + fast-json-stringify: ^5.7.0 + find-my-way: ^7.6.0 + light-my-request: ^5.9.1 + pino: ^8.12.0 + process-warning: ^2.2.0 + proxy-addr: ^2.0.7 + rfdc: ^1.3.0 + secure-json-parse: ^2.5.0 + semver: ^7.5.0 + tiny-lru: ^11.0.1 + checksum: e3342f4744088f57c673bfa2f43fc429b3ba6b50c250d5a361a7bd2af5fd3bd5b681e602b49228a9f9011706142bcb7c94f37533e96878e49bc5b0a40080535e + languageName: node + linkType: hard + +"fastq@npm:^1.6.1": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" + dependencies: + reusify: ^1.0.4 + checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: 2.1.1 + checksum: b15a124cef28916fe07b400eb87cbc73ca082c142abf7ca8e8de6af43eca79ca7bd13eb4d4d48240b3bd3136eaac40d16e42d6edf87a8e5d1dd8070626860c78 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + languageName: node + linkType: hard + +"find-my-way@npm:^7.6.0": + version: 7.6.2 + resolution: "find-my-way@npm:7.6.2" + dependencies: + fast-deep-equal: ^3.1.3 + fast-querystring: ^1.0.0 + safe-regex2: ^2.0.0 + checksum: 56c02350aba2cc4cff82b3e00171cf4db72756b8ca5f0e41562d21f89cf29512b9e83b6e29ab352303ca9d0dcbfcd8c93f50d52dc92f1eeecc4bc991404ef533 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: ^5.0.0 + path-exists: ^4.0.0 + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + languageName: node + linkType: hard + +"follow-redirects@npm:^1.15.0": + version: 1.15.2 + resolution: "follow-redirects@npm:1.15.2" + peerDependenciesMeta: + debug: + optional: true + checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: ^7.0.0 + signal-exit: ^4.0.1 + checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + languageName: node + linkType: hard + +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: ^3.0.0 + checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.2 + resolution: "fs-minipass@npm:3.0.2" + dependencies: + minipass: ^5.0.0 + checksum: e9cc0e1f2d01c6f6f62f567aee59530aba65c6c7b2ae88c5027bc34c711ebcfcfaefd0caf254afa6adfe7d1fba16bc2537508a6235196bac7276747d078aef0a + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: latest + checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a + languageName: node + linkType: hard + +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" + dependencies: + aproba: ^1.0.3 || ^2.0.0 + color-support: ^1.1.3 + console-control-strings: ^1.1.0 + has-unicode: ^2.0.1 + signal-exit: ^3.0.7 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + wide-align: ^1.1.5 + checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d + languageName: node + linkType: hard + +"gaxios@npm:^6.0.0": + version: 6.0.4 + resolution: "gaxios@npm:6.0.4" + dependencies: + extend: ^3.0.2 + https-proxy-agent: ^7.0.1 + is-stream: ^2.0.0 + node-fetch: ^2.6.9 + checksum: 64969f37f0c0092e5d61a122d3481f9f9d0b013b72206ffe275cb994b41a44dd0c4fa631abef15eac385bd50ead3264104e832d1d4712e832c2296f8ce1030be + languageName: node + linkType: hard + +"gcp-metadata@npm:^6.0.0": + version: 6.0.0 + resolution: "gcp-metadata@npm:6.0.0" + dependencies: + gaxios: ^6.0.0 + json-bigint: ^1.0.0 + checksum: c86a362819cee8d29cce02d9ce7e4e11687bfc6a91cb015f19a14f5015f66ef9cf2c93aa59f66e10915e4b0b8ed9ea90f0ac473594ad1dec5402f2e984a5662b + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: a7437e58c6be12aa6c90f7730eac7fa9833dc78872b4ad2963d2031b00a3367a93f98aec75f9aaac7220848e4026d67a8655e870b24f20a543d103c0d65952ec + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad + languageName: node + linkType: hard + +"get-tsconfig@npm:^4.4.0": + version: 4.6.2 + resolution: "get-tsconfig@npm:4.6.2" + dependencies: + resolve-pkg-maps: ^1.0.0 + checksum: e791e671a9b55e91efea3ca819ecd7a25beae679e31c83234bf3dd62ddd93df070c1b95ae7e29d206358ebb6408f6f79ac6d83a32a3bbd6a6d217babe23de077 + languageName: node + linkType: hard + +"glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + +"glob@npm:^10.2.2": + version: 10.3.3 + resolution: "glob@npm:10.3.3" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^2.0.3 + minimatch: ^9.0.1 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + path-scurry: ^1.10.1 + bin: + glob: dist/cjs/src/bin.js + checksum: 29190d3291f422da0cb40b77a72fc8d2c51a36524e99b8bf412548b7676a6627489528b57250429612b6eec2e6fe7826d328451d3e694a9d15e575389308ec53 + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.1.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"glob@npm:^8.0.0": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e + languageName: node + linkType: hard + +"google-auth-library@npm:^9.0.0": + version: 9.0.0 + resolution: "google-auth-library@npm:9.0.0" + dependencies: + base64-js: ^1.3.0 + ecdsa-sig-formatter: ^1.0.11 + gaxios: ^6.0.0 + gcp-metadata: ^6.0.0 + gtoken: ^7.0.0 + jws: ^4.0.0 + lru-cache: ^6.0.0 + checksum: a798e738aac59bb5dde354fb32d1cab509c8b95095f3e15ae5868607af0f9aae619fdaa5665447d98e97cf8e90fa0645a05f23cfdaee4734c6807960df1e303b + languageName: node + linkType: hard + +"google-spreadsheet@npm:^4.0.2": + version: 4.0.2 + resolution: "google-spreadsheet@npm:4.0.2" + dependencies: + axios: ^1.4.0 + lodash: ^4.17.21 + peerDependencies: + google-auth-library: ^8.8.0 + peerDependenciesMeta: + google-auth-library: + optional: true + checksum: d38e87074d17508575a72417e5608d67b35a2060f9ce6da92ec82da8eb7eeeaf5193633d05ae8c280551497ff0dcbec3f4ee064fa2629107999be9502e61985f + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 + languageName: node + linkType: hard + +"gtoken@npm:^7.0.0": + version: 7.0.1 + resolution: "gtoken@npm:7.0.1" + dependencies: + gaxios: ^6.0.0 + jws: ^4.0.0 + checksum: de1f65ebe77deb90931c29c76408e6bd097ac6f8d0b520164ac13449b39012ea8d710596d5a63ae508b2c9e49ef9f92cd7817d6fc97140668ba2e1ff30e2d418 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 + languageName: node + linkType: hard + +"has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: ^1.1.1 + checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + languageName: node + linkType: hard + +"help-me@npm:^4.0.1": + version: 4.2.0 + resolution: "help-me@npm:4.2.0" + dependencies: + glob: ^8.0.0 + readable-stream: ^3.6.0 + checksum: 6548acba10dd79ebfc93f0d739c4cb2f32f7932c8d87b091992f3a0f844706263415eab81be015aed4ab874154232beb666920d7e280502c6bba29a40cde343e + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": 2 + agent-base: 6 + debug: 4 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.1 + resolution: "https-proxy-agent@npm:7.0.1" + dependencies: + agent-base: ^7.0.2 + debug: 4 + checksum: 2d765c31865071373771f53abdd72912567b76015a4eff61094f586194192950cd89257d50f0e621807a16c083bc8cad5852e3885c6ba154d2ce721a18fac248 + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: ^2.0.0 + checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + languageName: node + linkType: hard + +"ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e + languageName: node + linkType: hard + +"ignore-by-default@npm:^1.0.1": + version: 1.0.1 + resolution: "ignore-by-default@npm:1.0.1" + checksum: 441509147b3615e0365e407a3c18e189f78c07af08564176c680be1fabc94b6c789cad1342ad887175d4ecd5225de86f73d376cec8e06b42fd9b429505ffcf8a + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.1.0 + resolution: "import-local@npm:3.1.0" + dependencies: + pkg-dir: ^4.2.0 + resolve-cwd: ^3.0.0 + bin: + import-local-fixture: fixtures/cli.js + checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: ^2.0.0 + checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c + languageName: node + linkType: hard + +"is-core-module@npm:^2.12.0": + version: 2.12.1 + resolution: "is-core-module@npm:2.12.1" + dependencies: + has: ^1.0.3 + checksum: f04ea30533b5e62764e7b2e049d3157dc0abd95ef44275b32489ea2081176ac9746ffb1cdb107445cf1ff0e0dfcad522726ca27c27ece64dadf3795428b8e468 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.1, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.0 + resolution: "istanbul-lib-coverage@npm:3.2.0" + checksum: a2a545033b9d56da04a8571ed05c8120bf10e9bce01cf8633a3a2b0d1d83dff4ac4fe78d6d5673c27fc29b7f21a41d75f83a36be09f82a61c367b56aa73c1ff9 + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4, istanbul-lib-instrument@npm:^5.1.0": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" + dependencies: + "@babel/core": ^7.12.3 + "@babel/parser": ^7.14.7 + "@istanbuljs/schema": ^0.1.2 + istanbul-lib-coverage: ^3.2.0 + semver: ^6.3.0 + checksum: bf16f1803ba5e51b28bbd49ed955a736488381e09375d830e42ddeb403855b2006f850711d95ad726f2ba3f1ae8e7366de7e51d2b9ac67dc4d80191ef7ddf272 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: ^3.0.0 + make-dir: ^4.0.0 + supports-color: ^7.1.0 + checksum: fd17a1b879e7faf9bb1dc8f80b2a16e9f5b7b8498fe6ed580a618c34df0bfe53d2abd35bf8a0a00e628fb7405462576427c7df20bbe4148d19c14b431c974b21 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: ^4.1.1 + istanbul-lib-coverage: ^3.0.0 + source-map: ^0.6.1 + checksum: 21ad3df45db4b81852b662b8d4161f6446cd250c1ddc70ef96a585e2e85c26ed7cd9c2a396a71533cfb981d1a645508bc9618cae431e55d01a0628e7dec62ef2 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3": + version: 3.1.6 + resolution: "istanbul-reports@npm:3.1.6" + dependencies: + html-escaper: ^2.0.0 + istanbul-lib-report: ^3.0.0 + checksum: 44c4c0582f287f02341e9720997f9e82c071627e1e862895745d5f52ec72c9b9f38e1d12370015d2a71dcead794f34c7732aaef3fab80a24bc617a21c3d911d6 + languageName: node + linkType: hard + +"jackspeak@npm:^2.0.3": + version: 2.2.1 + resolution: "jackspeak@npm:2.2.1" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: e29291c0d0f280a063fa18fbd1e891ab8c2d7519fd34052c0ebde38538a15c603140d60c2c7f432375ff7ee4c5f1c10daa8b2ae19a97c3d4affe308c8360c1df + languageName: node + linkType: hard + +"jest-changed-files@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-changed-files@npm:29.5.0" + dependencies: + execa: ^5.0.0 + p-limit: ^3.1.0 + checksum: a67a7cb3c11f8f92bd1b7c79e84f724cbd11a9ad51f3cdadafe3ce7ee3c79ee50dbea128f920f5fddc807e9e4e83f5462143094391feedd959a77dd20ab96cf3 + languageName: node + linkType: hard + +"jest-circus@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-circus@npm:29.6.2" + dependencies: + "@jest/environment": ^29.6.2 + "@jest/expect": ^29.6.2 + "@jest/test-result": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + chalk: ^4.0.0 + co: ^4.6.0 + dedent: ^1.0.0 + is-generator-fn: ^2.0.0 + jest-each: ^29.6.2 + jest-matcher-utils: ^29.6.2 + jest-message-util: ^29.6.2 + jest-runtime: ^29.6.2 + jest-snapshot: ^29.6.2 + jest-util: ^29.6.2 + p-limit: ^3.1.0 + pretty-format: ^29.6.2 + pure-rand: ^6.0.0 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: 4f5a96a68c3c808c3d5a9279a2f39a2937386e2cebba5096971f267d79562ce2133a13bc05356a39f8f1ba68fcfe1eb39c4572b3fb0f91affbd932950e89c1e3 + languageName: node + linkType: hard + +"jest-cli@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-cli@npm:29.6.2" + dependencies: + "@jest/core": ^29.6.2 + "@jest/test-result": ^29.6.2 + "@jest/types": ^29.6.1 + chalk: ^4.0.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + import-local: ^3.0.2 + jest-config: ^29.6.2 + jest-util: ^29.6.2 + jest-validate: ^29.6.2 + prompts: ^2.0.1 + yargs: ^17.3.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 0b7b09ae4bd327caf1981eac5a14679ddda3c5c836c9f8ea0ecfe1e5e10e9a39a5ed783fa38d25383604c4d3405595e74b391d955e99aea7e51acb41a59ea108 + languageName: node + linkType: hard + +"jest-config@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-config@npm:29.6.2" + dependencies: + "@babel/core": ^7.11.6 + "@jest/test-sequencer": ^29.6.2 + "@jest/types": ^29.6.1 + babel-jest: ^29.6.2 + chalk: ^4.0.0 + ci-info: ^3.2.0 + deepmerge: ^4.2.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-circus: ^29.6.2 + jest-environment-node: ^29.6.2 + jest-get-type: ^29.4.3 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.6.2 + jest-runner: ^29.6.2 + jest-util: ^29.6.2 + jest-validate: ^29.6.2 + micromatch: ^4.0.4 + parse-json: ^5.2.0 + pretty-format: ^29.6.2 + slash: ^3.0.0 + strip-json-comments: ^3.1.1 + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 3bd104a3ac2dd9d34986238142437606354169766dcf88359a7a12ac106d0dc17dcc6b627e4f20db97a58bac5b0502b5436c9cc4722b3629b2a114bba6da9128 + languageName: node + linkType: hard + +"jest-diff@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-diff@npm:29.6.2" + dependencies: + chalk: ^4.0.0 + diff-sequences: ^29.4.3 + jest-get-type: ^29.4.3 + pretty-format: ^29.6.2 + checksum: 0effd66a0c23f8c139ebf7ca99ed30b479b86fff66f19ad4869f130aaf7ae6a24ca1533f697b7e4930cbe2ddffc85387723fcca673501c653fb77a38f538e959 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-docblock@npm:29.4.3" + dependencies: + detect-newline: ^3.0.0 + checksum: e0e9df1485bb8926e5b33478cdf84b3387d9caf3658e7dc1eaa6dc34cb93dea0d2d74797f6e940f0233a88f3dadd60957f2288eb8f95506361f85b84bf8661df + languageName: node + linkType: hard + +"jest-each@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-each@npm:29.6.2" + dependencies: + "@jest/types": ^29.6.1 + chalk: ^4.0.0 + jest-get-type: ^29.4.3 + jest-util: ^29.6.2 + pretty-format: ^29.6.2 + checksum: b64194f4ca27afc6070a42b7ecccbc68be0ded19a849f8cd8f91a2abb23fadae2d38d47559a315f4d1f576927761f3ea437a75ab6cf19206332abb8527d7c165 + languageName: node + linkType: hard + +"jest-environment-node@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-environment-node@npm:29.6.2" + dependencies: + "@jest/environment": ^29.6.2 + "@jest/fake-timers": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + jest-mock: ^29.6.2 + jest-util: ^29.6.2 + checksum: 0b754ac2d3bdb7ce5d6fc28595b9d1c64176f20506b6f773b18b0280ab0b396ed7d927c8519779d3c560fa2b13236ee7077092ccb19a13bea23d40dd30f06450 + languageName: node + linkType: hard + +"jest-get-type@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-get-type@npm:29.4.3" + checksum: 6ac7f2dde1c65e292e4355b6c63b3a4897d7e92cb4c8afcf6d397f2682f8080e094c8b0b68205a74d269882ec06bf696a9de6cd3e1b7333531e5ed7b112605ce + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-haste-map@npm:29.6.2" + dependencies: + "@jest/types": ^29.6.1 + "@types/graceful-fs": ^4.1.3 + "@types/node": "*" + anymatch: ^3.0.3 + fb-watchman: ^2.0.0 + fsevents: ^2.3.2 + graceful-fs: ^4.2.9 + jest-regex-util: ^29.4.3 + jest-util: ^29.6.2 + jest-worker: ^29.6.2 + micromatch: ^4.0.4 + walker: ^1.0.8 + dependenciesMeta: + fsevents: + optional: true + checksum: 726233972030eb2e5bce6c9468e497310436b455c88b40e744bd053e20a6f3ff19aec340edcbd89537c629ed5cf8916506bc895d690cc39a0862c74dcd95b7b8 + languageName: node + linkType: hard + +"jest-leak-detector@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-leak-detector@npm:29.6.2" + dependencies: + jest-get-type: ^29.4.3 + pretty-format: ^29.6.2 + checksum: e00152acdba8aa8f9334775b77375947508051c34646fbeb702275da2b6ac6145f8cad6d5893112e76484d00fa8c0b4fd71b78ab0b4ef34950f5b6a84f37ae67 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-matcher-utils@npm:29.6.2" + dependencies: + chalk: ^4.0.0 + jest-diff: ^29.6.2 + jest-get-type: ^29.4.3 + pretty-format: ^29.6.2 + checksum: 3e1b65dd30d05f75fe56dc45fbe4135aec2ff96a3d1e21afbf6a66f3a45a7e29cd0fd37cf80b9564e0381d6205833f77ccaf766c6f7e1aad6b7924d117be504e + languageName: node + linkType: hard + +"jest-message-util@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-message-util@npm:29.6.2" + dependencies: + "@babel/code-frame": ^7.12.13 + "@jest/types": ^29.6.1 + "@types/stack-utils": ^2.0.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + micromatch: ^4.0.4 + pretty-format: ^29.6.2 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: e8e3c8d2301e2ca4038ed6df8cbba7fedc6949d1ede4c0e3f1f44f53afb56d77eb35983fa460140d0eadeab99a5f3ae04b703fe77cd7b316b40b361228b5aa1a + languageName: node + linkType: hard + +"jest-mock@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-mock@npm:29.6.2" + dependencies: + "@jest/types": ^29.6.1 + "@types/node": "*" + jest-util: ^29.6.2 + checksum: 0bacb5d58441462c0e531ec4d2f7377eecbe21f664d8a460e72f94ba61d22635028931678e7a0f1c3e3f5894973db8e409432f7db4c01283456c8fdbd85f5b3b + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: db1a8ab2cb97ca19c01b1cfa9a9c8c69a143fde833c14df1fab0766f411b1148ff0df878adea09007ac6a2085ec116ba9a996a6ad104b1e58c20adbf88eed9b2 + languageName: node + linkType: hard + +"jest-regex-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-regex-util@npm:29.4.3" + checksum: 96fc7fc28cd4dd73a63c13a526202c4bd8b351d4e5b68b1a2a2c88da3308c2a16e26feaa593083eb0bac38cca1aa9dd05025412e7de013ba963fb8e66af22b8a + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-resolve-dependencies@npm:29.6.2" + dependencies: + jest-regex-util: ^29.4.3 + jest-snapshot: ^29.6.2 + checksum: d40ee11af2c9d2ef0dbbcf9a5b7dda37c2b86cf4e5de1705795919fd8927907569115c502116ab56de0dca576d5faa31ec9b636240333b6830a568a63004da17 + languageName: node + linkType: hard + +"jest-resolve@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-resolve@npm:29.6.2" + dependencies: + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.6.2 + jest-pnp-resolver: ^1.2.2 + jest-util: ^29.6.2 + jest-validate: ^29.6.2 + resolve: ^1.20.0 + resolve.exports: ^2.0.0 + slash: ^3.0.0 + checksum: 01721957e61821a576b2ded043eeab8b392166e0e6d8d680f75657737e2ea7481ff29c2716b866ccd12e743f3a8da465504b1028e78b6a3c68b9561303de7ec8 + languageName: node + linkType: hard + +"jest-runner@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-runner@npm:29.6.2" + dependencies: + "@jest/console": ^29.6.2 + "@jest/environment": ^29.6.2 + "@jest/test-result": ^29.6.2 + "@jest/transform": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + chalk: ^4.0.0 + emittery: ^0.13.1 + graceful-fs: ^4.2.9 + jest-docblock: ^29.4.3 + jest-environment-node: ^29.6.2 + jest-haste-map: ^29.6.2 + jest-leak-detector: ^29.6.2 + jest-message-util: ^29.6.2 + jest-resolve: ^29.6.2 + jest-runtime: ^29.6.2 + jest-util: ^29.6.2 + jest-watcher: ^29.6.2 + jest-worker: ^29.6.2 + p-limit: ^3.1.0 + source-map-support: 0.5.13 + checksum: 46bd506a08ddf79628a509aed4105ab74c0b03727a3e24c90bbc2915531860b3da99f7ace2fd9603194440553cffac9cfb1a3b7d0ce03d5fc9c5f2d5ffbb3d3f + languageName: node + linkType: hard + +"jest-runtime@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-runtime@npm:29.6.2" + dependencies: + "@jest/environment": ^29.6.2 + "@jest/fake-timers": ^29.6.2 + "@jest/globals": ^29.6.2 + "@jest/source-map": ^29.6.0 + "@jest/test-result": ^29.6.2 + "@jest/transform": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + chalk: ^4.0.0 + cjs-module-lexer: ^1.0.0 + collect-v8-coverage: ^1.0.0 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.6.2 + jest-message-util: ^29.6.2 + jest-mock: ^29.6.2 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.6.2 + jest-snapshot: ^29.6.2 + jest-util: ^29.6.2 + slash: ^3.0.0 + strip-bom: ^4.0.0 + checksum: 8e7e4486b23b01a9c407313681bed0def39680c2ae21cf01347f111983252ec3a024c56493c5411fed53633f02863eed0816099110cbe04b3889aa5babf1042d + languageName: node + linkType: hard + +"jest-snapshot@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-snapshot@npm:29.6.2" + dependencies: + "@babel/core": ^7.11.6 + "@babel/generator": ^7.7.2 + "@babel/plugin-syntax-jsx": ^7.7.2 + "@babel/plugin-syntax-typescript": ^7.7.2 + "@babel/types": ^7.3.3 + "@jest/expect-utils": ^29.6.2 + "@jest/transform": ^29.6.2 + "@jest/types": ^29.6.1 + babel-preset-current-node-syntax: ^1.0.0 + chalk: ^4.0.0 + expect: ^29.6.2 + graceful-fs: ^4.2.9 + jest-diff: ^29.6.2 + jest-get-type: ^29.4.3 + jest-matcher-utils: ^29.6.2 + jest-message-util: ^29.6.2 + jest-util: ^29.6.2 + natural-compare: ^1.4.0 + pretty-format: ^29.6.2 + semver: ^7.5.3 + checksum: c1c70a9dbce7fca62ed73ac38234b4ee643e8b667acf71b4417ab67776c1188bb08b8ad450e56a2889ad182903ffd416386fa8082a477724ccf8d8c29a4c6906 + languageName: node + linkType: hard + +"jest-util@npm:^29.0.0, jest-util@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-util@npm:29.6.2" + dependencies: + "@jest/types": ^29.6.1 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: 8aedc0c80083d0cabd6c6c4f04dea1cbcac609fd7bc3b1fc05a3999291bd6e63dd52b0c806f9378d5cae28eff5a6191709a4987861001293f8d03e53984adca4 + languageName: node + linkType: hard + +"jest-validate@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-validate@npm:29.6.2" + dependencies: + "@jest/types": ^29.6.1 + camelcase: ^6.2.0 + chalk: ^4.0.0 + jest-get-type: ^29.4.3 + leven: ^3.1.0 + pretty-format: ^29.6.2 + checksum: 32648d002189c0ad8a958eace7c6b7d05ea1dc440a1b91e0f22dc1aef489899446ec80b2d527fd13713862d89dfb4606e24a3bf8a10c4ddac3c911e93b7f0374 + languageName: node + linkType: hard + +"jest-watcher@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-watcher@npm:29.6.2" + dependencies: + "@jest/test-result": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + emittery: ^0.13.1 + jest-util: ^29.6.2 + string-length: ^4.0.1 + checksum: 14624190fc8b5fbae466a2ec81458a88c15716d99f042bb4674d53e9623d305cb2905bc1dffeda05fd1a10a05c2a83efe5ac41942477e2b15eaebb08d0aaab32 + languageName: node + linkType: hard + +"jest-worker@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-worker@npm:29.6.2" + dependencies: + "@types/node": "*" + jest-util: ^29.6.2 + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: 11035564534bf181ead80b25be138c2d42372bd5626151a3e705200d47a74fd9da3ca79f8a7b15806cdc325ad73c3d21d23acceeed99d50941589ff02915ed38 + languageName: node + linkType: hard + +"jest@npm:^29.6.2": + version: 29.6.2 + resolution: "jest@npm:29.6.2" + dependencies: + "@jest/core": ^29.6.2 + "@jest/types": ^29.6.1 + import-local: ^3.0.2 + jest-cli: ^29.6.2 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: dd63facd4e6aefc35d2c42acd7e4c9fb0d8fe4705df4b3ccedd953605424d7aa89c88af8cf4c9951752709cac081d29c35b264e1794643d5688ea724ccc9a485 + languageName: node + linkType: hard + +"joycon@npm:^3.1.1": + version: 3.1.1 + resolution: "joycon@npm:3.1.1" + checksum: 8003c9c3fc79c5c7602b1c7e9f7a2df2e9916f046b0dbad862aa589be78c15734d11beb9fe846f5e06138df22cb2ad29961b6a986ba81c4920ce2b15a7f11067 + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: ^1.0.7 + esprima: ^4.0.0 + bin: + js-yaml: bin/js-yaml.js + checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d + languageName: node + linkType: hard + +"json-bigint@npm:^1.0.0": + version: 1.0.0 + resolution: "json-bigint@npm:1.0.0" + dependencies: + bignumber.js: ^9.0.0 + checksum: c67bb93ccb3c291e60eb4b62931403e378906aab113ec1c2a8dd0f9a7f065ad6fd9713d627b732abefae2e244ac9ce1721c7a3142b2979532f12b258634ce6f6 + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + languageName: node + linkType: hard + +"json5@npm:^2.2.2, json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 + languageName: node + linkType: hard + +"jwa@npm:^2.0.0": + version: 2.0.0 + resolution: "jwa@npm:2.0.0" + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: ^5.0.1 + checksum: 8f00b71ad5fe94cb55006d0d19202f8f56889109caada2f7eeb63ca81755769ce87f4f48101967f398462e3b8ae4faebfbd5a0269cb755dead5d63c77ba4d2f1 + languageName: node + linkType: hard + +"jws@npm:^4.0.0": + version: 4.0.0 + resolution: "jws@npm:4.0.0" + dependencies: + jwa: ^2.0.0 + safe-buffer: ^5.0.1 + checksum: d68d07aa6d1b8cb35c363a9bd2b48f15064d342a5d9dc18a250dbbce8dc06bd7e4792516c50baa16b8d14f61167c19e851fd7f66b59ecc68b7f6a013759765f7 + languageName: node + linkType: hard + +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: df82cd1e172f957bae9c536286265a5cdbd5eeca487cb0a3b2a7b41ef959fc61f8e7c0e9aeea9c114ccf2c166b6a8dd45a46fd619c1c569d210ecd2765ad5169 + languageName: node + linkType: hard + +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55 + languageName: node + linkType: hard + +"light-my-request@npm:^5.9.1": + version: 5.10.0 + resolution: "light-my-request@npm:5.10.0" + dependencies: + cookie: ^0.5.0 + process-warning: ^2.0.0 + set-cookie-parser: ^2.4.1 + checksum: 50450afd155c8a8800435d568b118ea24b0367d36defaf0467fc49f5e7591c3f8c90b97641f67792d3f25190d53c988c6bc03dd389dfec9dcdfd1907f01ff36f + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: ^4.1.0 + checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + languageName: node + linkType: hard + +"lodash.memoize@npm:4.x": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 + languageName: node + linkType: hard + +"lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: ^3.0.2 + checksum: c154ae1cbb0c2206d1501a0e94df349653c92c8cbb25236d7e85190bcaf4567a03ac6eb43166fabfa36fd35623694da7233e88d9601fbf411a9a481d85dbd2cb + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"lru-cache@npm:^7.7.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 + languageName: node + linkType: hard + +"lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.0.0 + resolution: "lru-cache@npm:10.0.0" + checksum: 18f101675fe283bc09cda0ef1e3cc83781aeb8373b439f086f758d1d91b28730950db785999cd060d3c825a8571c03073e8c14512b6655af2188d623031baf50 + languageName: node + linkType: hard + +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" + dependencies: + semver: ^7.5.3 + checksum: bf0731a2dd3aab4db6f3de1585cea0b746bb73eb5a02e3d8d72757e376e64e6ada190b1eddcde5b2f24a81b688a9897efd5018737d05e02e2a671dda9cff8a8a + languageName: node + linkType: hard + +"make-error@npm:1.x, make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^11.0.3": + version: 11.1.1 + resolution: "make-fetch-happen@npm:11.1.1" + dependencies: + agentkeepalive: ^4.2.1 + cacache: ^17.0.0 + http-cache-semantics: ^4.1.1 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 + is-lambda: ^1.0.1 + lru-cache: ^7.7.1 + minipass: ^5.0.0 + minipass-fetch: ^3.0.0 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + promise-retry: ^2.0.1 + socks-proxy-agent: ^7.0.0 + ssri: ^10.0.0 + checksum: 7268bf274a0f6dcf0343829489a4506603ff34bd0649c12058753900b0eb29191dce5dba12680719a5d0a983d3e57810f594a12f3c18494e93a1fbc6348a4540 + languageName: node + linkType: hard + +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: 1.0.5 + checksum: b38a025a12c8146d6eeea5a7f2bf27d51d8ad6064da8ca9405fcf7bf9b54acd43e3b30ddd7abb9b1bfa4ddb266019133313482570ddb207de568f71ecfcf6060 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: ^2.0.1 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + languageName: node + linkType: hard + +"minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: ^3.0.0 + checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.3 + resolution: "minipass-fetch@npm:3.0.3" + dependencies: + encoding: ^0.1.13 + minipass: ^5.0.0 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: af5ab2552a16fcf505d35fd7ffb84b57f4a0eeb269e6e1d9a2a75824dda48b36e527083250b7cca4a4def21d9544e2ade441e4730e233c0bc2133f6abda31e18 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: ^3.0.0 + checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: ^3.0.0 + checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: ^3.0.0 + checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: ^4.0.0 + checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0": + version: 7.0.2 + resolution: "minipass@npm:7.0.2" + checksum: 46776de732eb7cef2c7404a15fb28c41f5c54a22be50d47b03c605bf21f5c18d61a173c0a20b49a97e7a65f78d887245066410642551e45fffe04e9ac9e325bc + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: ^3.0.0 + yallist: ^4.0.0 + checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"ms@npm:^2.0.0, ms@npm:^2.1.1": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.9": + version: 2.6.12 + resolution: "node-fetch@npm:2.6.12" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 3bc1655203d47ee8e313c0d96664b9673a3d4dd8002740318e9d27d14ef306693a4b2ef8d6525775056fd912a19e23f3ac0d7111ad8925877b7567b29a625592 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 9.4.0 + resolution: "node-gyp@npm:9.4.0" + dependencies: + env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 + glob: ^7.1.4 + graceful-fs: ^4.2.6 + make-fetch-happen: ^11.0.3 + nopt: ^6.0.0 + npmlog: ^6.0.0 + rimraf: ^3.0.2 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^2.0.2 + bin: + node-gyp: bin/node-gyp.js + checksum: 78b404e2e0639d64e145845f7f5a3cb20c0520cdaf6dda2f6e025e9b644077202ea7de1232396ba5bde3fee84cdc79604feebe6ba3ec84d464c85d407bb5da99 + languageName: node + linkType: hard + +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: d0b30b1ee6d961851c60d5eaa745d30b5c95d94bc0e74b81e5292f7c42a49e3af87f1eb9e89f59456f80645d679202537de751b7d72e9e40ceea40c5e449057e + languageName: node + linkType: hard + +"node-releases@npm:^2.0.13": + version: 2.0.13 + resolution: "node-releases@npm:2.0.13" + checksum: 17ec8f315dba62710cae71a8dad3cd0288ba943d2ece43504b3b1aa8625bf138637798ab470b1d9035b0545996f63000a8a926e0f6d35d0996424f8b6d36dda3 + languageName: node + linkType: hard + +"nodemon@npm:^3.0.1": + version: 3.0.1 + resolution: "nodemon@npm:3.0.1" + dependencies: + chokidar: ^3.5.2 + debug: ^3.2.7 + ignore-by-default: ^1.0.1 + minimatch: ^3.1.2 + pstree.remy: ^1.1.8 + semver: ^7.5.3 + simple-update-notifier: ^2.0.0 + supports-color: ^5.5.0 + touch: ^3.1.0 + undefsafe: ^2.0.5 + bin: + nodemon: bin/nodemon.js + checksum: 6a5d81855760d6617049eccce10ccf02bddb482dab13ceea5280ae595ec7004eee13e7b934368e3f46c37fe4d970342a8c38c99cae7e93e4d7a3ed1c1ecb6acf + languageName: node + linkType: hard + +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: ^1.0.0 + bin: + nopt: bin/nopt.js + checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + languageName: node + linkType: hard + +"nopt@npm:~1.0.10": + version: 1.0.10 + resolution: "nopt@npm:1.0.10" + dependencies: + abbrev: 1 + bin: + nopt: ./bin/nopt.js + checksum: f62575aceaa3be43f365bf37a596b89bbac2e796b001b6d2e2a85c2140a4e378ff919e2753ccba959c4fd344776fc88c29b393bc167fa939fb1513f126f4cd45 + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: ^3.0.0 + checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 + languageName: node + linkType: hard + +"npmlog@npm:^6.0.0": + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" + dependencies: + are-we-there-yet: ^3.0.0 + console-control-strings: ^1.1.0 + gauge: ^4.0.3 + set-blocking: ^2.0.0 + checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a + languageName: node + linkType: hard + +"on-exit-leak-free@npm:^2.1.0": + version: 2.1.0 + resolution: "on-exit-leak-free@npm:2.1.0" + checksum: 7334d98b87b0c89c9b69c747760b21196ff35afdedc4eaf1a0a3a02964463d7f6802481b120e4c8298967c74773ca7b914ab2eb3d9b279010eb7f67ac4960eed + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: ^2.1.0 + checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: ^2.0.0 + checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + languageName: node + linkType: hard + +"p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: ^2.2.0 + checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: ^3.0.0 + checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + languageName: node + linkType: hard + +"parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": ^7.0.0 + error-ex: ^1.3.1 + json-parse-even-better-errors: ^2.3.0 + lines-and-columns: ^1.1.6 + checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: ^9.1.1 || ^10.0.0 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.0.0 + resolution: "picocolors@npm:1.0.0" + checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"pino-abstract-transport@npm:^1.0.0, pino-abstract-transport@npm:v1.0.0": + version: 1.0.0 + resolution: "pino-abstract-transport@npm:1.0.0" + dependencies: + readable-stream: ^4.0.0 + split2: ^4.0.0 + checksum: 05dd0eda52dd99fd204b39fe7b62656744b63e863bc052cdd5105d25f226a236966d0a46e39a1ace4838f6e988c608837ff946d2d0bc92835ca7baa0a3bff8d8 + languageName: node + linkType: hard + +"pino-pretty@npm:^10.1.0": + version: 10.1.0 + resolution: "pino-pretty@npm:10.1.0" + dependencies: + colorette: ^2.0.7 + dateformat: ^4.6.3 + fast-copy: ^3.0.0 + fast-safe-stringify: ^2.1.1 + help-me: ^4.0.1 + joycon: ^3.1.1 + minimist: ^1.2.6 + on-exit-leak-free: ^2.1.0 + pino-abstract-transport: ^1.0.0 + pump: ^3.0.0 + readable-stream: ^4.0.0 + secure-json-parse: ^2.4.0 + sonic-boom: ^3.0.0 + strip-json-comments: ^3.1.1 + bin: + pino-pretty: bin.js + checksum: 543a658b0b1d00a0dce5d1015a4fa581ea2b8b4937d3cbef6d03cc9c0bbc2425493d302adbab3a03aa20d0a9c102222b378336a2241e6c493a086c21ad3288d3 + languageName: node + linkType: hard + +"pino-std-serializers@npm:^6.0.0": + version: 6.2.2 + resolution: "pino-std-serializers@npm:6.2.2" + checksum: aeb0662edc46ec926de9961ed4780a4f0586bb7c37d212cd469c069639e7816887a62c5093bc93f260a4e0900322f44fc8ab1343b5a9fa2864a888acccdb22a4 + languageName: node + linkType: hard + +"pino@npm:^8.12.0": + version: 8.14.1 + resolution: "pino@npm:8.14.1" + dependencies: + atomic-sleep: ^1.0.0 + fast-redact: ^3.1.1 + on-exit-leak-free: ^2.1.0 + pino-abstract-transport: v1.0.0 + pino-std-serializers: ^6.0.0 + process-warning: ^2.0.0 + quick-format-unescaped: ^4.0.3 + real-require: ^0.2.0 + safe-stable-stringify: ^2.3.1 + sonic-boom: ^3.1.0 + thread-stream: ^2.0.0 + bin: + pino: bin.js + checksum: 72dcae8f550d375695bb8745f11b30c42aaa20d0bcab8f546ca5af0684d784453850949fe1b244206793e813a46d72cbbf0dda8aed2cee86e9491ba44a643e3e + languageName: node + linkType: hard + +"pirates@npm:^4.0.4": + version: 4.0.6 + resolution: "pirates@npm:4.0.6" + checksum: 46a65fefaf19c6f57460388a5af9ab81e3d7fd0e7bc44ca59d753cb5c4d0df97c6c6e583674869762101836d68675f027d60f841c105d72734df9dfca97cbcc6 + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: ^4.0.0 + checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 + languageName: node + linkType: hard + +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.6.2": + version: 29.6.2 + resolution: "pretty-format@npm:29.6.2" + dependencies: + "@jest/schemas": ^29.6.0 + ansi-styles: ^5.0.0 + react-is: ^18.0.0 + checksum: a0f972a44f959023c0df9cdfe9eed7540264d7f7ddf74667db8a5294444d5aa153fd47d20327df10ae86964e2ceec10e46ea06b1a5c9c12e02348b78c952c9fc + languageName: node + linkType: hard + +"process-warning@npm:^2.0.0, process-warning@npm:^2.2.0": + version: 2.2.0 + resolution: "process-warning@npm:2.2.0" + checksum: 394ae451c2622ee7d014a7196d36658fc1a5d5cc9f3bfeb54aadd5b77fcfecc89a30a25db259ae76ff49fde3f3f3dd7031dcdfb4da2e5445dac795549352e5d0 + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: ^2.0.2 + retry: ^0.12.0 + checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 + languageName: node + linkType: hard + +"prompts@npm:^2.0.1": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: ^3.0.3 + sisteransi: ^1.0.5 + checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d + languageName: node + linkType: hard + +"proxy-addr@npm:^2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 + languageName: node + linkType: hard + +"pstree.remy@npm:^1.1.8": + version: 1.1.8 + resolution: "pstree.remy@npm:1.1.8" + checksum: 5cb53698d6bb34dfb278c8a26957964aecfff3e161af5fbf7cee00bbe9d8547c7aced4bd9cb193bce15fb56e9e4220fc02a5bf9c14345ffb13a36b858701ec2d + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.0 + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: ^1.1.0 + once: ^1.3.1 + checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.0 + resolution: "punycode@npm:2.3.0" + checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + languageName: node + linkType: hard + +"pure-rand@npm:^6.0.0": + version: 6.0.2 + resolution: "pure-rand@npm:6.0.2" + checksum: 79de33876a4f515d759c48e98d00756bbd916b4ea260cc572d7adfa4b62cace9952e89f0241d0410214554503d25061140fe325c66f845213d2b1728ba8d413e + languageName: node + linkType: hard + +"quick-format-unescaped@npm:^4.0.3": + version: 4.0.4 + resolution: "quick-format-unescaped@npm:4.0.4" + checksum: 7bc32b99354a1aa46c089d2a82b63489961002bb1d654cee3e6d2d8778197b68c2d854fd23d8422436ee1fdfd0abaddc4d4da120afe700ade68bd357815b26fd + languageName: node + linkType: hard + +"react-is@npm:^18.0.0": + version: 18.2.0 + resolution: "react-is@npm:18.2.0" + checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e + languageName: node + linkType: hard + +"readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d + languageName: node + linkType: hard + +"readable-stream@npm:^4.0.0": + version: 4.4.2 + resolution: "readable-stream@npm:4.4.2" + dependencies: + abort-controller: ^3.0.0 + buffer: ^6.0.3 + events: ^3.3.0 + process: ^0.11.10 + string_decoder: ^1.3.0 + checksum: 6f4063763dbdb52658d22d3f49ca976420e1fbe16bbd241f744383715845350b196a2f08b8d6330f8e219153dff34b140aeefd6296da828e1041a7eab1f20d5e + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: ^2.2.1 + checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + languageName: node + linkType: hard + +"real-require@npm:^0.2.0": + version: 0.2.0 + resolution: "real-require@npm:0.2.0" + checksum: fa060f19f2f447adf678d1376928c76379dce5f72bd334da301685ca6cdcb7b11356813332cc243c88470796bc2e2b1e2917fc10df9143dd93c2ea608694971d + languageName: node + linkType: hard + +"reflect-metadata@npm:^0.1.13": + version: 0.1.13 + resolution: "reflect-metadata@npm:0.1.13" + checksum: 798d379a7b6f6455501145419505c97dd11cbc23857a386add2b9ef15963ccf15a48d9d15507afe01d4cd74116df8a213247200bac00320bd7c11ddeaa5e8fb4 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: ^5.0.0 + checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + languageName: node + linkType: hard + +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 1012afc566b3fdb190a6309cc37ef3b2dcc35dff5fa6683a9d00cd25c3247edfbc4691b91078c97adc82a29b77a2660c30d791d65dab4fc78bfc473f60289977 + languageName: node + linkType: hard + +"resolve.exports@npm:^2.0.0": + version: 2.0.2 + resolution: "resolve.exports@npm:2.0.2" + checksum: 1c7778ca1b86a94f8ab4055d196c7d87d1874b96df4d7c3e67bbf793140f0717fd506dcafd62785b079cd6086b9264424ad634fb904409764c3509c3df1653f2 + languageName: node + linkType: hard + +"resolve@npm:^1.20.0": + version: 1.22.3 + resolution: "resolve@npm:1.22.3" + dependencies: + is-core-module: ^2.12.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: fb834b81348428cb545ff1b828a72ea28feb5a97c026a1cf40aa1008352c72811ff4d4e71f2035273dc536dcfcae20c13604ba6283c612d70fa0b6e44519c374 + languageName: node + linkType: hard + +"resolve@patch:resolve@^1.20.0#~builtin": + version: 1.22.3 + resolution: "resolve@patch:resolve@npm%3A1.22.3#~builtin::version=1.22.3&hash=c3c19d" + dependencies: + is-core-module: ^2.12.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: ad59734723b596d0891321c951592ed9015a77ce84907f89c9d9307dd0c06e11a67906a3e628c4cae143d3e44898603478af0ddeb2bba3f229a9373efe342665 + languageName: node + linkType: hard + +"ret@npm:~0.2.0": + version: 0.2.2 + resolution: "ret@npm:0.2.2" + checksum: 774964bb413a3525e687bca92d81c1cd75555ec33147c32ecca22f3d06409e35df87952cfe3d57afff7650a0f7e42139cf60cb44e94c29dde390243bc1941f16 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rfdc@npm:^1.2.0, rfdc@npm:^1.3.0": + version: 1.3.0 + resolution: "rfdc@npm:1.3.0" + checksum: fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32 + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + +"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safe-regex2@npm:^2.0.0": + version: 2.0.0 + resolution: "safe-regex2@npm:2.0.0" + dependencies: + ret: ~0.2.0 + checksum: f5e182fca040dedd50ae052ea0eb035d9903b2db71243d5d8b43299735857288ef2ab52546a368d9c6fd1333b2a0d039297925e78ffc14845354f3f6158af7c2 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 3aeb64449706ee1f5ad2459fc99648b131d48e7a1fbb608d7c628020177512dc9d94108a5cb61bbc953985d313d0afea6566d243237743e02870490afef04b43 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + languageName: node + linkType: hard + +"secure-json-parse@npm:^2.4.0, secure-json-parse@npm:^2.5.0": + version: 2.7.0 + resolution: "secure-json-parse@npm:2.7.0" + checksum: d9d7d5a01fc6db6115744ba23cf9e67ecfe8c524d771537c062ee05ad5c11b64c730bc58c7f33f60bd6877f96b86f0ceb9ea29644e4040cb757f6912d4dd6737 + languageName: node + linkType: hard + +"semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.5.0, semver@npm:^7.5.3": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 + languageName: node + linkType: hard + +"set-cookie-parser@npm:^2.4.1": + version: 2.6.0 + resolution: "set-cookie-parser@npm:2.6.0" + checksum: bf11ebc594c53d84588f1b4c04f1b8ce14e0498b1c011b3d76b5c6d5aac481bbc3f7c5260ec4ce99bdc1d9aed19f9fc315e73166a36ca74d0f12349a73f6bdc9 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.0.2 + resolution: "signal-exit@npm:4.0.2" + checksum: 41f5928431cc6e91087bf0343db786a6313dd7c6fd7e551dbc141c95bb5fb26663444fd9df8ea47c5d7fc202f60aa7468c3162a9365cbb0615fc5e1b1328fe31 + languageName: node + linkType: hard + +"simple-update-notifier@npm:^2.0.0": + version: 2.0.0 + resolution: "simple-update-notifier@npm:2.0.0" + dependencies: + semver: ^7.5.3 + checksum: 9ba00d38ce6a29682f64a46213834e4eb01634c2f52c813a9a7b8873ca49cdbb703696f3290f3b27dc067de6d9418b0b84bef22c3eb074acf352529b2d6c27fd + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "socks-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^6.0.2 + debug: ^4.3.3 + socks: ^2.6.2 + checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + languageName: node + linkType: hard + +"socks@npm:^2.6.2": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: ^2.0.0 + smart-buffer: ^4.2.0 + checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + languageName: node + linkType: hard + +"sonic-boom@npm:^3.0.0, sonic-boom@npm:^3.1.0": + version: 3.3.0 + resolution: "sonic-boom@npm:3.3.0" + dependencies: + atomic-sleep: ^1.0.0 + checksum: 4a290dd0f3edf49894bb72c631ee304dc3f9be0752c43d516808a365f341821f5cf49997c80ee7c0e67167e0e5131dc71afe7c58812858eb965d6b9746c0cac7 + languageName: node + linkType: hard + +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 933550047b6c1a2328599a21d8b7666507427c0f5ef5eaadd56b5da0fd9505e239053c66fe181bf1df469a3b7af9d775778eee283cbb7ae16b902ddc09e93a97 + languageName: node + linkType: hard + +"source-map-support@npm:^0.5.21": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 + languageName: node + linkType: hard + +"split2@npm:^4.0.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 05d54102546549fe4d2455900699056580cca006c0275c334611420f854da30ac999230857a85fdd9914dc2109ae50f80fda43d2a445f2aa86eccdc1dfce779d + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 + languageName: node + linkType: hard + +"src@workspace:.": + version: 0.0.0-use.local + resolution: "src@workspace:." + dependencies: + "@aws-sdk/client-ssm": ^3.382.0 + "@edgedb/generate": ^0.3.1 + "@types/jest": ^29.5.3 + "@types/lodash": ^4 + "@types/node": ^20.4.2 + edgedb: ^1.3.4 + fastify: ^4.20.0 + google-auth-library: ^9.0.0 + google-spreadsheet: ^4.0.2 + jest: ^29.6.2 + lodash: ^4.17.21 + nodemon: ^3.0.1 + pino-pretty: ^10.1.0 + reflect-metadata: ^0.1.13 + ts-jest: ^29.1.1 + ts-node: ^10.9.1 + tsx: ^3.12.7 + tsyringe: ^4.8.0 + typescript: ^5.1.6 + ulid: ^2.3.0 + languageName: unknown + linkType: soft + +"ssri@npm:^10.0.0": + version: 10.0.4 + resolution: "ssri@npm:10.0.4" + dependencies: + minipass: ^5.0.0 + checksum: fb14da9f8a72b04eab163eb13a9dda11d5962cd2317f85457c4e0b575e9a6e0e3a6a87b5bf122c75cb36565830cd5f263fb457571bf6f1587eb5f95d095d6165 + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: ^2.0.0 + checksum: 052bf4d25bbf5f78e06c1d5e67de2e088b06871fa04107ca8d3f0e9d9263326e2942c8bedee3545795fc77d787d443a538345eef74db2f8e35db3558c6f91ff7 + languageName: node + linkType: hard + +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: ^1.0.2 + strip-ansi: ^6.0.0 + checksum: ce85533ef5113fcb7e522bcf9e62cb33871aa99b3729cec5595f4447f660b0cefd542ca6df4150c97a677d58b0cb727a3fe09ac1de94071d05526c73579bf505 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: ~5.2.0 + checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: ^6.0.1 + checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + languageName: node + linkType: hard + +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"strnum@npm:^1.0.5": + version: 1.0.5 + resolution: "strnum@npm:1.0.5" + checksum: 651b2031db5da1bf4a77fdd2f116a8ac8055157c5420f5569f64879133825915ad461513e7202a16d7fec63c54fd822410d0962f8ca12385c4334891b9ae6dd2 + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: ^4.0.0 + checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.1.15 + resolution: "tar@npm:6.1.15" + dependencies: + chownr: ^2.0.0 + fs-minipass: ^2.0.0 + minipass: ^5.0.0 + minizlib: ^2.1.1 + mkdirp: ^1.0.3 + yallist: ^4.0.0 + checksum: f23832fceeba7578bf31907aac744ae21e74a66f4a17a9e94507acf460e48f6db598c7023882db33bab75b80e027c21f276d405e4a0322d58f51c7088d428268 + languageName: node + linkType: hard + +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": ^0.1.2 + glob: ^7.1.4 + minimatch: ^3.0.4 + checksum: 3b34a3d77165a2cb82b34014b3aba93b1c4637a5011807557dc2f3da826c59975a5ccad765721c4648b39817e3472789f9b0fa98fc854c5c1c7a1e632aacdc28 + languageName: node + linkType: hard + +"thread-stream@npm:^2.0.0": + version: 2.3.0 + resolution: "thread-stream@npm:2.3.0" + dependencies: + real-require: ^0.2.0 + checksum: e9ea58f9f36320165b41c2aae5c439bf68bd3575eb533c458483d8b290e31d519979e351408c7d6e248711611434332c2a3aae2165650b028cc3eb9b1052ac16 + languageName: node + linkType: hard + +"tiny-lru@npm:^11.0.1": + version: 11.0.1 + resolution: "tiny-lru@npm:11.0.1" + checksum: 709ab58a454028eae15dd249518a1e348520e22514e52fd625ef89ba04a42599522e9f6cc89f50f76d3809cc46cac352bd0b63f052d23562e7adafe3e728531a + languageName: node + linkType: hard + +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873 + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"touch@npm:^3.1.0": + version: 3.1.0 + resolution: "touch@npm:3.1.0" + dependencies: + nopt: ~1.0.10 + bin: + nodetouch: ./bin/nodetouch.js + checksum: e0be589cb5b0e6dbfce6e7e077d4a0d5f0aba558ef769c6d9c33f635e00d73d5be49da6f8631db302ee073919d82b5b7f56da2987feb28765c95a7673af68647 + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 + languageName: node + linkType: hard + +"ts-jest@npm:^29.1.1": + version: 29.1.1 + resolution: "ts-jest@npm:29.1.1" + dependencies: + bs-logger: 0.x + fast-json-stable-stringify: 2.x + jest-util: ^29.0.0 + json5: ^2.2.3 + lodash.memoize: 4.x + make-error: 1.x + semver: ^7.5.3 + yargs-parser: ^21.0.1 + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3 <6" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: a8c9e284ed4f819526749f6e4dc6421ec666f20ab44d31b0f02b4ed979975f7580b18aea4813172d43e39b29464a71899f8893dd29b06b4a351a3af8ba47b402 + languageName: node + linkType: hard + +"ts-node@npm:^10.9.1": + version: 10.9.1 + resolution: "ts-node@npm:10.9.1" + dependencies: + "@cspotcode/source-map-support": ^0.8.0 + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.2 + acorn: ^8.4.1 + acorn-walk: ^8.1.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + v8-compile-cache-lib: ^3.0.1 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 + languageName: node + linkType: hard + +"tslib@npm:^1.11.1, tslib@npm:^1.9.3": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + +"tslib@npm:^2.3.1, tslib@npm:^2.5.0": + version: 2.6.1 + resolution: "tslib@npm:2.6.1" + checksum: b0d176d176487905b66ae4d5856647df50e37beea7571c53b8d10ba9222c074b81f1410fb91da13debaf2cbc970663609068bdebafa844ea9d69b146527c38fe + languageName: node + linkType: hard + +"tsx@npm:^3.12.7": + version: 3.12.7 + resolution: "tsx@npm:3.12.7" + dependencies: + "@esbuild-kit/cjs-loader": ^2.4.2 + "@esbuild-kit/core-utils": ^3.0.0 + "@esbuild-kit/esm-loader": ^2.5.5 + fsevents: ~2.3.2 + dependenciesMeta: + fsevents: + optional: true + bin: + tsx: dist/cli.js + checksum: ddec149ad263e5c75fc8fde5c6ba7ec2ee390934c0a2e2c23897bacab83bc8c665955a23b608a19c42f49c14a7362cf74ad793b52cc94eda684be5c2c13fdb4d + languageName: node + linkType: hard + +"tsyringe@npm:^4.8.0": + version: 4.8.0 + resolution: "tsyringe@npm:4.8.0" + dependencies: + tslib: ^1.9.3 + checksum: 6bf13235cc1ae86829169e3a887c3ff6ee2d220678df01dd0fff202b5a533d4eb47a52334b76d2b1b1cf80c8c92ff22173a54ad72c9f1b8ea0ea4957304966f0 + languageName: node + linkType: hard + +"type-detect@npm:4.0.8": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 + languageName: node + linkType: hard + +"typescript@npm:^5.1.6": + version: 5.1.6 + resolution: "typescript@npm:5.1.6" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: b2f2c35096035fe1f5facd1e38922ccb8558996331405eb00a5111cc948b2e733163cc22fab5db46992aba7dd520fff637f2c1df4996ff0e134e77d3249a7350 + languageName: node + linkType: hard + +"typescript@patch:typescript@^5.1.6#~builtin": + version: 5.1.6 + resolution: "typescript@patch:typescript@npm%3A5.1.6#~builtin::version=5.1.6&hash=77c9e2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 21e88b0a0c0226f9cb9fd25b9626fb05b4c0f3fddac521844a13e1f30beb8f14e90bd409a9ac43c812c5946d714d6e0dee12d5d02dfc1c562c5aacfa1f49b606 + languageName: node + linkType: hard + +"ulid@npm:^2.3.0": + version: 2.3.0 + resolution: "ulid@npm:2.3.0" + bin: + ulid: ./bin/cli.js + checksum: d6dbf253fdc189f60fe2829d934ee5447b3dab62d05449a2e0fe89670d77087dd6eba4f844a69f9ffdb01384ec6fd97bdd9be638fc67d593569a45e8969f1e69 + languageName: node + linkType: hard + +"undefsafe@npm:^2.0.5": + version: 2.0.5 + resolution: "undefsafe@npm:2.0.5" + checksum: f42ab3b5770fedd4ada175fc1b2eb775b78f609156f7c389106aafd231bfc210813ee49f54483d7191d7b76e483bc7f537b5d92d19ded27156baf57592eb02cc + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: ^4.0.0 + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.11": + version: 1.0.11 + resolution: "update-browserslist-db@npm:1.0.11" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: b98327518f9a345c7cad5437afae4d2ae7d865f9779554baf2a200fdf4bac4969076b679b1115434bd6557376bdd37ca7583d0f9b8f8e302d7d4cc1e91b5f231 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 + languageName: node + linkType: hard + +"v8-to-istanbul@npm:^9.0.1": + version: 9.1.0 + resolution: "v8-to-istanbul@npm:9.1.0" + dependencies: + "@jridgewell/trace-mapping": ^0.3.12 + "@types/istanbul-lib-coverage": ^2.0.1 + convert-source-map: ^1.6.0 + checksum: 2069d59ee46cf8d83b4adfd8a5c1a90834caffa9f675e4360f1157ffc8578ef0f763c8f32d128334424159bb6b01f3876acd39cd13297b2769405a9da241f8d1 + languageName: node + linkType: hard + +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" + dependencies: + makeerror: 1.0.12 + checksum: ad7a257ea1e662e57ef2e018f97b3c02a7240ad5093c392186ce0bcf1f1a60bbadd520d073b9beb921ed99f64f065efb63dfc8eec689a80e569f93c1c5d5e16c + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: ~0.0.3 + webidl-conversions: ^3.0.0 + checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.5": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: ^1.0.2 || 2 || 3 || 4 + checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: ^0.1.4 + signal-exit: ^3.0.7 + checksum: 5da60bd4eeeb935eec97ead3df6e28e5917a6bd317478e4a85a5285e8480b8ed96032bbcc6ecd07b236142a24f3ca871c924ec4a6575e623ec1b11bf8c1c253c + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 48f7bb00dc19fc635a13a39fe547f527b10c9290e7b3e836b9a8f1ca04d4d342e85714416b3c2ab74949c9c66f9cebb0473e6bc353b79035356103b47641285d + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + +"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c + languageName: node + linkType: hard + +"yargs@npm:^17.3.1": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + languageName: node + linkType: hard diff --git a/tsconfig.json b/tsconfig.json index 135bbc9ac..5f993b327 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,10 +24,12 @@ "strictPropertyInitialization": false, "typeRoots": [ "./node_modules/@types" - ] + ], + "skipLibCheck": true, }, "exclude": [ "node_modules", - "cdk.out" + "cdk.out", + "lib/workload/stateless/metadata_manager" ] }