diff --git a/api/index.ts b/api/index.ts index e9d16d066..ea4a4b482 100644 --- a/api/index.ts +++ b/api/index.ts @@ -10,10 +10,9 @@ import Schema from '@openaddresses/batch-schema'; import Err from '@openaddresses/batch-error'; import Modeler from '@openaddresses/batch-generic'; import minimist from 'minimist'; -import ConnectionPool, { ConnectionWebSocket, sleep } from './lib/connection-pool.js'; +import { ConnectionWebSocket, sleep } from './lib/connection-pool.js'; import EventsPool from './lib/events-pool.js'; import { WebSocket, WebSocketServer } from 'ws'; -import Cacher from './lib/cacher.js'; import BlueprintLogin, { tokenParser, AuthUser } from '@tak-ps/blueprint-login'; import Config from './lib/config.js'; import TAKAPI, { APIAuthPassword } from './lib/tak-api.js'; @@ -58,33 +57,20 @@ if (import.meta.url === `file://${process.argv[1]}`) { postgres: process.env.POSTGRES || args.postgres || 'postgres://postgres@localhost:5432/tak_ps_etl', nometrics: args.nometrics || false, nosinks: args.nosinks || false, + nocache: args.nocache || false, local: args.local || false, }); await server(config); } export default async function server(config: Config) { - config.cacher = new Cacher(args.nocache, config.silent); - try { await config.cacher.flush(); } catch (err) { console.log(`ok - failed to flush cache: ${err instanceof Error? err.message : String(err)}`); } - try { - const ServerModel = new Modeler(config.pg, pgschema.Server); - config.server = await ServerModel.from(1); - } catch (err) { - console.log(`ok - no server config found: ${err instanceof Error ? err.message : String(err)}`); - } - - if (config.server) { - config.conns = new ConnectionPool(config, config.server, config.wsClients, config.StackName, config.local); - await config.conns.init(); - } else { - console.error('not ok - no connection pool due to lack of server config'); - } + await config.conns.init(); config.events = new EventsPool(config.StackName); if (!config.noevents) await config.events.init(config.pg); @@ -139,23 +125,20 @@ export default async function server(config: Config) { const ProfileModel = new Modeler(config.pg, pgschema.Profile); login.on('login', async (user) => { - let profile; try { - profile = await ProfileModel.from(user.username); + await ProfileModel.from(user.username); } catch (err) { if (err instanceof Err && err.status === 404) { - profile = await ProfileModel.generate({ username: user.username }); + const api = await TAKAPI.init(new URL(config.MartiAPI), new APIAuthPassword(user.username, user.password)); + + await ProfileModel.generate({ + username: user.username, + auth: await api.Credentials.generate() + }); } else { return console.error(err); } } - - try { - const api = await TAKAPI.init(new URL(config.MartiAPI), new APIAuthPassword(user.username, user.password)); - await ProfileModel.commit(profile.username, { auth: await api.Credentials.generate() }); - } catch (err) { - console.error(err); - } }); await schema.blueprint(login); diff --git a/api/lib/api/groups.ts b/api/lib/api/groups.ts index c1acfa19c..79abbf00e 100644 --- a/api/lib/api/groups.ts +++ b/api/lib/api/groups.ts @@ -21,9 +21,11 @@ export default class { async list(query: { useCache?: string; + + [key: string]: unknown; }): Promise> { const url = new URL(`/Marti/api/groups/all`, this.api.url); - for (const q in query) url.searchParams.append(q, query[q]); + for (const q in query) url.searchParams.append(q, String(query[q])); return await this.api.fetch(url, { method: 'GET' }); @@ -31,9 +33,11 @@ export default class { async update(body: Group[], query: { clientUid?: string; + + [key: string]: unknown; }): Promise { const url = new URL(`/Marti/api/groups/active`, this.api.url); - for (const q in query) url.searchParams.append(q, query[q]); + for (const q in query) url.searchParams.append(q, String(query[q])); await this.api.fetch(url, { method: 'PUT', diff --git a/api/lib/asset.ts b/api/lib/asset.ts index 04c02bcbc..7ad6bab66 100644 --- a/api/lib/asset.ts +++ b/api/lib/asset.ts @@ -1,66 +1,85 @@ import Err from '@openaddresses/batch-error'; import path from 'path'; import S3 from '../lib/aws/s3.js'; +import { _Object } from '@aws-sdk/client-s3'; import Config from '../lib/config.js'; -export default async function AssetList(config: Config, prefix: string) { +export type AssetListOutput = { + total: number; + tiles: { + url: string; + }, + assets: Array +} + +export type AssetOutput = { + name: string; + visualized?: string; + vectorized?: string, + updated: number; + etag: string; + size: number; +} + +export default async function AssetList(config: Config, prefix: string): Promise { try { const viz = new Map() ; const geo = new Map() ; - let assets = []; - (await S3.list(prefix)).map((l) => { - if (path.parse(l.Key).ext === '.pmtiles') viz.set(path.parse(l.Key).name, l) - else if (path.parse(l.Key).ext === '.geojsonld') geo.set(path.parse(l.Key).name, l) - else assets.push(l) - }); + const assets: Array<_Object> = []; + (await S3.list(prefix)) + .map((l) => { + if (path.parse(String(l.Key)).ext === '.pmtiles') viz.set(path.parse(String(l.Key)).name, l) + else if (path.parse(String(l.Key)).ext === '.geojsonld') geo.set(path.parse(String(l.Key)).name, l) + else assets.push(l) + }); - assets = assets.map((a) => { - const isViz = viz.get(path.parse(a.Key).name); - if (isViz) viz.delete(path.parse(a.Key).name); - const isGeo = geo.get(path.parse(a.Key).name); - if (isGeo) geo.delete(path.parse(a.Key).name); + const final: AssetOutput[] = assets.map((a: _Object) => { + const isViz = viz.get(path.parse(String(a.Key)).name); + if (isViz) viz.delete(path.parse(String(a.Key)).name); + const isGeo = geo.get(path.parse(String(a.Key)).name); + if (isGeo) geo.delete(path.parse(String(a.Key)).name); return { - name: a.Key.replace(prefix, ''), - visualized: isViz ? path.parse(a.Key.replace(prefix, '')).name + '.pmtiles' : false, - vectorized: isGeo ? path.parse(a.Key.replace(prefix, '')).name + '.geojsonld' : false, - updated: new Date(a.LastModified).getTime(), - etag: JSON.parse(a.ETag), - size: a.Size + name: String(a.Key).replace(prefix, ''), + visualized: isViz ? path.parse(String(a.Key).replace(prefix, '')).name + '.pmtiles' : undefined, + vectorized: isGeo ? path.parse(String(a.Key).replace(prefix, '')).name + '.geojsonld' : undefined, + updated: a.LastModified ? new Date(a.LastModified).getTime() : new Date().getTime(), + etag: String(JSON.parse(String(a.ETag))), + size: a.Size ? a.Size : 0 }; }).concat(Array.from(geo.values()).map((a) => { - const isViz = viz.get(path.parse(a.Key).name); - if (isViz) viz.delete(path.parse(a.Key).name); + const isViz = viz.get(path.parse(String(a.Key)).name); + if (isViz) viz.delete(path.parse(String(a.Key)).name); return { - name: a.Key.replace(prefix, ''), - visualized: isViz ? path.parse(a.Key.replace(prefix, '')).name + '.pmtiles' : false, - vectorized: a.Key.replace(prefix, ''), - updated: new Date(a.LastModified).getTime(), - etag: JSON.parse(a.ETag), - size: a.Size + name: String(a.Key).replace(prefix, ''), + visualized: isViz ? path.parse(String(a.Key).replace(prefix, '')).name + '.pmtiles' : undefined, + vectorized: String(a.Key).replace(prefix, ''), + updated: a.LastModified ? new Date(a.LastModified).getTime() : new Date().getTime(), + etag: String(JSON.parse(String(a.ETag))), + size: a.Size ? a.Size : 0 }; })).concat(Array.from(viz.values()).map((a) => { return { - name: a.Key.replace(prefix, ''), - visualized: a.Key.replace(prefix, ''), - vectorized: false, - updated: new Date(a.LastModified).getTime(), - etag: JSON.parse(a.ETag), - size: a.Size + name: String(a.Key).replace(prefix, ''), + visualized: String(a.Key).replace(prefix, ''), + vectorized: undefined, + updated: a.LastModified ? new Date(a.LastModified).getTime() : new Date().getTime(), + etag: String(JSON.parse(String(a.ETag))), + size: a.Size ? a.Size : 0 }; })); return { - total: assets.length, + total: final.length, tiles: { url: String(new URL(`${config.PMTILES_URL}/tiles/${prefix}`)) }, - assets + assets: final }; } catch (err) { - throw new Err(500, err, 'Asset List Error'); + throw new Err(500, err instanceof Error ? err : new Error(String(err)), 'Asset List Error'); } } diff --git a/api/lib/aws/alarm.ts b/api/lib/aws/alarm.ts index f3aa5d825..2b1d63195 100644 --- a/api/lib/aws/alarm.ts +++ b/api/lib/aws/alarm.ts @@ -21,19 +21,19 @@ export default class Alarm { AlarmNamePrefix: `${this.stack}-layer-` })); - for (const alarm of res.MetricAlarms) { + for (const alarm of (res.MetricAlarms || [])) { let value = 'healthy'; if (alarm.StateValue === 'ALARM') value = 'alarm'; if (alarm.StateValue === 'INSUFFICIENT_DATA') value = 'unknown'; - const layer = parseInt(alarm.AlarmName.replace(`${this.stack}-layer-`, '')); + const layer = parseInt(String(alarm.AlarmName).replace(`${this.stack}-layer-`, '')); map.set(layer, value); } return map; } catch (err) { - throw new Err(500, new Error(err), 'Failed to describe alarms'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'Failed to describe alarms'); } } @@ -45,14 +45,14 @@ export default class Alarm { AlarmNames: [`${this.stack}-layer-${layer}`] })); - if (!res.MetricAlarms.length) return 'unknown'; + if (!res.MetricAlarms || !res.MetricAlarms.length) return 'unknown'; let value = 'healthy'; if (res.MetricAlarms[0].StateValue === 'ALARM') value = 'alarm'; if (res.MetricAlarms[0].StateValue === 'INSUFFICIENT_DATA') value = 'unknown'; return value; } catch (err) { - throw new Err(500, new Error(err), 'Failed to describe alarm'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'Failed to describe alarm'); } } } diff --git a/api/lib/aws/batch-logs.ts b/api/lib/aws/batch-logs.ts index 7e8f4ec6a..8dc5a4578 100644 --- a/api/lib/aws/batch-logs.ts +++ b/api/lib/aws/batch-logs.ts @@ -1,31 +1,40 @@ import CloudWatchLogs from '@aws-sdk/client-cloudwatch-logs'; import process from 'node:process'; +export type LogGroupOutput = { + logs: Array<{ + message: string; + timestamp: number; + }> +} + /** * @class */ export default class LogGroup { - static async list(stream: string) { + static async list(stream: string): Promise { const cwl = new CloudWatchLogs.CloudWatchLogsClient({ region: process.env.AWS_DEFAULT_REGION }); + const logs = await cwl.send(new CloudWatchLogs.GetLogEventsCommand({ + logStreamName: stream, + logGroupName: `/aws/batch/job`, + startFromHead: true, + })) + try { return { - logs: (await cwl.send(new CloudWatchLogs.GetLogEventsCommand({ - logStreamName: stream, - logGroupName: `/aws/batch/job`, - startFromHead: true, - }))).events.map((log) => { + logs: (logs.events || []).map((log) => { return { - message: log.message, - timestamp: log.timestamp + message: String(log.message), + timestamp: log.timestamp || 0 } }) } } catch (err) { - if (err.message.contains('The specified log stream does not exist')) { + if (err instanceof Error && err.message.includes('The specified log stream does not exist')) { return { logs: [] } } else { - throw err; + throw new Error(err instanceof Error ? err.message : String(err)); } } } diff --git a/api/lib/aws/batch.ts b/api/lib/aws/batch.ts index 6ef2ba6c3..fe6fc6283 100644 --- a/api/lib/aws/batch.ts +++ b/api/lib/aws/batch.ts @@ -13,7 +13,7 @@ export interface BatchJob { asset: string; status: string; created: number; - updated: number; + updated?: number; logstream?: string; } @@ -72,13 +72,17 @@ export default class Batch { static async job(config: Config, jobid: string): Promise { const batch = new AWSBatch.BatchClient({ region: process.env.AWS_DEFAULT_REGION }); - const jobs = await batch.send(new AWSBatch.DescribeJobsCommand({ + const res = await batch.send(new AWSBatch.DescribeJobsCommand({ jobs: [jobid] })) - if (!jobs.jobs.length) throw new Err(400, null, 'AWS Does not report this job'); + if (!res.jobs || !res.jobs.length) throw new Err(400, null, 'AWS Does not report this job'); - const job = jobs.jobs[0]; + const job = res.jobs[0]; + + if (!job.jobName) throw new Err(400, null, 'AWS Does not report a jobName') + if (!job.jobId) throw new Err(400, null, 'AWS Does not report a jobId') + if (!job.status) throw new Err(400, null, 'AWS Does not report a Status') const name = job.jobName.replace(/data-[0-9]+-/, ''); let asset: string[] = [...name]; @@ -88,22 +92,28 @@ export default class Batch { id: job.jobId, asset: asset.join(''), status: job.status, - created: job.createdAt, + created: job.createdAt || +new Date(), updated: job.stoppedAt, - logstream: job.container.logStreamName + logstream: job.container ? job.container.logStreamName : undefined } } static async list(config: Config, prefix: string): Promise { const batch = new AWSBatch.BatchClient({ region: process.env.AWS_DEFAULT_REGION }); - const jobs = (await batch.send(new AWSBatch.ListJobsCommand({ + const res = await batch.send(new AWSBatch.ListJobsCommand({ jobQueue: `${config.StackName}-queue`, filters: [{ name: 'JOB_NAME', values: [`${prefix}-*`] }] - }))).jobSummaryList.map((job) => { + })) + + if (!res.jobSummaryList) throw new Err(400, null, 'AWS Does not report a jobSummaryList') + + const final: BatchJob[] = res.jobSummaryList.map((job) => { + if (!job.jobName) throw new Err(400, null, 'AWS Does not report a jobName') + if (!job.jobId) throw new Err(400, null, 'AWS Does not report a jobId') const name = job.jobName.replace(`${prefix}-`, ''); let asset: string[] = [...name]; asset[name.lastIndexOf('_')] = '.'; @@ -111,14 +121,14 @@ export default class Batch { return { id: job.jobId, asset: asset.join(''), - status: job.status, - created: job.createdAt, + status: String(job.status), + created: job.createdAt || +new Date(), updated: job.stoppedAt, }; }).sort((a, b) => { return b.created - a.created; }); - return jobs; + return final; } }; diff --git a/api/lib/aws/cloudformation.ts b/api/lib/aws/cloudformation.ts index 7b4a92bca..6ee03b793 100644 --- a/api/lib/aws/cloudformation.ts +++ b/api/lib/aws/cloudformation.ts @@ -32,7 +32,7 @@ export default class CloudFormation { })); } - static async update(config: Config, layerid: number, stack: object) { + static async update(config: Config, layerid: number, stack: object): Promise { const cf = new AWSCloudFormation.CloudFormationClient({ region: process.env.AWS_DEFAULT_REGION }); await cf.send(new AWSCloudFormation.UpdateStackCommand({ @@ -41,7 +41,9 @@ export default class CloudFormation { })); } - static async status(config: Config, layerid: number) { + static async status(config: Config, layerid: number): Promise<{ + status: string; + }> { const cf = new AWSCloudFormation.CloudFormationClient({ region: process.env.AWS_DEFAULT_REGION }); try { @@ -49,11 +51,13 @@ export default class CloudFormation { StackName: this.stdname(config, layerid) })); + if (!res.Stacks || !res.Stacks.length) return { status: 'unknown' } + return { - status: res.Stacks[0].StackStatus + status: String(res.Stacks[0].StackStatus) }; } catch (err) { - if (err.message.match(/Stack with id .* does not exist/)) { + if (err instanceof Error && err.message.match(/Stack with id .* does not exist/)) { return { status: 'destroyed' }; } else { throw err; @@ -61,7 +65,7 @@ export default class CloudFormation { } } - static async exists(config: Config, layerid: number) { + static async exists(config: Config, layerid: number): Promise { const cf = new AWSCloudFormation.CloudFormationClient({ region: process.env.AWS_DEFAULT_REGION }); try { @@ -69,11 +73,9 @@ export default class CloudFormation { StackName: this.stdname(config, layerid) })); - console.error(res); - return true; } catch (err) { - if (err.message.match(/Stack with id .* does not exist/)) { + if (err instanceof Error && err.message.match(/Stack with id .* does not exist/)) { return false; } else { throw err; @@ -81,7 +83,7 @@ export default class CloudFormation { } } - static async delete(config: Config, layerid: number) { + static async delete(config: Config, layerid: number): Promise { const cf = new AWSCloudFormation.CloudFormationClient({ region: process.env.AWS_DEFAULT_REGION }); await cf.send(new AWSCloudFormation.DeleteStackCommand({ diff --git a/api/lib/aws/dynamo.ts b/api/lib/aws/dynamo.ts index 44618cfe3..1a3e04d0d 100644 --- a/api/lib/aws/dynamo.ts +++ b/api/lib/aws/dynamo.ts @@ -49,7 +49,7 @@ export default class Dynamo { return items; } catch (err) { - throw new Err(500, err instanceof Error ? err : new Error(String(err)), 'DynamoDB Query Failed'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'DynamoDB Query Failed'); } } @@ -68,7 +68,7 @@ export default class Dynamo { return row.Item as DynamoItem; } catch (err) { - throw new Err(500, err instanceof Error ? err : new Error(String(err)), 'DynamoDB Query Failed'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'DynamoDB Query Failed'); } } @@ -94,7 +94,7 @@ export default class Dynamo { } })); } catch (err) { - throw new Err(500, err instanceof Error ? err : new Error(String(err)), 'DynamoDB putItem Failed'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'DynamoDB putItem Failed'); } } @@ -128,7 +128,7 @@ export default class Dynamo { await ddbdoc.send(new DynamoDBDoc.BatchWriteCommand(req)); } catch (err) { console.error('DEBUG', JSON.stringify(features)); - throw new Err(500, err instanceof Error ? err : new Error(String(err)), 'DynamoDB batchWrite Failed'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'DynamoDB batchWrite Failed'); } } } diff --git a/api/lib/aws/ecr.ts b/api/lib/aws/ecr.ts index b36f18706..48efec6f1 100644 --- a/api/lib/aws/ecr.ts +++ b/api/lib/aws/ecr.ts @@ -16,7 +16,7 @@ export default class ECR { return res; } catch (err) { - throw new Err(500, new Error(err), 'Failed to list ECR Tasks'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'Failed to list ECR Tasks'); } } } diff --git a/api/lib/aws/hooks.ts b/api/lib/aws/hooks.ts index d7a85a0b9..93cefbfb6 100644 --- a/api/lib/aws/hooks.ts +++ b/api/lib/aws/hooks.ts @@ -23,7 +23,7 @@ export default class HookQueue { return res; } catch (err) { console.error(err); - throw new Err(500, new Error(err), 'Failed to submit SQS Message'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'Failed to submit SQS Message'); } } } diff --git a/api/lib/aws/lambda-logs.ts b/api/lib/aws/lambda-logs.ts index ff1018569..82c8bf5ed 100644 --- a/api/lib/aws/lambda-logs.ts +++ b/api/lib/aws/lambda-logs.ts @@ -6,7 +6,7 @@ import process from 'node:process'; * @class */ export default class LogGroup { - static async delete(config: Config, layer: any) { + static async delete(config: Config, layer: any): Promise { const cwl = new CloudWatchLogs.CloudWatchLogsClient({ region: process.env.AWS_DEFAULT_REGION }); await cwl.send(new CloudWatchLogs.DeleteLogGroupCommand({ @@ -14,7 +14,12 @@ export default class LogGroup { })); } - static async list(config: Config, layer: any) { + static async list(config: Config, layer: any): Promise<{ + logs: Array<{ + message: string; + timestamp: number; + }> + }> { const cwl = new CloudWatchLogs.CloudWatchLogsClient({ region: process.env.AWS_DEFAULT_REGION }); const streams = await cwl.send(new CloudWatchLogs.DescribeLogStreamsCommand({ @@ -24,21 +29,19 @@ export default class LogGroup { orderBy: 'LastEventTime' })); - if (!streams.logStreams.length) { - return { - logs: [] - } + if (!streams.logStreams || !streams.logStreams.length) { + return { logs: [] } } return { - logs: (await cwl.send(new CloudWatchLogs.GetLogEventsCommand({ + logs: ((await cwl.send(new CloudWatchLogs.GetLogEventsCommand({ logStreamName: streams.logStreams[0].logStreamName, logGroupName: `/aws/lambda/${config.StackName}-layer-${layer.id}`, startFromHead: true, - }))).events.map((log) => { + }))).events || []).map((log) => { return { - message: log.message, - timestamp: log.timestamp + message: String(log.message), + timestamp: log.timestamp || 0 } }) } diff --git a/api/lib/aws/lambda.ts b/api/lib/aws/lambda.ts index 6854e234c..7a0f5d4f4 100644 --- a/api/lib/aws/lambda.ts +++ b/api/lib/aws/lambda.ts @@ -22,6 +22,7 @@ export default class Lambda { })) })); + if (!res.Payload) return {}; return JSON.parse(Buffer.from(res.Payload).toString()); } diff --git a/api/lib/aws/metric.ts b/api/lib/aws/metric.ts index 906deac88..e16439a2a 100644 --- a/api/lib/aws/metric.ts +++ b/api/lib/aws/metric.ts @@ -1,5 +1,7 @@ import Err from '@openaddresses/batch-error'; -import CloudWatch from '@aws-sdk/client-cloudwatch'; +import CloudWatch, { + MetricDataResult +} from '@aws-sdk/client-cloudwatch'; import moment from 'moment'; import process from 'node:process'; @@ -17,7 +19,7 @@ export default class Metric { this.paused = false; } - async post(connid: number) { + async post(connid: number): Promise { if (this.paused) return; try { @@ -38,15 +40,15 @@ export default class Metric { }] })); } catch (err) { - throw new Err(500, new Error(err), 'Failed to push metric data'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'Failed to push metric data'); } } - async connection(connid: number) { - if (this.paused) return; + async connection(connid: number): Promise> { + if (this.paused) return [] as Array; try { - return await this.cw.send(new CloudWatch.GetMetricDataCommand({ + const res = await this.cw.send(new CloudWatch.GetMetricDataCommand({ EndTime: moment().toDate(), StartTime: moment().subtract(12, 'hours').toDate(), MetricDataQueries: [{ @@ -69,16 +71,19 @@ export default class Metric { ReturnData: true }] })); + + if (!res || !res.MetricDataResults) return [] as Array; + return res.MetricDataResults; } catch (err) { - throw new Err(500, new Error(err), `Failed to retrieve metric data for Connection: ${connid}`); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), `Failed to retrieve metric data for Connection: ${connid}`); } } - async sink(sinkid: number) { - if (this.paused) return; + async sink(sinkid: number): Promise> { + if (this.paused) return [] as Array; try { - return await this.cw.send(new CloudWatch.GetMetricDataCommand({ + const res = await this.cw.send(new CloudWatch.GetMetricDataCommand({ EndTime: moment().toDate(), StartTime: moment().subtract(12, 'hours').toDate(), MetricDataQueries: [{ @@ -119,8 +124,11 @@ export default class Metric { ReturnData: true }] })); + + if (!res || !res.MetricDataResults) return [] as Array; + return res.MetricDataResults; } catch (err) { - throw new Err(500, new Error(err), `Failed to retrieve metric data for ConnectionSink: ${sinkid}`); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), `Failed to retrieve metric data for ConnectionSink: ${sinkid}`); } } } diff --git a/api/lib/aws/s3.ts b/api/lib/aws/s3.ts index 24db967f2..0f1eb4fec 100644 --- a/api/lib/aws/s3.ts +++ b/api/lib/aws/s3.ts @@ -9,7 +9,7 @@ import process from 'node:process'; * @class */ export default class S3 { - static async head(key: string) { + static async head(key: string): Promise { try { if (!process.env.ASSET_BUCKET) throw new Err(400, null, 'ASSET_BUCKET not set'); @@ -21,11 +21,11 @@ export default class S3 { return head; } catch (err) { - throw new Err(500, new Error(err), 'Failed to head file'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'Failed to head file'); } } - static async put(key: string, body: Readable | string) { + static async put(key: string, body: Readable | string): Promise { try { if (!process.env.ASSET_BUCKET) throw new Err(400, null, 'ASSET_BUCKET not set'); @@ -42,7 +42,7 @@ export default class S3 { await upload.done(); } catch (err) { - throw new Err(500, new Error(err), 'Failed to upload file'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'Failed to upload file'); } } @@ -60,11 +60,11 @@ export default class S3 { const read = res.Body as Readable; return read; } catch (err) { - throw new Err(500, new Error(err), 'Failed to get file'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'Failed to get file'); } } - static async exists(key: string) { + static async exists(key: string): Promise { try { if (!process.env.ASSET_BUCKET) throw new Err(400, null, 'ASSET_BUCKET not set'); @@ -75,9 +75,10 @@ export default class S3 { })); return true; } catch (err) { + //@ts-ignore if (err.code === 'NotFound') return false; - throw new Err(500, new Error(err), 'Failed to determine existance'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'Failed to determine existance'); } } @@ -86,7 +87,7 @@ export default class S3 { * * @param {string} fragment Key or Prefix to delete */ - static async list(fragment: string) { + static async list(fragment: string): Promise> { try { if (!process.env.ASSET_BUCKET) throw new Err(400, null, 'ASSET_BUCKET not set'); @@ -98,7 +99,7 @@ export default class S3 { return list.Contents || []; } catch (err) { - throw new Err(500, new Error(err), 'Failed to list files'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'Failed to list files'); } } @@ -111,7 +112,7 @@ export default class S3 { */ static async del(key: string, opts: { recurse: Boolean - } = { recurse: false }) { + } = { recurse: false }): Promise { if (!process.env.ASSET_BUCKET) return; const s3 = new S3AWS.S3Client({ region: process.env.AWS_DEFAULT_REGION }); @@ -122,7 +123,7 @@ export default class S3 { Key: key })); } catch (err) { - throw new Err(500, new Error(err), 'Failed to delete file'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'Failed to delete file'); } } else { try { @@ -141,7 +142,7 @@ export default class S3 { } })); } catch (err) { - throw new Err(500, new Error(err), 'Failed to delete files'); + throw new Err(500, new Error(err instanceof Error ? err.message : String(err)), 'Failed to delete files'); } } } diff --git a/api/lib/config.ts b/api/lib/config.ts index 7c474725b..2e1fea3b4 100644 --- a/api/lib/config.ts +++ b/api/lib/config.ts @@ -15,6 +15,7 @@ interface ConfigArgs { unsafe: boolean, noevents: boolean, nosinks: boolean, + nocache: boolean, nometrics: boolean, local: boolean } @@ -26,6 +27,7 @@ export default class Config { noevents: boolean; nometrics: boolean; nosinks: boolean; + nocache: boolean; models: Models; StackName: string; HookURL?: string; @@ -40,9 +42,9 @@ export default class Config { wsClients: Map; Bucket?: string; pg: Pool; - cacher?: Cacher; - conns?: ConnectionPool; - server?: InferSelectModel; + cacher: Cacher; + conns: ConnectionPool; + server: InferSelectModel; events?: EventsPool; constructor(init: { @@ -52,6 +54,7 @@ export default class Config { noevents: boolean; nometrics: boolean; nosinks: boolean; + nocache: boolean; models: Models; StackName: string; API_URL: string; @@ -60,6 +63,7 @@ export default class Config { SigningSecret: string; wsClients: Map; pg: Pool; + server: InferSelectModel; MartiAPI: string; AuthGroup: string; DynamoDB?: string; @@ -72,6 +76,7 @@ export default class Config { this.noevents = init.noevents; this.nometrics = init.nometrics; this.nosinks = init.nosinks; + this.nocache = init.nocache; this.models = init.models; this.StackName = init.StackName; this.UnsafeSigningSecret = 'coe-wildland-fire'; @@ -85,7 +90,12 @@ export default class Config { this.AuthGroup = init.AuthGroup; this.DynamoDB = init.DynamoDB; this.Bucket = init.Bucket; + this.server = init.server; this.HookURL = init.HookURL; + + this.conns = new ConnectionPool(this); + this.cacher = new Cacher(this.nocache, this.silent); + } static async env(args: ConfigArgs): Promise { @@ -127,6 +137,18 @@ export default class Config { const models = new Models(pg); + let server: InferSelectModel; + try { + server = await models.Server.from(1); + } catch (err) { + console.log(`ok - no server config found: ${err instanceof Error ? err.message : String(err)}`); + + server = await models.Server.generate({ + name: 'Default Server', + url: 'ssl://ops.example.com:8089', + api: 'https://ops.example.com:8443' + }); + } const config = new Config({ unsafe: (args.unsafe || false), @@ -135,13 +157,14 @@ export default class Config { noevents: (args.noevents || false), nometrics: (args.nometrics || false), nosinks: (args.nosinks || false), + nocache: (args.nocache || false), TileBaseURL: process.env.TileBaseURL ? new URL(process.env.TileBaseURL) : new URL('./data-dev/zipcodes.tilebase', import.meta.url), PMTILES_URL: process.env.PMTILES_URL || 'http://localhost:5001', MartiAPI: process.env.MartiAPI, AuthGroup: process.env.AuthGroup, StackName: process.env.StackName, wsClients: new Map(), - SigningSecret, API_URL, DynamoDB, Bucket, pg, models, HookURL + server, SigningSecret, API_URL, DynamoDB, Bucket, pg, models, HookURL }); if (!config.silent) { diff --git a/api/lib/connection-pool.ts b/api/lib/connection-pool.ts index 8c97d429c..8c45edf89 100644 --- a/api/lib/connection-pool.ts +++ b/api/lib/connection-pool.ts @@ -1,18 +1,13 @@ import Err from '@openaddresses/batch-error'; -import { - Server, - Connection, -} from './schema.js'; +import { Connection } from './schema.js'; import Sinks from './sinks.js'; import Config from './config.js'; import Metrics from './aws/metric.js'; import { WebSocket } from 'ws'; import TAK, { CoT } from '@tak-ps/node-tak'; -import { PostgresJsDatabase } from 'drizzle-orm/postgres-js'; import Modeler from '@openaddresses/batch-generic'; import { InferSelectModel } from 'drizzle-orm'; import { Feature } from 'geojson'; -import * as pgtypes from './schema.js'; export type EphemeralConnection = { id: string; @@ -89,37 +84,21 @@ class ConnectionClient { * @class */ export default class ConnectionPool extends Map { - #server: InferSelectModel; - pg: PostgresJsDatabase; - wsClients: Map; + config: Config; metrics: Metrics; sinks: Sinks; - nosinks: boolean; - stackName: string; - local: boolean; - constructor( - config: Config, - server: InferSelectModel, - wsClients: Map = new Map(), - stackName: string, - local=false - ) { + constructor(config: Config) { super(); - this.#server = server; - this.wsClients = wsClients; - this.stackName = stackName, - this.local = local, - this.metrics = new Metrics(stackName); + + this.config = config; + this.metrics = new Metrics(this.config.StackName); + if (config.nometrics) this.metrics.paused = true; - this.pg = config.pg; this.sinks = new Sinks(config); - this.nosinks = config.nosinks; } - async refresh(server: InferSelectModel) { - this.#server = server; - + async refresh() { for (const conn of this.keys()) { this.delete(conn); } @@ -133,12 +112,12 @@ export default class ConnectionPool extends Map { const conns: Promise[] = []; - const ConnectionModel = new Modeler(this.pg, Connection); + const ConnectionModel = new Modeler(this.config.pg, Connection); const stream = ConnectionModel.stream(); return new Promise((resolve, reject) => { stream.on('data', async (conn: InferSelectModel) => { - if (conn.enabled && !this.local) { + if (conn.enabled && !this.config.local) { conns.push(this.add(conn)); } }).on('end', async () => { @@ -170,8 +149,8 @@ export default class ConnectionPool extends Map | EphemeralConnection, cot: CoT, ephemeral=false) { - if (this.wsClients.has(String(conn.id))) { - for (const client of (this.wsClients.get(String(conn.id)) || [])) { + if (this.config.wsClients.has(String(conn.id))) { + for (const client of (this.config.wsClients.get(String(conn.id)) || [])) { if (client.format == 'geojson') { const feat = cot.to_geojson(); @@ -186,7 +165,7 @@ export default class ConnectionPool extends Map; try { await this.sinks.cot(c, cot); @@ -198,7 +177,7 @@ export default class ConnectionPool extends Map | EphemeralConnection, ephemeral=false): Promise { if (!conn.auth || !conn.auth.cert || !conn.auth.key) throw new Err(400, null, 'Connection must have auth.cert & auth.key'); - const tak = await TAK.connect(conn.id, new URL(this.#server.url), { + const tak = await TAK.connect(conn.id, new URL(this.config.server.url), { key: conn.auth.key, cert: conn.auth.cert }); @@ -218,7 +197,7 @@ export default class ConnectionPool extends Map { - if (this.stackName !== 'test' && !ephemeral) { + if (this.config.StackName !== 'test' && !ephemeral) { try { const c = conn as InferSelectModel; await this.metrics.post(c.id); diff --git a/api/lib/data-mission.ts b/api/lib/data-mission.ts index a165f2571..d790d1467 100644 --- a/api/lib/data-mission.ts +++ b/api/lib/data-mission.ts @@ -7,7 +7,7 @@ import Config from './config.js'; import { Mission } from './api/mission.js'; export default class DataMission { - static async sync(config: Config, data: InferSelectModel): Promise { + static async sync(config: Config, data: InferSelectModel): Promise { const connection = await config.models.Connection.from(data.connection); diff --git a/api/lib/esri.ts b/api/lib/esri.ts index 3f00cdddc..d9af9b773 100644 --- a/api/lib/esri.ts +++ b/api/lib/esri.ts @@ -40,7 +40,7 @@ export class EsriBase { if (this.type === EsriType.AGOL || this.type === EsriType.PORTAL) { this.postfix = base.pathname.replace(/.*sharing\/rest/i, ''); base.pathname = base.pathname.replace(/(?<=sharing\/rest).*/i, ''); - } else if (this.type === EsriType.SERVER) { + } else { // EsriType === SERVER this.postfix = base.pathname.replace(/.*arcgis\/rest/i, ''); base.pathname = base.pathname.replace(/(?<=arcgis\/rest).*/i, ''); } @@ -56,7 +56,7 @@ export class EsriBase { } async generateToken(): Promise { - if (!this.auth) return; + if (!this.auth) throw new Err(400, null, 'Cannot generate token without auth'); const body = new URLSearchParams(); body.append('f', 'json'); @@ -102,8 +102,11 @@ export class EsriBase { expires: parseInt(String(json.expires)), referer: this.auth.referer }; + + return this.token; } catch (err) { - throw new Err(400, err, err.message); + if (err instanceof Err) throw err; + throw new Err(400, err instanceof Error ? err : new Error(String(err)), err instanceof Error ? err.message : String(err)); } } @@ -143,12 +146,14 @@ export class EsriBase { const major = parseInt(String(json.currentVersion).split('.')[0]) if (isNaN(major)) throw new Err(400, null, 'Could not parse ESRI Server Version - non-integer - this version may not be supported'); if (major < 8) throw new Err(400, null, 'ESRI Server version is too old - Update to at least version 8.x') - } else if (this.type === EsriType.AGOL) { - // ArcGIS Online uses a . format - assume it's alawys at the bleeding edge - return json.currentVersion; } + + // ArcGIS Online (AGOL) uses a . format - assume it's always at the bleeding edge + + return json.currentVersion; } catch (err) { - throw new Err(400, err, err.message); + if (err instanceof Err) throw err; + throw new Err(400, err instanceof Error ? err : new Error(String(err)), err instanceof Error ? err.message : String(err)); } } @@ -156,7 +161,8 @@ export class EsriBase { try { base = new URL(base); } catch (err) { - throw new Err(400, null, err.message); + if (err instanceof Err) throw err; + throw new Err(400, err instanceof Error ? err : new Error(String(err)), err instanceof Error ? err.message : String(err)); } base as URL; @@ -235,7 +241,8 @@ class EsriProxyPortal { return json; } catch (err) { - throw new Err(400, err, err.message); + if (err instanceof Err) throw err; + throw new Err(400, err instanceof Error ? err : new Error(String(err)), err instanceof Error ? err.message : String(err)); } } diff --git a/api/lib/schema.ts b/api/lib/schema.ts index 88fff5896..13cffba4a 100644 --- a/api/lib/schema.ts +++ b/api/lib/schema.ts @@ -42,9 +42,9 @@ export const Basemap = pgTable('basemaps', { export const Profile = pgTable('profile', { username: text('username').primaryKey(), auth: json('auth').$type<{ - cert?: string; - key?: string; - }>().notNull().default({}), + cert: string; + key: string; + }>().notNull(), created: timestamp('created', { withTimezone: true }).notNull().default(sql`Now()`), updated: timestamp('updated', { withTimezone: true }).notNull().default(sql`Now()`), tak_callsign: text('tak_callsign').notNull().default('CloudTAK User'), @@ -111,9 +111,9 @@ export const Connection = pgTable('connections', { description: text('description').notNull().default(''), enabled: boolean('enabled').notNull().default(true), auth: json('auth').$type<{ - cert?: string; - key?: string; - }>().notNull().default({}), + cert: string; + key: string; + }>().notNull() }); export const ConnectionSink = pgTable('connection_sinks', { diff --git a/api/lib/sinks.ts b/api/lib/sinks.ts index e79f7750e..cd966a164 100644 --- a/api/lib/sinks.ts +++ b/api/lib/sinks.ts @@ -37,6 +37,8 @@ export default class Sinks extends Map { for (const sink of sinks.items) { const handler = this.get(sink.type); + if (!handler) continue; + const secrets = await handler.secrets(this.config, sink); const feat = cot.to_geojson(); diff --git a/api/lib/sprites.ts b/api/lib/sprites.ts index 82e57dffc..c93ce3098 100644 --- a/api/lib/sprites.ts +++ b/api/lib/sprites.ts @@ -10,12 +10,11 @@ type SpriteConfig = { name?: string; }; -export default async function(icons: Array>, config?: SpriteConfig) { - if (!config) config = {}; - +export default async function(icons: Array>, config: SpriteConfig = {}) { const doc = await SpriteSmith({ src: icons.map((icon) => { return new Vinyl({ + // @ts-ignore path: config.name ? icon[config.name] + '.png' : icon.path.replace(/.*?\//, ''), contents: Buffer.from(icon.data, 'base64'), }) @@ -24,6 +23,7 @@ export default async function(icons: Array>, confi const coords = {}; for (const key in doc.coordinates) { + // @ts-ignore coords[key.replace(/.png/, '')] = { ...doc.coordinates[key], pixelRatio: 1 diff --git a/api/lib/style.ts b/api/lib/style.ts index ccd38f042..4f80e4fec 100644 --- a/api/lib/style.ts +++ b/api/lib/style.ts @@ -77,7 +77,7 @@ export default class Style { return true; } catch (err) { - throw new Err(400, err, err.message); + throw new Err(400, err instanceof Error ? err : new Error(String(err)), err instanceof Error ? err.message : String(err)); } } @@ -88,6 +88,8 @@ export default class Style { * @returns GeoJSON Feature */ async feat(feature: Feature): Promise { + if (!feature.properties) feature.properties = {}; + if (this.style.stale && !feature.properties.stale) { feature.properties.stale = this.style.stale; } @@ -112,6 +114,8 @@ export default class Style { } #by_geom(style: StyleSingle, feature: Feature) { + if (!feature.properties) feature.properties = {}; + if (feature.geometry.type === 'Point' && style.point) { if (!style.point.remarks) delete style.point.remarks; if (!style.point.callsign) delete style.point.callsign; diff --git a/api/migrations/0009_modern_nico_minoru.sql b/api/migrations/0009_modern_nico_minoru.sql new file mode 100644 index 000000000..09b092bb4 --- /dev/null +++ b/api/migrations/0009_modern_nico_minoru.sql @@ -0,0 +1,2 @@ +ALTER TABLE "connections" ALTER COLUMN "auth" DROP DEFAULT;--> statement-breakpoint +ALTER TABLE "profile" ALTER COLUMN "auth" DROP DEFAULT; diff --git a/api/migrations/meta/0009_snapshot.json b/api/migrations/meta/0009_snapshot.json new file mode 100644 index 000000000..01b74a8e1 --- /dev/null +++ b/api/migrations/meta/0009_snapshot.json @@ -0,0 +1,1258 @@ +{ + "id": "c36f059c-c7a8-4e81-86a8-0b290d92979e", + "prevId": "8a605fbf-759d-4dce-9e4b-5593fb6a77a8", + "version": "5", + "dialect": "pg", + "tables": { + "basemaps": { + "name": "basemaps", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bounds": { + "name": "bounds", + "type": "GEOMETRY(POLYGON, 4326)", + "primaryKey": false, + "notNull": false + }, + "center": { + "name": "center", + "type": "GEOMETRY(POINT, 4326)", + "primaryKey": false, + "notNull": false + }, + "minzoom": { + "name": "minzoom", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "maxzoom": { + "name": "maxzoom", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 16 + }, + "format": { + "name": "format", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'png'" + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'raster'" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "connections": { + "name": "connections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "auth": { + "name": "auth", + "type": "json", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "connection_sinks": { + "name": "connection_sinks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "connection": { + "name": "connection", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "body": { + "name": "body", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'{}'::json" + }, + "logging": { + "name": "logging", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "connection_sinks_connection_connections_id_fk": { + "name": "connection_sinks_connection_connections_id_fk", + "tableFrom": "connection_sinks", + "tableTo": "connections", + "columnsFrom": [ + "connection" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "connection_tokens": { + "name": "connection_tokens", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "connection": { + "name": "connection", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + } + }, + "indexes": {}, + "foreignKeys": { + "connection_tokens_connection_connections_id_fk": { + "name": "connection_tokens_connection_connections_id_fk", + "tableFrom": "connection_tokens", + "tableTo": "connections", + "columnsFrom": [ + "connection" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "data": { + "name": "data", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "auto_transform": { + "name": "auto_transform", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "mission_sync": { + "name": "mission_sync", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "mission_groups": { + "name": "mission_groups", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": [] + }, + "assets": { + "name": "assets", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'[\"*\"]'::json" + }, + "connection": { + "name": "connection", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "data_connection_connections_id_fk": { + "name": "data_connection_connections_id_fk", + "tableFrom": "data", + "tableTo": "connections", + "columnsFrom": [ + "connection" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "icons": { + "name": "icons", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "iconset": { + "name": "iconset", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type2525b": { + "name": "type2525b", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "data": { + "name": "data", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "icons_iconset_iconsets_uid_fk": { + "name": "icons_iconset_iconsets_uid_fk", + "tableFrom": "icons", + "tableTo": "iconsets", + "columnsFrom": [ + "iconset" + ], + "columnsTo": [ + "uid" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "iconsets": { + "name": "iconsets", + "schema": "", + "columns": { + "uid": { + "name": "uid", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "version": { + "name": "version", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "default_group": { + "name": "default_group", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "default_friendly": { + "name": "default_friendly", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "default_hostile": { + "name": "default_hostile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "default_neutral": { + "name": "default_neutral", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "default_unknown": { + "name": "default_unknown", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "skip_resize": { + "name": "skip_resize", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "imports": { + "name": "imports", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'Pending'" + }, + "error": { + "name": "error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "result": { + "name": "result", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'{}'::json" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "mode": { + "name": "mode", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'Unknown'" + }, + "mode_id": { + "name": "mode_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "config": { + "name": "config", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'{}'::json" + } + }, + "indexes": {}, + "foreignKeys": { + "imports_username_profile_username_fk": { + "name": "imports_username_profile_username_fk", + "tableFrom": "imports", + "tableTo": "profile", + "columnsFrom": [ + "username" + ], + "columnsTo": [ + "username" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "layers": { + "name": "layers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "enabled_styles": { + "name": "enabled_styles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "styles": { + "name": "styles", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'{}'::json" + }, + "logging": { + "name": "logging", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "stale": { + "name": "stale", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 20000 + }, + "task": { + "name": "task", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "connection": { + "name": "connection", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "cron": { + "name": "cron", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "environment": { + "name": "environment", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'{}'::json" + }, + "memory": { + "name": "memory", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 128 + }, + "timeout": { + "name": "timeout", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 128 + }, + "data": { + "name": "data", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "schema": { + "name": "schema", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'{}'::json" + } + }, + "indexes": {}, + "foreignKeys": { + "layers_connection_connections_id_fk": { + "name": "layers_connection_connections_id_fk", + "tableFrom": "layers", + "tableTo": "connections", + "columnsFrom": [ + "connection" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "layers_data_data_id_fk": { + "name": "layers_data_data_id_fk", + "tableFrom": "layers", + "tableTo": "data", + "columnsFrom": [ + "data" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "layer_alerts": { + "name": "layer_alerts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "layer": { + "name": "layer", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "icon": { + "name": "icon", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'alert-circle'" + }, + "priority": { + "name": "priority", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'yellow'" + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'Details Unknown'" + }, + "hidden": { + "name": "hidden", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "layer_alerts_layer_layers_id_fk": { + "name": "layer_alerts_layer_layers_id_fk", + "tableFrom": "layer_alerts", + "tableTo": "layers", + "columnsFrom": [ + "layer" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "profile": { + "name": "profile", + "schema": "", + "columns": { + "username": { + "name": "username", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "auth": { + "name": "auth", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "tak_callsign": { + "name": "tak_callsign", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'CloudTAK User'" + }, + "tak_group": { + "name": "tak_group", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'Orange'" + }, + "tak_role": { + "name": "tak_role", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'Team Member'" + }, + "tak_loc": { + "name": "tak_loc", + "type": "GEOMETRY(POINT, 4326)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "profile_chats": { + "name": "profile_chats", + "schema": "", + "columns": { + "username": { + "name": "username", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "chatroom": { + "name": "chatroom", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "sender_callsign": { + "name": "sender_callsign", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "sender_uid": { + "name": "sender_uid", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "message_id": { + "name": "message_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "profile_overlays": { + "name": "profile_overlays", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "pos": { + "name": "pos", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'vector'" + }, + "opacity": { + "name": "opacity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "visible": { + "name": "visible", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "mode": { + "name": "mode", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "mode_id": { + "name": "mode_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "profile_overlays_username_profile_username_fk": { + "name": "profile_overlays_username_profile_username_fk", + "tableFrom": "profile_overlays", + "tableTo": "profile", + "columnsFrom": [ + "username" + ], + "columnsTo": [ + "username" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "profile_overlays_username_url_unique": { + "name": "profile_overlays_username_url_unique", + "nullsNotDistinct": false, + "columns": [ + "username", + "url" + ] + } + } + }, + "server": { + "name": "server", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'Default'" + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "auth": { + "name": "auth", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'{}'::json" + }, + "api": { + "name": "api", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "spatial_ref_sys": { + "name": "spatial_ref_sys", + "schema": "", + "columns": { + "srid": { + "name": "srid", + "type": "integer", + "primaryKey": true, + "notNull": true + }, + "auth_name": { + "name": "auth_name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "auth_srid": { + "name": "auth_srid", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "srtext": { + "name": "srtext", + "type": "varchar(2048)", + "primaryKey": false, + "notNull": false + }, + "proj4text": { + "name": "proj4text", + "type": "varchar(2048)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "tokens": { + "name": "tokens", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "Now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/api/migrations/meta/_journal.json b/api/migrations/meta/_journal.json index 8884f75c6..f38852ae9 100644 --- a/api/migrations/meta/_journal.json +++ b/api/migrations/meta/_journal.json @@ -64,6 +64,13 @@ "when": 1707194635538, "tag": "0008_certain_juggernaut", "breakpoints": true + }, + { + "idx": 9, + "version": "5", + "when": 1707792666051, + "tag": "0009_modern_nico_minoru", + "breakpoints": true } ] } \ No newline at end of file diff --git a/api/package-lock.json b/api/package-lock.json index 025070bcd..de552ec52 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -25,7 +25,7 @@ "@aws-sdk/lib-storage": "^3.299.0", "@humanwhocodes/momoa": "^3.0.0", "@openaddresses/batch-error": "^2.1.4", - "@openaddresses/batch-generic": "^15.0.5", + "@openaddresses/batch-generic": "^15.10.0", "@openaddresses/batch-schema": "^9.0.0", "@openaddresses/cloudfriend": "^7.0.0", "@placemarkio/check-geojson": "^0.1.12", @@ -71,6 +71,7 @@ "xml2js": "^0.6.0" }, "devDependencies": { + "@types/archiver": "^6.0.2", "@types/busboy": "^1.5.0", "@types/connect-history-api-fallback": "^1.3.5", "@types/cors": "^2.8.13", @@ -90,8 +91,8 @@ "@types/tough-cookie": "^4.0.2", "@types/ws": "^8.5.4", "@types/xml2js": "^0.4.11", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", "eslint": "^8.33.0", "nodemon": "^3.0.0", "path-to-regexp": "^6.2.1", @@ -252,25 +253,25 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/client-batch": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-batch/-/client-batch-3.509.0.tgz", - "integrity": "sha512-bSF+FtKbP/FdWItq05Wftua3zfTSX7UNjl348OgrJvFqE6JloFjQMHql+y09VA9qEeGzkkzKlTSmA5n9qGiqPw==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-batch/-/client-batch-3.511.0.tgz", + "integrity": "sha512-6vf3Y1i4ckwCNkjT8F1XKHQuyzxp7sAG13pRDMAGv9hF84Yjb4PgJ32sCjHopIg5HgqPEV0Yst8WnjpIvAJY5w==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.509.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/credential-provider-node": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-signing": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", "@smithy/fetch-http-handler": "^2.4.1", @@ -302,25 +303,25 @@ } }, "node_modules/@aws-sdk/client-cloudformation": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.509.0.tgz", - "integrity": "sha512-zv3JKJvV8804cSLD6ema0y+bU3EGKuhE+renCF77GuaukLIxxpYCfU8+DPfVRXraGthhgyI1kzf7v4PfTkFYdQ==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.511.0.tgz", + "integrity": "sha512-FR41v2xzMGXKM+QiV+3XktKuCR6VwOvhoRjbCwECIhrvOaUGdXi0XMVCD1aSFocwxDN5aa96piD7gexkXRF91A==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.509.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/credential-provider-node": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-signing": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", "@smithy/fetch-http-handler": "^2.4.1", @@ -355,30 +356,31 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.509.0.tgz", - "integrity": "sha512-qWclNb0gOA58DxvYOr+omlkMn8xvg5FoKxvnGUBifJuGf0J2TOv74Y9u2LGm1FCVJskuw1TXnfxzeHpbMJyDyw==", + "version": "3.512.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.512.0.tgz", + "integrity": "sha512-GW3xxLHGF4WIMBzeRR0F1+JDjtAdRxQc6DFO4PCRTsKqBB6D7SQ4pMnNbvPxZX+XZrFngMsRVt357jPgKyujoQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.509.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/credential-provider-node": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-signing": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", "@smithy/fetch-http-handler": "^2.4.1", "@smithy/hash-node": "^2.1.1", "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-compression": "^2.1.1", "@smithy/middleware-content-length": "^2.1.1", "@smithy/middleware-endpoint": "^2.4.1", "@smithy/middleware-retry": "^2.1.1", @@ -407,25 +409,25 @@ } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.509.0.tgz", - "integrity": "sha512-hi2lr3JBFlFZAkeEoARqblow05nZYmjBQs5XnWlIz0HAeb3iPvKP/0bjZel2A1wnSXWrtxpvAXYfeQL/IqGdRg==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.511.0.tgz", + "integrity": "sha512-MS5EiKfmEpo/y6bKBQEJZUppYrh3k/yCj67ckC+9/xzLzeT7XSRt3eM4MqNTVKt1HHWJLufuEE655hX4bJ2D+Q==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.509.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/credential-provider-node": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-signing": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", "@smithy/eventstream-serde-browser": "^2.1.1", @@ -461,25 +463,25 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.509.0.tgz", - "integrity": "sha512-9mAG7laBHpP/jFJLcNrjv/lebsYH3fTUM83rpmdeqw8nfQHAlD/xTHEJDPc5iZeD/rQl8/KENpqTvhKfOkcC/A==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.511.0.tgz", + "integrity": "sha512-1da7byPNfPS+txu+51irEzgwVU60Zjz8k0AOIyEAZcOV224TTnuSVM+FYQq0E5CniX8gLriQsDSjVhDaYunSFQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.509.0", - "@aws-sdk/middleware-endpoint-discovery": "3.502.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/credential-provider-node": "3.511.0", + "@aws-sdk/middleware-endpoint-discovery": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", "@smithy/fetch-http-handler": "^2.4.1", @@ -514,25 +516,25 @@ } }, "node_modules/@aws-sdk/client-ecr": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.509.0.tgz", - "integrity": "sha512-hn3OA5nKSaEObEYymOBgWiK8g8MUGP0FFhnfMKHVA8g1Uyi6+xcVCoLgAeTdhzxS3c0Lj1fGJO7Bqeglqv9WbQ==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.511.0.tgz", + "integrity": "sha512-VJ+QkElxOOviGJHfbqWS3B7ny62sI0+NGIMaK1rwhnOfGnYNFswqt0OBoryGC/lQXFDM1xaTCZDdZK19O3W2Uw==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.509.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/credential-provider-node": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-signing": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", "@smithy/fetch-http-handler": "^2.4.1", @@ -565,26 +567,26 @@ } }, "node_modules/@aws-sdk/client-eventbridge": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-eventbridge/-/client-eventbridge-3.509.0.tgz", - "integrity": "sha512-2Cb2dJtnUtyQsIR3yd2JEUWQ28pzxTNdOzMYuA9lbsATx524EOax2YXXYjVMSF+3gdrw4d0Kcg6D2ZKXAwyYyA==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-eventbridge/-/client-eventbridge-3.511.0.tgz", + "integrity": "sha512-admUXXSwMUYKh50bU2qJ3tePDTy3Nahbtajjb3uupir4YNN6R0ngG4/iTJRdBXrpJ3tYnln89PsZ+sWM2X4F5w==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.509.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/signature-v4-multi-region": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/credential-provider-node": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-signing": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/signature-v4-multi-region": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/fetch-http-handler": "^2.4.1", "@smithy/hash-node": "^2.1.1", @@ -615,25 +617,25 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.509.0.tgz", - "integrity": "sha512-zk5lU9A6t7eRP8PUWxpcoTNW7/OCPefUyMvct5w4f2fpZhbu9WrLBmfKzW2ay8JX/UI4LjYaP8nPuaB4ZZ/9Ig==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.511.0.tgz", + "integrity": "sha512-zJVszZcdEOit+hxqZc3sb0MsgpYfbygjKNYsWTSj4YMjZBT+bzSqi/4dE/VJPGvvchU61jJLnqafJXc6GBPVxA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.509.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/credential-provider-node": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-signing": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", "@smithy/eventstream-serde-browser": "^2.1.1", @@ -670,33 +672,33 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.509.0.tgz", - "integrity": "sha512-yeZJ1892Lj8S2zE0HerVt/ZJWaxemoEV3tzn5XDjExK6666cUajSwfmX036T51pEBwjqsTPz0ZJB1rlV7VFTIA==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.511.0.tgz", + "integrity": "sha512-IRUYev0KNKa5rQrpULE9IhJW6dhgGQWBmAJI+OyITHMu3uGvVHDqWKqnShV0IfMJWg1y37I3juFJ1KAti8jyHw==", "dependencies": { "@aws-crypto/sha1-browser": "3.0.0", "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.509.0", - "@aws-sdk/middleware-bucket-endpoint": "3.502.0", - "@aws-sdk/middleware-expect-continue": "3.502.0", - "@aws-sdk/middleware-flexible-checksums": "3.502.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-location-constraint": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-sdk-s3": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-ssec": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/signature-v4-multi-region": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/credential-provider-node": "3.511.0", + "@aws-sdk/middleware-bucket-endpoint": "3.511.0", + "@aws-sdk/middleware-expect-continue": "3.511.0", + "@aws-sdk/middleware-flexible-checksums": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-location-constraint": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-sdk-s3": "3.511.0", + "@aws-sdk/middleware-signing": "3.511.0", + "@aws-sdk/middleware-ssec": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/signature-v4-multi-region": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@aws-sdk/xml-builder": "3.496.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", @@ -738,25 +740,25 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.509.0.tgz", - "integrity": "sha512-Ym0UL/ySK9miW8ZqP36hQf27pKYBTx+QrSm6sEzhDME0kwCh1tLhOVpK0NRpMtc7BOQqb7wSFoAQdEaMdfdEJQ==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.511.0.tgz", + "integrity": "sha512-HI03pQK6EyBunogeGWAylSZU866yv5vOEr7cku8UGNUxDt5yP+xctXusdYIggl4jIRTwaqg/0IGmZDs8mXTFtg==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.509.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/credential-provider-node": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-signing": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", "@smithy/fetch-http-handler": "^2.4.1", @@ -789,25 +791,25 @@ } }, "node_modules/@aws-sdk/client-sqs": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.509.0.tgz", - "integrity": "sha512-shqlP2gs5cOokC1ZOiRoZfqFAL2u+3Ek962BMWb4F+z1oLZERdbRa2iBPqnNNTWxz569EpG8MFECfWm8vQ5DHQ==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.511.0.tgz", + "integrity": "sha512-v+MqTYxD2dNYXID/Z0A3FLDMUI6/pItw7NqrvjL4e1jsInQTAiFdE8Emkmv78lX30dPCBjIrLi+nr1QYcvw8Fg==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.509.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-sdk-sqs": "3.507.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/credential-provider-node": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-sdk-sqs": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", "@smithy/fetch-http-handler": "^2.4.1", @@ -841,22 +843,22 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.507.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.507.0.tgz", - "integrity": "sha512-pFeaKwqv4tXD6QVxWC2V4N62DUoP3bPSm/mCe2SPhaNjNsmwwA53viUHz/nwxIbs8w4vV44UQsygb0AgKm+HoQ==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.511.0.tgz", + "integrity": "sha512-v1f5ZbuZWpad+fgTOpgFyIZT3A37wdqoSPh0hl+cKRu5kPsz96xCe9+UvLx+HdN2yJ/mV0UZcMq6ysj4xAGIEg==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", "@smithy/fetch-http-handler": "^2.4.1", @@ -888,24 +890,24 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.507.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.507.0.tgz", - "integrity": "sha512-ms5CH2ImhqqCIbo5irxayByuPOlVAmSiqDVfjZKwgIziqng2bVgNZMeKcT6t0bmrcgScEAVnZwY7j/iZTIw73g==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.511.0.tgz", + "integrity": "sha512-cITRRq54eTrq7ll9li+yYnLbNHKXG2P+ovdZSDiQ6LjCYBdcD4ela30qbs87Yye9YsopdslDzBhHHtrf5oiuMw==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-signing": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-signing": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", "@smithy/fetch-http-handler": "^2.4.1", @@ -936,26 +938,26 @@ "node": ">=14.0.0" }, "peerDependencies": { - "@aws-sdk/credential-provider-node": "^3.507.0" + "@aws-sdk/credential-provider-node": "^3.511.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.507.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.507.0.tgz", - "integrity": "sha512-TOWBe0ApEh32QOib0R+irWGjd1F9wnhbGV5PcB9SakyRwvqwG5MKOfYxG7ocoDqLlaRwzZMidcy/PV8/OEVNKg==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.511.0.tgz", + "integrity": "sha512-lwVEEXK+1auEwmBuTv35m2GvbxPthi8SjNUpU4pRetZPVbGhnhCN6H7JqeMDP6GLf81Io2eySXRsmLMt7l/fjg==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.496.0", - "@aws-sdk/middleware-host-header": "3.502.0", - "@aws-sdk/middleware-logger": "3.502.0", - "@aws-sdk/middleware-recursion-detection": "3.502.0", - "@aws-sdk/middleware-user-agent": "3.502.0", - "@aws-sdk/region-config-resolver": "3.502.0", - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", - "@aws-sdk/util-user-agent-browser": "3.502.0", - "@aws-sdk/util-user-agent-node": "3.502.0", + "@aws-sdk/core": "3.511.0", + "@aws-sdk/middleware-host-header": "3.511.0", + "@aws-sdk/middleware-logger": "3.511.0", + "@aws-sdk/middleware-recursion-detection": "3.511.0", + "@aws-sdk/middleware-user-agent": "3.511.0", + "@aws-sdk/region-config-resolver": "3.511.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", + "@aws-sdk/util-user-agent-browser": "3.511.0", + "@aws-sdk/util-user-agent-node": "3.511.0", "@smithy/config-resolver": "^2.1.1", "@smithy/core": "^1.3.1", "@smithy/fetch-http-handler": "^2.4.1", @@ -988,13 +990,13 @@ "node": ">=14.0.0" }, "peerDependencies": { - "@aws-sdk/credential-provider-node": "^3.507.0" + "@aws-sdk/credential-provider-node": "^3.511.0" } }, "node_modules/@aws-sdk/core": { - "version": "3.496.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.496.0.tgz", - "integrity": "sha512-yT+ug7Cw/3eJi7x2es0+46x12+cIJm5Xv+GPWsrTFD1TKgqO/VPEgfDtHFagDNbFmjNQA65Ygc/kEdIX9ICX/A==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.511.0.tgz", + "integrity": "sha512-0gbDvQhToyLxPyr/7KP6uavrBYKh7exld2lju1Lp65U61XgEjTVP/thJmHTvH4BAKGSqeIz/rrwJ0KrC8nwBtw==", "dependencies": { "@smithy/core": "^1.3.1", "@smithy/protocol-http": "^3.1.1", @@ -1008,11 +1010,11 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.502.0.tgz", - "integrity": "sha512-KIB8Ae1Z7domMU/jU4KiIgK4tmYgvuXlhR54ehwlVHxnEoFPoPuGHFZU7oFn79jhhSLUFQ1lRYMxP0cEwb7XeQ==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.511.0.tgz", + "integrity": "sha512-4VUsnLRox8YzxnZwnFrfZM4bL5KKLhsjjjX7oiuLyzFkhauI4HFYt7rTB8YNGphpqAg/Wzw5DBZfO3Bw1iR1HA==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/property-provider": "^2.1.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -1022,11 +1024,11 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.503.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.503.1.tgz", - "integrity": "sha512-rTdlFFGoPPFMF2YjtlfRuSgKI+XsF49u7d98255hySwhsbwd3Xp+utTTPquxP+CwDxMHbDlI7NxDzFiFdsoZug==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.511.0.tgz", + "integrity": "sha512-y83Gt8GPpgMe/lMFxIq+0G2rbzLTC6lhrDocHUzqcApLD6wet8Esy2iYckSRlJgYY+qsVAzpLrSMtt85DwRPTw==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/fetch-http-handler": "^2.4.1", "@smithy/node-http-handler": "^2.3.1", "@smithy/property-provider": "^2.1.1", @@ -1041,16 +1043,16 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.507.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.507.0.tgz", - "integrity": "sha512-2CnyduoR9COgd7qH1LPYK8UggGqVs8R4ASDMB5bwGxbg9ZerlStDiHpqvJNNg1k+VlejBr++utxfmHd236XgmQ==", - "dependencies": { - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/credential-provider-env": "3.502.0", - "@aws-sdk/credential-provider-process": "3.502.0", - "@aws-sdk/credential-provider-sso": "3.507.0", - "@aws-sdk/credential-provider-web-identity": "3.507.0", - "@aws-sdk/types": "3.502.0", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.511.0.tgz", + "integrity": "sha512-AgIOCtYzm61jbTQCY/2Vf/yu7DeLG0TLZa05a3VVRN9XE4ERtEnMn7TdbxM+hS24MTX8xI0HbMcWxCBkXRIg9w==", + "dependencies": { + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/credential-provider-env": "3.511.0", + "@aws-sdk/credential-provider-process": "3.511.0", + "@aws-sdk/credential-provider-sso": "3.511.0", + "@aws-sdk/credential-provider-web-identity": "3.511.0", + "@aws-sdk/types": "3.511.0", "@smithy/credential-provider-imds": "^2.2.1", "@smithy/property-provider": "^2.1.1", "@smithy/shared-ini-file-loader": "^2.3.1", @@ -1062,17 +1064,17 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.509.0.tgz", - "integrity": "sha512-uXT8wIq1k+m0mS/pC9U1cUTIjUB7/4PgxyiYsTxYPIULtWnQXltAlcPU3QzKTJMP60sqftRYZ2jFDLAVsipQxw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.502.0", - "@aws-sdk/credential-provider-http": "3.503.1", - "@aws-sdk/credential-provider-ini": "3.507.0", - "@aws-sdk/credential-provider-process": "3.502.0", - "@aws-sdk/credential-provider-sso": "3.507.0", - "@aws-sdk/credential-provider-web-identity": "3.507.0", - "@aws-sdk/types": "3.502.0", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.511.0.tgz", + "integrity": "sha512-5JDZXsSluliJmxOF+lYYFgJdSKQfVLQyic5NxScHULTERGoEwEHMgucFGwJ9MV9FoINjNTQLfAiWlJL/kGkCEQ==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.511.0", + "@aws-sdk/credential-provider-http": "3.511.0", + "@aws-sdk/credential-provider-ini": "3.511.0", + "@aws-sdk/credential-provider-process": "3.511.0", + "@aws-sdk/credential-provider-sso": "3.511.0", + "@aws-sdk/credential-provider-web-identity": "3.511.0", + "@aws-sdk/types": "3.511.0", "@smithy/credential-provider-imds": "^2.2.1", "@smithy/property-provider": "^2.1.1", "@smithy/shared-ini-file-loader": "^2.3.1", @@ -1084,11 +1086,11 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.502.0.tgz", - "integrity": "sha512-fJJowOjQ4infYQX0E1J3xFVlmuwEYJAFk0Mo1qwafWmEthsBJs+6BR2RiWDELHKrSK35u4Pf3fu3RkYuCtmQFw==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.511.0.tgz", + "integrity": "sha512-88hLUPqcTwjSubPS+34ZfmglnKeLny8GbmZsyllk96l26PmDTAqo5RScSA8BWxL0l5pRRWGtcrFyts+oibHIuQ==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/property-provider": "^2.1.1", "@smithy/shared-ini-file-loader": "^2.3.1", "@smithy/types": "^2.9.1", @@ -1099,13 +1101,13 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.507.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.507.0.tgz", - "integrity": "sha512-6WBjou52QukFpDi4ezb19bcAx/bM8ge8qnJnRT02WVRmU6zFQ5yLD2fW1MFsbX3cwbey+wSqKd5FGE1Hukd5wQ==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.511.0.tgz", + "integrity": "sha512-aEei9UdXYEE2e0Htf28/IcuHcWk3VkUkpcg3KDR/AyzXA3i/kxmixtAgRmHOForC5CMqoJjzVPFUITNkAscyag==", "dependencies": { - "@aws-sdk/client-sso": "3.507.0", - "@aws-sdk/token-providers": "3.507.0", - "@aws-sdk/types": "3.502.0", + "@aws-sdk/client-sso": "3.511.0", + "@aws-sdk/token-providers": "3.511.0", + "@aws-sdk/types": "3.511.0", "@smithy/property-provider": "^2.1.1", "@smithy/shared-ini-file-loader": "^2.3.1", "@smithy/types": "^2.9.1", @@ -1116,12 +1118,12 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.507.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.507.0.tgz", - "integrity": "sha512-f+aGMfazBimX7S06224JRYzGTaMh1uIhfj23tZylPJ05KxTVi5IO1RoqeI/uHLJ+bDOx+JHBC04g/oCdO4kHvw==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.511.0.tgz", + "integrity": "sha512-/3XMyN7YYefAsES/sMMY5zZGRmZ5QJisJw798DdMYmYMsb1dt0Qy8kZTu+59ZzOiVIcznsjSTCEB81QmGtDKcA==", "dependencies": { - "@aws-sdk/client-sts": "3.507.0", - "@aws-sdk/types": "3.502.0", + "@aws-sdk/client-sts": "3.511.0", + "@aws-sdk/types": "3.511.0", "@smithy/property-provider": "^2.1.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -1143,11 +1145,11 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.509.0.tgz", - "integrity": "sha512-jKcQQ7qBWllD4QNY0VNm5vanCs1yWTD8QA6sSWQQUHl2TpUOyklV9ghCGhtQXbb0ppH0az0oVrFaz0z7+whlWQ==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.511.0.tgz", + "integrity": "sha512-5xURF5gR8dY+pg50Y7GYfNZdPLcIGato02HouUauqs36ScfftfCXEOSbJNNYlyImrMspRlJtefdiWPhekHILhw==", "dependencies": { - "@aws-sdk/util-dynamodb": "3.509.0", + "@aws-sdk/util-dynamodb": "3.511.0", "@smithy/smithy-client": "^2.3.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -1160,9 +1162,9 @@ } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.509.0.tgz", - "integrity": "sha512-VivrFLMmLJkf27PNY+LDO0KqH3BCeH7j5zK3l7xQgJWmPiLcBvk2UXuANZKrP7V82+/kI/AXFaXJuycedEj8yA==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.511.0.tgz", + "integrity": "sha512-inEbSyqzGxiQs8aEnkGdxw9ZDn370mRHOdE1TB/GvVe9buQVyZ2hQvOY5WBVOaIGDIxGpuUzVvr4o89XreU19w==", "dependencies": { "@smithy/abort-controller": "^2.1.1", "@smithy/middleware-endpoint": "^2.4.1", @@ -1180,11 +1182,11 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.502.0.tgz", - "integrity": "sha512-mUSP2DUcjhO5zM2b21CvZ9AqwI8DaAeZA6NYHOxWGTV9BUxHcdGWXEjDkcVj9CQ0gvNwTtw6B5L/q52rVAnZbw==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.511.0.tgz", + "integrity": "sha512-G4dAAHPUZbpDCVBaCcAOlFoctO9lcecSs0EZYrvzQc/9d4XJvNWGd1C7GSdf204VPOCPZCjNpTkdWGm25r00wA==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@aws-sdk/util-arn-parser": "3.495.0", "@smithy/node-config-provider": "^2.2.1", "@smithy/protocol-http": "^3.1.1", @@ -1197,12 +1199,12 @@ } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.502.0.tgz", - "integrity": "sha512-DQBbyelebBshYPTb5ah25sAdMTQKYBUYE0If66sXHNUQAdUg28z076kE4E8p8RxyfGHqESN2MrqfIjQpEnjcqg==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.511.0.tgz", + "integrity": "sha512-g3V25SJkOD4C0nH5V8SDifxSDSRA3g+JXue/hFYWtAt/avyOu38fmjqX6ewOuj7wENoc4KCw1CmhSu+XTNtbRA==", "dependencies": { "@aws-sdk/endpoint-cache": "3.495.0", - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/node-config-provider": "^2.2.1", "@smithy/protocol-http": "^3.1.1", "@smithy/types": "^2.9.1", @@ -1213,11 +1215,11 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.502.0.tgz", - "integrity": "sha512-DxfAuBVuPSt8as9xP57o8ks6ySVSjwO2NNNAdpLwk4KhEAPYEpHlf2yWYorYLrS+dDmwfYgOhRNoguuBdCu6ow==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.511.0.tgz", + "integrity": "sha512-zjDzrJV9PFCkEqhNLKKK+9PB1vPveVZLJbcY71V3PZFvPII1bhlgwvI1e99MhEiaiH2a9I2PnS56bGwEKuNTrw==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/protocol-http": "^3.1.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -1227,13 +1229,13 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.502.0.tgz", - "integrity": "sha512-kCt2zQDFumz/LnJJJOSd2GW4dr8oT8YMJKgxC/pph3aRXoSHXRwhrMbFnQ8swEE9vjywxtcED8sym0b0tNhhoA==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.511.0.tgz", + "integrity": "sha512-oI8zULi6VXLXJ3zA6aCdbOoceSNOxGITosB7EKDsLllzAQFV1WlzmQCtjFY8DLLYZ521atgJNcVbzjxPQnrnJA==", "dependencies": { "@aws-crypto/crc32": "3.0.0", "@aws-crypto/crc32c": "3.0.0", - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/is-array-buffer": "^2.1.1", "@smithy/protocol-http": "^3.1.1", "@smithy/types": "^2.9.1", @@ -1245,11 +1247,11 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.502.0.tgz", - "integrity": "sha512-EjnG0GTYXT/wJBmm5/mTjDcAkzU8L7wQjOzd3FTXuTCNNyvAvwrszbOj5FlarEw5XJBbQiZtBs+I5u9+zy560w==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.511.0.tgz", + "integrity": "sha512-DbBzQP/6woSHR/+g9dHN3YiYaLIqFw9u8lQFMxi3rT3hqITFVYLzzXtEaHjDD6/is56pNT84CIKbyJ6/gY5d1Q==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/protocol-http": "^3.1.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -1259,11 +1261,11 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.502.0.tgz", - "integrity": "sha512-fLRwPuTZvEWQkPjys03m3D6tYN4kf7zU6+c8mJxwvEg+yfBuv2RBsbd+Vn2bTisUjXvIg1kyBzONlpHoIyFneg==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.511.0.tgz", + "integrity": "sha512-PKHnOT3oBo41NELq3Esz3K9JuV1l9E+SrCcfr/07yU4EbqhS4UGPb22Yf5JakQu4fGbTFlAftcc8PXcE2zLr4g==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, @@ -1272,11 +1274,11 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.502.0.tgz", - "integrity": "sha512-FDyv6K4nCoHxbjLGS2H8ex8I0KDIiu4FJgVRPs140ZJy6gE5Pwxzv6YTzZGLMrnqcIs9gh065Lf6DjwMelZqaw==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.511.0.tgz", + "integrity": "sha512-EYU9dBlJXvQcCsM2Tfgi0NQoXrqovfDv/fDy8oGJgZFrgNuHDti8tdVVxeJTUJNEAF67xlDl5o+rWEkKthkYGQ==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, @@ -1285,11 +1287,11 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.502.0.tgz", - "integrity": "sha512-hvbyGJbxeuezxOu8VfFmcV4ql1hKXLxHTe5FNYfEBat2KaZXVhc1Hg+4TvB06/53p+E8J99Afmumkqbxs2esUA==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.511.0.tgz", + "integrity": "sha512-PlNPCV/6zpDVdNx1K69xDTh/wPNU4WyP4qa6hUo2/+4/PNG5HI9xbCWtpb4RjhdTRw6qDtkBNcPICHbtWx5aHg==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/protocol-http": "^3.1.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -1299,11 +1301,11 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.502.0.tgz", - "integrity": "sha512-GbGugrfyL5bNA/zw8iQll92yXBONfWSC8Ns00DtkOU1saPXp4/7WHtyyZGYdvPa73T1IsuZy9egpoYRBmRcd5Q==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.511.0.tgz", + "integrity": "sha512-SKJr8mKaqjcGpu0xxRPXZiKrJmyetDfgzvWuZ7QOgdnPa+6jk5fmEUTFoPb3VCarMkf8xo/l6cTZ5lei7Lbflw==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@aws-sdk/util-arn-parser": "3.495.0", "@smithy/node-config-provider": "^2.2.1", "@smithy/protocol-http": "^3.1.1", @@ -1318,11 +1320,11 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sqs": { - "version": "3.507.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.507.0.tgz", - "integrity": "sha512-6D4FvN7iRMmYo6r1mQ9cZVJSHzzNRaTxmXiWBv/6oS59hoS2CtjzsiMH2Ab2fyiBCtmksiLbCfwoz1E5VifZHw==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.511.0.tgz", + "integrity": "sha512-J4Pl4EN1xjCjEW+drDDI3BZUwawPW4hLZumRCc1FZ1WdML3bedFc3CQ1ij4i56WItXIo+t0VDW5w3JtbjZTgJw==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/smithy-client": "^2.3.1", "@smithy/types": "^2.9.1", "@smithy/util-hex-encoding": "^2.1.1", @@ -1334,11 +1336,11 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.502.0.tgz", - "integrity": "sha512-4hF08vSzJ7L6sB+393gOFj3s2N6nLusYS0XrMW6wYNFU10IDdbf8Z3TZ7gysDJJHEGQPmTAesPEDBsasGWcMxg==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.511.0.tgz", + "integrity": "sha512-IMijFLfm+QQHD6NNDX9k3op9dpBSlWKnqjcMU38Tytl2nbqV4gktkarOK1exHAmH7CdoYR5BufVtBzbASNSF/A==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/property-provider": "^2.1.1", "@smithy/protocol-http": "^3.1.1", "@smithy/signature-v4": "^2.1.1", @@ -1351,11 +1353,11 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.502.0.tgz", - "integrity": "sha512-1nidVTIba6/aVjjzD/WNqWdzSyTrXOHO3Ddz2MGD8S1yGSrYz4iYaq4Bm/uosfdr8B1L0Ws0pjdRXrNfzSw/DQ==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.511.0.tgz", + "integrity": "sha512-8pfgBard9pj7oWJ79R6dbXHUGr7JPP/OmAsKBYZA0r/91a1XdFUDtRYZadstjcOv/X3QbeG3QqWOtNco+XgM7Q==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, @@ -1364,12 +1366,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.502.0.tgz", - "integrity": "sha512-TxbBZbRiXPH0AUxegqiNd9aM9zNSbfjtBs5MEfcBsweeT/B2O7K1EjP9+CkB8Xmk/5FLKhAKLr19b1TNoE27rw==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.511.0.tgz", + "integrity": "sha512-eLs+CxP2QCXh3tCGYCdAml3oyWj8MSIwKbH+8rKw0k/5vmY1YJDBy526whOxx61ivhz2e0muuijN4X5EZZ2Pnw==", "dependencies": { - "@aws-sdk/types": "3.502.0", - "@aws-sdk/util-endpoints": "3.502.0", + "@aws-sdk/types": "3.511.0", + "@aws-sdk/util-endpoints": "3.511.0", "@smithy/protocol-http": "^3.1.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -1379,11 +1381,11 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.502.0.tgz", - "integrity": "sha512-mxmsX2AGgnSM+Sah7mcQCIneOsJQNiLX0COwEttuf8eO+6cLMAZvVudH3BnWTfea4/A9nuri9DLCqBvEmPrilg==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.511.0.tgz", + "integrity": "sha512-RzBLSNaRd4iEkQyEGfiSNvSnWU/x23rsiFgA9tqYFA0Vqx7YmzSWC8QBUxpwybB8HkbbL9wNVKQqTbhI3mYneQ==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/node-config-provider": "^2.2.1", "@smithy/types": "^2.9.1", "@smithy/util-config-provider": "^2.2.1", @@ -1395,12 +1397,12 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.502.0.tgz", - "integrity": "sha512-NpOXtUXH0ZAgnyI3Y3s2fPrgwbsWoNMwdoXdFZvH0eDzzX80tim7Yuy6dzVA5zrxSzOYs1xjcOhM+4CmM0QZiw==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.511.0.tgz", + "integrity": "sha512-lwbU3LX5TpYu1DHBMH2Wz+2MWGccn5G3psu1Y9WTPc+1bubVQHWf8UD2lzON5L2QirT9tQheQjTke1u5JC7FTQ==", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.502.0", - "@aws-sdk/types": "3.502.0", + "@aws-sdk/middleware-sdk-s3": "3.511.0", + "@aws-sdk/types": "3.511.0", "@smithy/protocol-http": "^3.1.1", "@smithy/signature-v4": "^2.1.1", "@smithy/types": "^2.9.1", @@ -1411,12 +1413,12 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.507.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.507.0.tgz", - "integrity": "sha512-ehOINGjoGJc6Puzon7ev4bXckkaZx18WNgMTNttYJhj3vTpj5LPSQbI/5SS927bEbpGMFz1+hJ6Ra5WGfbTcEQ==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.511.0.tgz", + "integrity": "sha512-92dXjMHBJcRoUkJHc0Bvtsz7Sal8t6VASRJ5vfs5c2ZpTVgLpVnM4dBmwUgGUdnvHov0cZTXbbadTJ/qOWx5Zw==", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.507.0", - "@aws-sdk/types": "3.502.0", + "@aws-sdk/client-sso-oidc": "3.511.0", + "@aws-sdk/types": "3.511.0", "@smithy/property-provider": "^2.1.1", "@smithy/shared-ini-file-loader": "^2.3.1", "@smithy/types": "^2.9.1", @@ -1427,9 +1429,9 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.502.0.tgz", - "integrity": "sha512-M0DSPYe/gXhwD2QHgoukaZv5oDxhW3FfvYIrJptyqUq3OnPJBcDbihHjrE0PBtfh/9kgMZT60/fQ2NVFANfa2g==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.511.0.tgz", + "integrity": "sha512-P03ufufxmkvd7nO46oOeEqYIMPJ8qMCKxAsfJk1JBVPQ1XctVntbail4/UFnrnzij8DTl4Mk/D62uGo7+RolXA==", "dependencies": { "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -1450,9 +1452,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.509.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.509.0.tgz", - "integrity": "sha512-wvlcYicawWCwvklfpTJrLn+S2oTfpOG4Q/uWvQJgv3Z3SVr5Yp3OjUvMKCRUGVu1r+thedvx6LZWecoGXfQivA==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.511.0.tgz", + "integrity": "sha512-VADCpPre14/KfXzZ45UHegeUbuefYR7AdfRrcTTjbOFBf1jTF9QUYlc+I2tYnDJ0kCBSSTjuO8XwjMAMqrtjQQ==", "dependencies": { "tslib": "^2.5.0" }, @@ -1464,11 +1466,11 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.502.0.tgz", - "integrity": "sha512-6LKFlJPp2J24r1Kpfoz5ESQn+1v5fEjDB3mtUKRdpwarhm3syu7HbKlHCF3KbcCOyahobvLvhoedT78rJFEeeg==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.511.0.tgz", + "integrity": "sha512-J/5hsscJkg2pAOdLx1YKlyMCk5lFRxRxEtup9xipzOxVBlqOIE72Tuu31fbxSlF8XzO/AuCJcZL4m1v098K9oA==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/types": "^2.9.1", "@smithy/util-endpoints": "^1.1.1", "tslib": "^2.5.0" @@ -1489,22 +1491,22 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.502.0.tgz", - "integrity": "sha512-v8gKyCs2obXoIkLETAeEQ3AM+QmhHhst9xbM1cJtKUGsRlVIak/XyyD+kVE6kmMm1cjfudHpHKABWk9apQcIZQ==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.511.0.tgz", + "integrity": "sha512-5LuESdwtIcA10aHcX7pde7aCIijcyTPBXFuXmFlDTgm/naAayQxelQDpvgbzuzGLgePf8eTyyhDKhzwPZ2EqiQ==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/types": "^2.9.1", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.502.0.tgz", - "integrity": "sha512-9RjxpkGZKbTdl96tIJvAo+vZoz4P/cQh36SBUt9xfRfW0BtsaLyvSrvlR5wyUYhvRcC12Axqh/8JtnAPq//+Vw==", + "version": "3.511.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.511.0.tgz", + "integrity": "sha512-UopdlRvYY5mxlS4wwFv+QAWL6/T302wmoQj7i+RY+c/D3Ej3PKBb/mW3r2wEOgZLJmPpeeM1SYMk+rVmsW1rqw==", "dependencies": { - "@aws-sdk/types": "3.502.0", + "@aws-sdk/types": "3.511.0", "@smithy/node-config-provider": "^2.2.1", "@smithy/types": "^2.9.1", "tslib": "^2.5.0" @@ -2482,9 +2484,9 @@ } }, "node_modules/@humanwhocodes/momoa": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-3.0.0.tgz", - "integrity": "sha512-w9ZDr0lxELbpdzQPmNpYxKHCq4IrG9ZaGFMmzvlbk4zA7+t/zSONCqrp8Tzg17vo2ZJlkL1jS87codK0W5uovQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-3.0.1.tgz", + "integrity": "sha512-Yj2GOwIDb77+A5p4oV2x27edQ7NX86+vKBGWySnfwjKesxn8JCa90Q0Z0eyBBy2G1FulTDrRtfIdmPpIOGhCmQ==", "engines": { "node": ">=18" } @@ -3061,18 +3063,15 @@ } }, "node_modules/@openaddresses/batch-generic": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/@openaddresses/batch-generic/-/batch-generic-15.9.0.tgz", - "integrity": "sha512-661Lyu4N1WSMs7kq5HP0anPSzShUVnSEktoNYH95wNZmMjTnUqRWaz8Au3m8ATScVIFLJBXlkkPZOON9rIP2SA==", + "version": "15.10.2", + "resolved": "https://registry.npmjs.org/@openaddresses/batch-generic/-/batch-generic-15.10.2.tgz", + "integrity": "sha512-UHuxxyINxPVv+STOg8q8kLafw+DrMSmEA1604xBhU6LMMd+9TVMKzQ2OTUw/5nsBQGwdyRrHAKqvj+alhKy2vQ==", "dependencies": { "@openaddresses/batch-error": "^2.1.2", "@turf/bbox": "^6.5.0", - "@types/express": "^4.17.21", - "@types/geojson": "^7946.0.13", "mkdirp": "^3.0.0", "pg-structure": "^7.15.0", "postgres": "^3.4.3", - "turbo": "^1.11.3", "wkx": "^0.5.0" }, "peerDependencies": { @@ -3465,6 +3464,25 @@ "tslib": "^2.5.0" } }, + "node_modules/@smithy/middleware-compression": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-2.1.1.tgz", + "integrity": "sha512-eLgIs2Y3YBk/xQPTyzTazhyXdnDlI0+xCBcSHbUNfpE/S0Ofd8pv/952szlJpc5soOvY00+sY3y3ROinLrhpkw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "@smithy/util-config-provider": "^2.2.1", + "@smithy/util-middleware": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "fflate": "0.8.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@smithy/middleware-content-length": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.1.1.tgz", @@ -3900,6 +3918,188 @@ "undici": "^6.0.0" } }, + "node_modules/@tak-ps/blueprint-login/node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@tak-ps/blueprint-login/node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@tak-ps/blueprint-login/node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@tak-ps/blueprint-login/node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@tak-ps/blueprint-login/node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@tak-ps/blueprint-login/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@tak-ps/blueprint-login/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@tak-ps/blueprint-login/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@tak-ps/node-cot": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@tak-ps/node-cot/-/node-cot-5.1.1.tgz", @@ -4091,6 +4291,15 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@types/archiver": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.2.tgz", + "integrity": "sha512-KmROQqbQzKGuaAbmK+ZcytkJ51+YqDa7NmbXjmtC5YBLSyQYo21YaUnQ3HbaPFKL1ooo6RQ6OPYPIDyxfpDDXw==", + "dev": true, + "dependencies": { + "@types/readdir-glob": "*" + } + }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -4279,10 +4488,19 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, + "node_modules/@types/readdir-glob": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.5.tgz", + "integrity": "sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==" + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==" }, "node_modules/@types/semver-sort": { "version": "0.0.5", @@ -4402,15 +4620,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.1.tgz", + "integrity": "sha512-OLvgeBv3vXlnnJGIAgCLYKjgMEU+wBGj07MQ/nxAaON+3mLzX7mJbhRYrVGiVvFiXtwFlkcBa/TtmglHy0UbzQ==", + "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/scope-manager": "7.0.1", + "@typescript-eslint/type-utils": "7.0.1", + "@typescript-eslint/utils": "7.0.1", + "@typescript-eslint/visitor-keys": "7.0.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -4426,8 +4645,8 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4436,14 +4655,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.0.1.tgz", + "integrity": "sha512-8GcRRZNzaHxKzBPU3tKtFNing571/GwPBeCvmAUw0yBtfE2XVd0zFKJIMSWkHJcPQi0ekxjIts6L/rrZq5cxGQ==", + "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/scope-manager": "7.0.1", + "@typescript-eslint/types": "7.0.1", + "@typescript-eslint/typescript-estree": "7.0.1", + "@typescript-eslint/visitor-keys": "7.0.1", "debug": "^4.3.4" }, "engines": { @@ -4454,7 +4674,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4463,12 +4683,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.1.tgz", + "integrity": "sha512-v7/T7As10g3bcWOOPAcbnMDuvctHzCFYCG/8R4bK4iYzdFqsZTbXGln0cZNVcwQcwewsYU2BJLay8j0/4zOk4w==", + "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@typescript-eslint/types": "7.0.1", + "@typescript-eslint/visitor-keys": "7.0.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4479,12 +4700,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.0.1.tgz", + "integrity": "sha512-YtT9UcstTG5Yqy4xtLiClm1ZpM/pWVGFnkAa90UfdkkZsR1eP2mR/1jbHeYp8Ay1l1JHPyGvoUYR6o3On5Nhmw==", + "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/typescript-estree": "7.0.1", + "@typescript-eslint/utils": "7.0.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -4496,7 +4718,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4505,9 +4727,10 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.1.tgz", + "integrity": "sha512-uJDfmirz4FHib6ENju/7cz9SdMSkeVvJDK3VcMFvf/hAShg8C74FW+06MaQPODHfDJp/z/zHfgawIJRjlu0RLg==", + "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -4517,12 +4740,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.1.tgz", + "integrity": "sha512-SO9wHb6ph0/FN5OJxH4MiPscGah5wjOd0RRpaLvuBv9g8565Fgu0uMySFEPqwPHiQU90yzJ2FjRYKGrAhS1xig==", + "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/types": "7.0.1", + "@typescript-eslint/visitor-keys": "7.0.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4544,16 +4768,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.1.tgz", + "integrity": "sha512-oe4his30JgPbnv+9Vef1h48jm0S6ft4mNwi9wj7bX10joGn07QRfqIqFHoMiajrtoU88cIhXf8ahwgrcbNLgPA==", + "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/scope-manager": "7.0.1", + "@typescript-eslint/types": "7.0.1", + "@typescript-eslint/typescript-estree": "7.0.1", "semver": "^7.5.4" }, "engines": { @@ -4564,15 +4789,16 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.1.tgz", + "integrity": "sha512-hwAgrOyk++RTXrP4KzCg7zB2U0xt7RUU0ZdMSCsqF3eKUwkdXUMyTb0qdCuji7VIbcpG62kKTU9M1J1c9UpFBw==", + "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/types": "7.0.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -5326,14 +5552,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", - "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "set-function-length": "^1.2.0" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -6056,17 +6283,19 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/define-data-property": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", - "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { + "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -6140,9 +6369,9 @@ } }, "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "engines": { "node": ">=0.3.1" } @@ -6530,6 +6759,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", @@ -7358,6 +7598,11 @@ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, + "node_modules/fflate": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.1.tgz", + "integrity": "sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -8032,11 +8277,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8115,9 +8360,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", "dependencies": { "function-bind": "^1.1.2" }, @@ -8270,11 +8515,11 @@ } }, "node_modules/indexable-array": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/indexable-array/-/indexable-array-0.7.0.tgz", - "integrity": "sha512-uHpBgsGbXSIkM5aA/RR5FKc2TMJ0lLRLz+pepiRrUVbNb8vB+9lBiRQyVNF+Houfcl5H4XZK50tUdlHHRrZpiA==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/indexable-array/-/indexable-array-0.7.4.tgz", + "integrity": "sha512-74ulqV6c2zYxBlm4KZ+EKc5eQzwKK33bYYTTCWPybEOH95UgMa8YanncpPvjW5/6kgDe71oq2tU+AhLdaHtoRw==", "dependencies": { - "lodash.set": "^4.3.2", + "dot-prop": "^6.0.1", "sorted-array-functions": "^1.2.0", "tslib": "^2.1.0" }, @@ -8282,6 +8527,28 @@ "node": ">= 12.0.0" } }, + "node_modules/indexable-array/node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/indexable-array/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, "node_modules/inflection": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", @@ -9198,11 +9465,6 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, - "node_modules/lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==" - }, "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", @@ -10503,14 +10765,14 @@ "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" }, "node_modules/pg-structure": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/pg-structure/-/pg-structure-7.15.0.tgz", - "integrity": "sha512-BBnuKV2gGZHs+2lFi4LY4fwX5sTGvMHCBk9m5klUy7zT1vGP3iK1XRXWwacgmvjynY9Lz3u224eCW5Ho9amKGQ==", + "version": "7.15.2", + "resolved": "https://registry.npmjs.org/pg-structure/-/pg-structure-7.15.2.tgz", + "integrity": "sha512-KrTzwJlRCrDS5PHgZ6qdOrY2CRZvjfw+709RA7cRpGUFl+t17M6cak584Zx4jvahY9ZMRdDF1/BVAMRgo1jwoQ==", "dependencies": { "@typescript-plus/fast-memoize-decorator": "^0.1.0", "dotenv": "^8.2.0", "fast-memoize": "^2.5.2", - "indexable-array": "^0.7.0", + "indexable-array": "^0.7.4", "inflection": "^1.12.0", "json5": "^2.1.3", "lodash.get": "^4.4.2", @@ -11066,13 +11328,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -12668,94 +12931,6 @@ "node": "*" } }, - "node_modules/turbo": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.12.3.tgz", - "integrity": "sha512-a6q8I0TK9ohACYbkmxzG/JYPuDC4VCvfmXLTlf321qQ4BIAhoyaOj/O2g+zJ6L1vNYnZ82G4LrbMfgLLngbLsg==", - "bin": { - "turbo": "bin/turbo" - }, - "optionalDependencies": { - "turbo-darwin-64": "1.12.3", - "turbo-darwin-arm64": "1.12.3", - "turbo-linux-64": "1.12.3", - "turbo-linux-arm64": "1.12.3", - "turbo-windows-64": "1.12.3", - "turbo-windows-arm64": "1.12.3" - } - }, - "node_modules/turbo-darwin-64": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.12.3.tgz", - "integrity": "sha512-dDglIaux+A4jOnB9CDH69sujmrnuLJLrKw1t3J+if6ySlFuxSwC++gDq9TVuOZo2+S7lFkGh+x5ytn3wp+jE8Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/turbo-darwin-arm64": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.12.3.tgz", - "integrity": "sha512-5TqqeujEyHMoVUWGzSzUl5ERSg7HDCdbU3gBs5ziWTpFRpeJ/+Y15kYyZJcMQcubRIH3Y1hL/yA5IhlGdgXOMA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/turbo-linux-64": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.12.3.tgz", - "integrity": "sha512-yUreU+/gq4vlBtcdyfjz7slwz4zM1RG8sSXvyHmAS+QXqSrGkegg4qLl2fRbv/c3EyA/XbfcZuD6tcrXkejr6g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/turbo-linux-arm64": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.12.3.tgz", - "integrity": "sha512-XRwAsp2eRSqZmaMVNrmHoKqofeJMuD87zmefZLTRAObh38hIwKgyl2QRsJIbteob5RN77yFbv3lAJ36UIY5h7w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/turbo-windows-64": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.12.3.tgz", - "integrity": "sha512-CPnRfnUCtmFeShOtUdMCthySjmyHaoTyh9JueiYFvtCNeO3WfDMj63dpOQstQWHdJFYmIrIGfhAclcds9ePQYA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/turbo-windows-arm64": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.12.3.tgz", - "integrity": "sha512-cYA/wlzvp4vlCNHYJ2AjNS3FLXWwUC/5CJompBkTeKFFB6AviE/iLkbIhFikCVSNXZk/3AGanpMUXIkt3bdlwg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", diff --git a/api/package.json b/api/package.json index 51a7a1880..b9805dea0 100644 --- a/api/package.json +++ b/api/package.json @@ -35,7 +35,7 @@ "@aws-sdk/lib-storage": "^3.299.0", "@humanwhocodes/momoa": "^3.0.0", "@openaddresses/batch-error": "^2.1.4", - "@openaddresses/batch-generic": "^15.0.5", + "@openaddresses/batch-generic": "^15.10.0", "@openaddresses/batch-schema": "^9.0.0", "@openaddresses/cloudfriend": "^7.0.0", "@placemarkio/check-geojson": "^0.1.12", @@ -81,6 +81,7 @@ "xml2js": "^0.6.0" }, "devDependencies": { + "@types/archiver": "^6.0.2", "@types/busboy": "^1.5.0", "@types/connect-history-api-fallback": "^1.3.5", "@types/cors": "^2.8.13", @@ -100,8 +101,8 @@ "@types/tough-cookie": "^4.0.2", "@types/ws": "^8.5.4", "@types/xml2js": "^0.4.11", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", "eslint": "^8.33.0", "nodemon": "^3.0.0", "path-to-regexp": "^6.2.1", diff --git a/api/routes/basemap.ts b/api/routes/basemap.ts index d12ccd963..e68a077c2 100644 --- a/api/routes/basemap.ts +++ b/api/routes/basemap.ts @@ -261,7 +261,8 @@ export default async function router(schema: any, config: Config) { res.status(proxy.status); for (const h of ['content-type', 'content-length', 'content-encoding']) { - if (proxy.headers.get(h)) res.append(h, proxy.headers.get(h)); + const ph = proxy.headers.get(h); + if (ph) res.append(h, ph); } diff --git a/api/routes/connection-sink.ts b/api/routes/connection-sink.ts index 54d348d04..495ca90d5 100644 --- a/api/routes/connection-sink.ts +++ b/api/routes/connection-sink.ts @@ -168,11 +168,16 @@ export default async function router(schema: any, config: Config) { const timestamps: Set = new Set(); const successMap: Map = new Map(); const failureMap: Map = new Map(); - for (const stat of stats.MetricDataResults) { - let map; - if (stat.Label === 'ConnectionSinkSuccess') map = successMap; - else if (stat.Label === 'ConnectionSinkFailure') map = failureMap; + for (const stat of stats) { + let map: Map = new Map(); + if (stat.Label === 'ConnectionSinkSuccess') { + map = successMap; + } else if (stat.Label === 'ConnectionSinkFailure') { + map = failureMap; + } + if (!stat.Timestamps) stat.Timestamps = []; + if (!stat.Values) stat.Values = []; for (let i = 0; i < stat.Timestamps.length; i++) { timestamps.add(stat.Timestamps[i]); map.set(String(stat.Timestamps[i]), Number(stat.Values[i])); diff --git a/api/routes/connection.ts b/api/routes/connection.ts index 923133e50..167ff8d30 100644 --- a/api/routes/connection.ts +++ b/api/routes/connection.ts @@ -240,11 +240,14 @@ export default async function router(schema: any, config: Config) { const timestamps: Set = new Set(); const map: Map = new Map(); - if (!stats.MetricDataResults.length) { + if (!stats.length) { return res.json({ stats: [] }); } - const stat = stats.MetricDataResults[0]; + const stat = stats[0]; + + if (!stat.Timestamps) stat.Timestamps = []; + if (!stat.Values) stat.Values = []; for (let i = 0; i < stat.Timestamps.length; i++) { timestamps.add(stat.Timestamps[i]); diff --git a/api/routes/data-asset.ts b/api/routes/data-asset.ts index 5c6a7ec8c..cc4d1cabe 100644 --- a/api/routes/data-asset.ts +++ b/api/routes/data-asset.ts @@ -14,6 +14,8 @@ import { AuthRequest } from '@tak-ps/blueprint-login'; import Config from '../lib/config.js'; import DataMission from '../lib/data-mission.js'; import { AuthResourceAccess } from '@tak-ps/blueprint-login'; +import { InferSelectModel } from 'drizzle-orm'; +import { Data } from '../lib/schema.js'; import TAKAPI, { APIAuthToken, APIAuthCertificate, @@ -120,7 +122,7 @@ export default async function router(schema: any, config: Config) { }, async (req: AuthRequest, res: Response) => { let bb; - let data; + let data: InferSelectModel; try { await Auth.is_auth(config.models, req, { resources: [ diff --git a/api/routes/esri.ts b/api/routes/esri.ts index 0cdb7cea2..a422b4ead 100644 --- a/api/routes/esri.ts +++ b/api/routes/esri.ts @@ -63,7 +63,7 @@ export default async function router(schema: any, config: Config) { try { req.body.url = new URL(req.body.url); } catch (err) { - throw new Err(400, null, err.message); + throw new Err(400, null, err instanceof Error ? err.message : String(err)); } if (req.body.sinkid) { @@ -392,10 +392,11 @@ export default async function router(schema: any, config: Config) { anyResources: true }); - if (!String(req.query.server).match(/\/\d+$/)) throw new Err(400, null, 'Could not parse layer ID'); - const url = new URL(String(req.query.server).replace(/\/\d+$/, '')); - const layer_id = parseInt(String(req.query.server).match(/\/\d+$/)[0].replace('/', '')); + + const parsed_layer = String(req.query.server).match(/\/\d+$/); + if (!parsed_layer || !parsed_layer[0]) throw new Error('Could not parse layer ID'); + const layer_id = parseInt(parsed_layer[0].replace('/', '')); const base = new EsriBase(String(url)); if (req.query.token && req.query.expires) { diff --git a/api/routes/icons.ts b/api/routes/icons.ts index b3c6d82a4..1c81e8b2d 100644 --- a/api/routes/icons.ts +++ b/api/routes/icons.ts @@ -12,9 +12,14 @@ import xml2js from 'xml2js'; import { Param } from '@openaddresses/batch-generic'; import { sql } from 'drizzle-orm'; -export default async function router(schema, config: Config) { +export type SpriteRecord = { + json: object; + image: Buffer; +} + +export default async function router(schema: any, config: Config) { // Eventually look at replacing this with memcached? - const SpriteMap = { + const SpriteMap: Record = { default: { json: JSON.parse(String(await fs.readFile(new URL('../icons/generator.json', import.meta.url)))), image: await fs.readFile(new URL('../icons/generator.png', import.meta.url)) @@ -146,6 +151,7 @@ export default async function router(schema, config: Config) { where: sql`iconset = ${String(req.params.iconset)}` })).items) { archive.append(Buffer.from(icon.data, 'base64'), { name: icon.name }); + // @ts-ignore xmljson.iconset.icon.push({ $: { name: path.parse(icon.name).base, type2525b: icon.type2525b } }) } diff --git a/api/routes/import.ts b/api/routes/import.ts index 4334ee14b..6c0cb1486 100644 --- a/api/routes/import.ts +++ b/api/routes/import.ts @@ -87,7 +87,7 @@ export default async function router(schema: any, config: Config) { limits: { files: 1 } }); - const uploads = []; + const uploads: Promise[] = []; bb.on('file', async (fieldname, file, blob) => { uploads.push((async function() { const res = { @@ -160,7 +160,7 @@ export default async function router(schema: any, config: Config) { limits: { files: 5 } }); - const uploads = []; + const uploads: Promise[] = []; bb.on('file', async (fieldname, file, blob) => { uploads.push((async function() { const res = { diff --git a/api/routes/layer.ts b/api/routes/layer.ts index ca41bbdaf..84df9656a 100644 --- a/api/routes/layer.ts +++ b/api/routes/layer.ts @@ -51,7 +51,9 @@ export default async function router(schema: any, config: Config) { const status = { healthy: 0, alarm: 0, unknown: 0 }; for (const state of alarms.values()) { - status[state]++; + if (state === 'healthy') status.healthy++; + if (state === 'alarm') status.alarm++; + if (state === 'unknown') status.unknown++; } res.json({ @@ -99,10 +101,12 @@ export default async function router(schema: any, config: Config) { Schedule.is_valid(req.body.cron); let layer = await config.models.Layer.generate(req.body); - if (!Schedule.is_aws(layer.cron) && layer.enabled) { - config.events.add(layer.id, layer.cron); - } else if (Schedule.is_aws(layer.cron) || !layer.enabled) { - await config.events.delete(layer.id); + if (config.events) { + if (layer.cron && !Schedule.is_aws(layer.cron) && layer.enabled) { + config.events.add(layer.id, layer.cron); + } else if (layer.cron && Schedule.is_aws(layer.cron) || !layer.enabled) { + await config.events.delete(layer.id); + } } try { @@ -205,6 +209,7 @@ export default async function router(schema: any, config: Config) { let changed = false; // Avoid Updating CF unless necessary as it blocks further updates until deployed for (const prop of ['cron', 'task', 'memory', 'timeout', 'enabled']) { + // @ts-ignore if (req.body[prop] !== undefined && req.body[prop] !== layer[prop]) changed = true; } @@ -228,10 +233,12 @@ export default async function router(schema: any, config: Config) { } } - if (!Schedule.is_aws(layer.cron) && layer.enabled) { - config.events.add(layer.id, layer.cron); - } else if (Schedule.is_aws(layer.cron) || !layer.enabled) { - await config.events.delete(layer.id); + if (config.events) { + if (layer.cron && !Schedule.is_aws(layer.cron) && layer.enabled) { + config.events.add(layer.id, layer.cron); + } else if (layer.cron && Schedule.is_aws(layer.cron) || !layer.enabled) { + await config.events.delete(layer.id); + } } await config.cacher.del(`layer-${req.params.layerid}`); @@ -322,7 +329,7 @@ export default async function router(schema: any, config: Config) { await CloudFormation.delete(config, layer.id); - config.events.delete(layer.id); + if (config.events) config.events.delete(layer.id); await config.models.Layer.delete(parseInt(req.params.layerid)); @@ -367,7 +374,7 @@ export default async function router(schema: any, config: Config) { try { req.body = check(req.body); } catch (err) { - throw new Err(400, null, err.message); + throw new Err(400, null, err instanceof Error ? err.message : String(err)); } for (let i = 0; i < req.body.features.length; i++) { @@ -405,6 +412,7 @@ export default async function router(schema: any, config: Config) { id: String(feat.id), layer: layer.id, type: feat.type, + // @ts-ignore properties: feat.properties, geometry: feat.geometry } diff --git a/api/routes/marti-mission.ts b/api/routes/marti-mission.ts index 82b830cb6..38e1ad3cf 100644 --- a/api/routes/marti-mission.ts +++ b/api/routes/marti-mission.ts @@ -45,7 +45,7 @@ export default async function router(schema: any, config: Config) { const auth = (await config.models.Profile.from(user.email)).auth; const api = await TAKAPI.init(new URL(String(config.server.api)), new APIAuthCertificate(auth.cert, auth.key)); - const query = {}; + const query: Record = {}; for (const q in req.query) query[q] = String(req.query[q]); const mission = await api.Mission.get(req.params.name, query); return res.json(mission); @@ -80,7 +80,7 @@ export default async function router(schema: any, config: Config) { const auth = (await config.models.Profile.from(user.email)).auth; const api = await TAKAPI.init(new URL(String(config.server.api)), new APIAuthCertificate(auth.cert, auth.key)); - const query = {}; + const query: Record = {}; for (const q in req.query) query[q] = String(req.query[q]); const mission = await api.Mission.delete(req.params.name, query); return res.json(mission); @@ -166,7 +166,7 @@ export default async function router(schema: any, config: Config) { const auth = (await config.models.Profile.from(user.email)).auth; const api = await TAKAPI.init(new URL(String(config.server.api)), new APIAuthCertificate(auth.cert, auth.key)); - const query = {}; + const query: Record = {}; for (const q in req.query) query[q] = String(req.query[q]); const missions = await api.Mission.list(query); return res.json(missions); diff --git a/api/routes/marti.ts b/api/routes/marti.ts index 3db79424a..242fd9008 100644 --- a/api/routes/marti.ts +++ b/api/routes/marti.ts @@ -44,7 +44,7 @@ export default async function router(schema: any, config: Config) { api = await TAKAPI.init(new URL(String(config.server.api)), new APIAuthCertificate(profile.auth.cert, profile.auth.key)); } - const query = {}; + const query: Record = {}; for (const q in req.query) query[q] = String(req.query[q]); const groups = await api.Group.list(query); @@ -99,7 +99,7 @@ export default async function router(schema: any, config: Config) { api = await TAKAPI.init(new URL(String(config.server.api)), new APIAuthCertificate(profile.auth.cert, profile.auth.key)); } - const query = {}; + const query: Record = {}; for (const q in req.query) query[q] = String(req.query[q]); await api.Group.update(req.body, {}); diff --git a/api/routes/server.ts b/api/routes/server.ts index d7f3e797d..5a551515e 100644 --- a/api/routes/server.ts +++ b/api/routes/server.ts @@ -17,7 +17,7 @@ export default async function router(schema: any, config: Config) { try { await Auth.is_auth(config.models, req); - if (!config.server) { + if (!config.server.auth) { return res.json({ status: 'unconfigured' }); @@ -33,32 +33,6 @@ export default async function router(schema: any, config: Config) { } }); - await schema.post('/server', { - name: 'Post Server', - group: 'Server', - auth: 'user', - description: 'Post Server', - body: 'req.body.Server.json', - res: 'res.Server.json' - }, async (req: AuthRequest, res: Response) => { - try { - await Auth.is_auth(config.models, req); - - if (config.server) throw new Err(400, null, 'Cannot post to an existing server'); - - config.server = await config.models.Server.generate(req.body); - await config.conns.refresh(config.server); - - return res.json({ - status: 'configured', - ...config.server, - auth: config.server.auth.cert && config.server.auth.key - }); - } catch (err) { - return Err.respond(err, res); - } - }); - await schema.patch('/server', { name: 'Patch Server', group: 'Server', @@ -77,7 +51,7 @@ export default async function router(schema: any, config: Config) { updated: sql`Now()`, }); - await config.conns.refresh(config.server); + await config.conns.refresh(); return res.json({ status: 'configured', diff --git a/api/routes/task.ts b/api/routes/task.ts index 5ec88531e..3fafd6da0 100644 --- a/api/routes/task.ts +++ b/api/routes/task.ts @@ -27,8 +27,8 @@ export default async function router(schema: any, config: Config) { let total: number = 0; const tasks = new Map(); - for (const image of images.imageIds) { - const match = image.imageTag.match(/^(.*)-v([0-9]+\.[0-9]+\.[0-9]+)$/); + for (const image of (images.imageIds || [])) { + const match = String(image.imageTag).match(/^(.*)-v([0-9]+\.[0-9]+\.[0-9]+)$/); if (!match) continue; total++; if (!tasks.has(match[1])) tasks.set(match[1], []); @@ -66,8 +66,8 @@ export default async function router(schema: any, config: Config) { let total: number = 0; const tasks = new Map(); - for (const image of images.imageIds) { - const match = image.imageTag.match(/^(.*)-v([0-9]+\.[0-9]+\.[0-9]+)$/); + for (const image of (images.imageIds || [])) { + const match = String(image.imageTag).match(/^(.*)-v([0-9]+\.[0-9]+\.[0-9]+)$/); if (!match) continue; total++; if (!tasks.has(match[1])) tasks.set(match[1], []); diff --git a/api/test/fixtures/get_schema.json b/api/test/fixtures/get_schema.json index 4ac732d52..7401dc2dc 100644 --- a/api/test/fixtures/get_schema.json +++ b/api/test/fixtures/get_schema.json @@ -19,12 +19,12 @@ "query": false, "res": true }, - "PUT /basemap": { + "GET /connection/:connectionid/channel": { "body": false, "query": false, "res": true }, - "GET /connection/:connectionid/channel": { + "PUT /basemap": { "body": false, "query": false, "res": true @@ -64,17 +64,17 @@ "query": true, "res": true }, - "POST /connection/:connectionid/token": { + "POST /connection/:connectionid/sink": { "body": true, "query": false, "res": true }, - "POST /basemap": { + "POST /connection/:connectionid/token": { "body": true, "query": false, "res": true }, - "POST /connection/:connectionid/sink": { + "POST /basemap": { "body": true, "query": false, "res": true @@ -139,17 +139,12 @@ "query": false, "res": true }, - "POST /connection": { - "body": true, - "query": false, - "res": true - }, "POST /connection/:connectionid/data/:dataid/asset/:asset.:ext": { "body": false, "query": false, "res": true }, - "PATCH /connection/:connectionid/token/:id": { + "POST /connection": { "body": true, "query": false, "res": true @@ -169,16 +164,16 @@ "query": false, "res": false }, + "PATCH /connection/:connectionid/token/:id": { + "body": true, + "query": false, + "res": true + }, "GET /data": { "body": false, "query": true, "res": true }, - "PATCH /basemap/:basemapid": { - "body": true, - "query": false, - "res": true - }, "PATCH /connection/:connectionid/sink/:sinkid": { "body": true, "query": false, @@ -189,6 +184,11 @@ "query": false, "res": true }, + "PATCH /basemap/:basemapid": { + "body": true, + "query": false, + "res": true + }, "GET /data/:dataid": { "body": false, "query": false, @@ -244,14 +244,14 @@ "query": false, "res": true }, - "DELETE /basemap/:basemapid": { + "GET /connection/:connectionid/data": { "body": false, - "query": false, + "query": true, "res": true }, - "GET /connection/:connectionid/data": { + "DELETE /basemap/:basemapid": { "body": false, - "query": true, + "query": false, "res": true }, "GET /layer/:layerid/query": { @@ -319,12 +319,17 @@ "query": false, "res": true }, + "GET /marti/missions/:name": { + "body": false, + "query": true, + "res": true + }, "PATCH /import/:import": { "body": true, "query": false, "res": true }, - "GET /marti/missions/:name": { + "GET /marti/group": { "body": false, "query": true, "res": true @@ -334,11 +339,6 @@ "query": false, "res": true }, - "GET /marti/group": { - "body": false, - "query": true, - "res": true - }, "GET /layer": { "body": false, "query": true, @@ -354,23 +354,23 @@ "query": false, "res": true }, - "DELETE /layer/:layerid/alert/:alertid": { - "body": false, - "query": false, - "res": true - }, "PUT /marti/group": { "body": true, "query": true, "res": true }, + "DELETE /layer/:layerid/alert/:alertid": { + "body": false, + "query": false, + "res": true + }, "POST /marti/missions/:name": { "body": false, "query": true, "res": true }, - "PATCH /connection/:connectionid/data/:dataid": { - "body": true, + "GET /profile/chat": { + "body": false, "query": false, "res": true }, @@ -379,8 +379,8 @@ "query": false, "res": true }, - "GET /profile/chat": { - "body": false, + "PATCH /connection/:connectionid/data/:dataid": { + "body": true, "query": false, "res": true }, @@ -424,14 +424,14 @@ "query": false, "res": true }, - "GET /import": { + "POST /profile/asset/:asset.:ext": { "body": false, - "query": true, + "query": false, "res": true }, - "POST /profile/asset/:asset.:ext": { + "GET /import": { "body": false, - "query": false, + "query": true, "res": true }, "POST /layer": { @@ -444,13 +444,13 @@ "query": false, "res": true }, - "DELETE /marti/missions/:name/upload/:hash": { - "body": false, + "PATCH /iconset/:iconset": { + "body": true, "query": false, "res": true }, - "PATCH /iconset/:iconset": { - "body": true, + "DELETE /marti/missions/:name/upload/:hash": { + "body": false, "query": false, "res": true }, @@ -519,23 +519,23 @@ "query": false, "res": true }, - "POST /profile/overlay": { + "PATCH /profile": { "body": true, "query": false, "res": true }, - "POST /server": { + "POST /profile/overlay": { "body": true, "query": false, "res": true }, - "PATCH /profile": { - "body": true, + "GET /layer/:layerid/task": { + "body": false, "query": false, "res": true }, - "GET /layer/:layerid/task": { - "body": false, + "PATCH /server": { + "body": true, "query": false, "res": true }, @@ -564,12 +564,12 @@ "query": false, "res": true }, - "GET /layer/:layerid/task/logs": { + "DELETE /iconset/:iconset": { "body": false, "query": false, "res": true }, - "DELETE /iconset/:iconset": { + "GET /layer/:layerid/task/logs": { "body": false, "query": false, "res": true @@ -579,11 +579,6 @@ "query": false, "res": true }, - "PATCH /server": { - "body": true, - "query": false, - "res": true - }, "DELETE /layer/:layerid": { "body": false, "query": false, @@ -594,13 +589,13 @@ "query": true, "res": true }, - "POST /token": { - "body": true, + "POST /layer/:layerid/task": { + "body": false, "query": false, "res": true }, - "POST /layer/:layerid/task": { - "body": false, + "POST /token": { + "body": true, "query": false, "res": true }, diff --git a/api/test/flight.ts b/api/test/flight.ts index 6aa7b217d..2de740389 100644 --- a/api/test/flight.ts +++ b/api/test/flight.ts @@ -226,6 +226,7 @@ export default class Flight { unsafe: true, noevents: true, nosinks: true, + nocache: true, nometrics: true, local: true }); diff --git a/api/web/package-lock.json b/api/web/package-lock.json index 66c6e4bac..bef48d1e5 100644 --- a/api/web/package-lock.json +++ b/api/web/package-lock.json @@ -1068,9 +1068,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", - "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.10.0.tgz", + "integrity": "sha512-/MeDQmcD96nVoRumKUljsYOLqfv1YFJps+0pTrb2Z9Nl/w5qNUysMaWQsrd1mvAlNT4yza1iVyIu4Q4AgF6V3A==", "cpu": [ "arm" ], @@ -1081,9 +1081,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", - "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.10.0.tgz", + "integrity": "sha512-lvu0jK97mZDJdpZKDnZI93I0Om8lSDaiPx3OiCk0RXn3E8CMPJNS/wxjAvSJJzhhZpfjXsjLWL8LnS6qET4VNQ==", "cpu": [ "arm64" ], @@ -1094,9 +1094,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", - "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.10.0.tgz", + "integrity": "sha512-uFpayx8I8tyOvDkD7X6n0PriDRWxcqEjqgtlxnUA/G9oS93ur9aZ8c8BEpzFmsed1TH5WZNG5IONB8IiW90TQg==", "cpu": [ "arm64" ], @@ -1107,9 +1107,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", - "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.10.0.tgz", + "integrity": "sha512-nIdCX03qFKoR/MwQegQBK+qZoSpO3LESurVAC6s6jazLA1Mpmgzo3Nj3H1vydXp/JM29bkCiuF7tDuToj4+U9Q==", "cpu": [ "x64" ], @@ -1120,9 +1120,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", - "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.10.0.tgz", + "integrity": "sha512-Fz7a+y5sYhYZMQFRkOyCs4PLhICAnxRX/GnWYReaAoruUzuRtcf+Qnw+T0CoAWbHCuz2gBUwmWnUgQ67fb3FYw==", "cpu": [ "arm" ], @@ -1133,9 +1133,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", - "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.10.0.tgz", + "integrity": "sha512-yPtF9jIix88orwfTi0lJiqINnlWo6p93MtZEoaehZnmCzEmLL0eqjA3eGVeyQhMtxdV+Mlsgfwhh0+M/k1/V7Q==", "cpu": [ "arm64" ], @@ -1146,9 +1146,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", - "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.10.0.tgz", + "integrity": "sha512-9GW9yA30ib+vfFiwjX+N7PnjTnCMiUffhWj4vkG4ukYv1kJ4T9gHNg8zw+ChsOccM27G9yXrEtMScf1LaCuoWQ==", "cpu": [ "arm64" ], @@ -1159,9 +1159,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", - "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.10.0.tgz", + "integrity": "sha512-X1ES+V4bMq2ws5fF4zHornxebNxMXye0ZZjUrzOrf7UMx1d6wMQtfcchZ8SqUnQPPHdOyOLW6fTcUiFgHFadRA==", "cpu": [ "riscv64" ], @@ -1172,9 +1172,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", - "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.10.0.tgz", + "integrity": "sha512-w/5OpT2EnI/Xvypw4FIhV34jmNqU5PZjZue2l2Y3ty1Ootm3SqhI+AmfhlUYGBTd9JnpneZCDnt3uNOiOBkMyw==", "cpu": [ "x64" ], @@ -1185,9 +1185,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", - "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.10.0.tgz", + "integrity": "sha512-q/meftEe3QlwQiGYxD9rWwB21DoKQ9Q8wA40of/of6yGHhZuGfZO0c3WYkN9dNlopHlNT3mf5BPsUSxoPuVQaw==", "cpu": [ "x64" ], @@ -1198,9 +1198,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", - "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.10.0.tgz", + "integrity": "sha512-NrR6667wlUfP0BHaEIKgYM/2va+Oj+RjZSASbBMnszM9k+1AmliRjHc3lJIiOehtSSjqYiO7R6KLNrWOX+YNSQ==", "cpu": [ "arm64" ], @@ -1211,9 +1211,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", - "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.10.0.tgz", + "integrity": "sha512-FV0Tpt84LPYDduIDcXvEC7HKtyXxdvhdAOvOeWMWbQNulxViH2O07QXkT/FffX4FqEI02jEbCJbr+YcuKdyyMg==", "cpu": [ "ia32" ], @@ -1224,9 +1224,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", - "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.10.0.tgz", + "integrity": "sha512-OZoJd+o5TaTSQeFFQ6WjFCiltiYVjIdsXxwu/XZ8qRpsvMQr4UsVrE5UyT9RIvsnuF47DqkJKhhVZ2Q9YW9IpQ==", "cpu": [ "x64" ], @@ -1893,9 +1893,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001585", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz", - "integrity": "sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==", + "version": "1.0.30001587", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", + "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==", "dev": true, "funding": [ { @@ -2099,9 +2099,9 @@ "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" }, "node_modules/electron-to-chromium": { - "version": "1.4.665", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.665.tgz", - "integrity": "sha512-UpyCWObBoD+nSZgOC2ToaIdZB0r9GhqT2WahPKiSki6ckkSuKhQNso8V2PrFcHBMleI/eqbKgVQgVC4Wni4ilw==", + "version": "1.4.667", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.667.tgz", + "integrity": "sha512-66L3pLlWhTNVUhnmSA5+qDM3fwnXsM6KAqE36e2w4KN0g6pkEtlT5bs41FQtQwVwKnfhNBXiWRLPs30HSxd7Kw==", "dev": true, "peer": true }, @@ -3598,9 +3598,9 @@ } }, "node_modules/rollup": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", - "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.10.0.tgz", + "integrity": "sha512-t2v9G2AKxcQ8yrG+WGxctBes1AomT0M4ND7jTFBCVPXQ/WFTvNSefIrNSmLKhIKBrvN8SG+CZslimJcT3W2u2g==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -3613,19 +3613,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", + "@rollup/rollup-android-arm-eabi": "4.10.0", + "@rollup/rollup-android-arm64": "4.10.0", + "@rollup/rollup-darwin-arm64": "4.10.0", + "@rollup/rollup-darwin-x64": "4.10.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.10.0", + "@rollup/rollup-linux-arm64-gnu": "4.10.0", + "@rollup/rollup-linux-arm64-musl": "4.10.0", + "@rollup/rollup-linux-riscv64-gnu": "4.10.0", + "@rollup/rollup-linux-x64-gnu": "4.10.0", + "@rollup/rollup-linux-x64-musl": "4.10.0", + "@rollup/rollup-win32-arm64-msvc": "4.10.0", + "@rollup/rollup-win32-ia32-msvc": "4.10.0", + "@rollup/rollup-win32-x64-msvc": "4.10.0", "fsevents": "~2.3.2" } }, @@ -4005,9 +4005,9 @@ } }, "node_modules/terra-draw": { - "version": "0.0.1-alpha.56", - "resolved": "https://registry.npmjs.org/terra-draw/-/terra-draw-0.0.1-alpha.56.tgz", - "integrity": "sha512-Da4JxKEciaS+V/HtN0JEHw/hC2P9dQ2S5NYWebi1pvbVU9dHbxdaMgaSnOrB3IhS/0hYEA0MeKUEo2BdCDZ0fg==" + "version": "0.0.1-alpha.57", + "resolved": "https://registry.npmjs.org/terra-draw/-/terra-draw-0.0.1-alpha.57.tgz", + "integrity": "sha512-CBQKC/u+csZSyMn18Edmy6HTZ4NaoL788NJ0z6L0kQ8iw5t0LZfgClG+CTPElacjIIs+vyOeYE1NlsqOTjvjrQ==" }, "node_modules/text-table": { "version": "0.2.0", @@ -4357,9 +4357,9 @@ } }, "node_modules/vue3-apexcharts": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/vue3-apexcharts/-/vue3-apexcharts-1.4.4.tgz", - "integrity": "sha512-TH89uZrxGjaDvkaYAISvj8+k6Bf1rUKFillc8oJirs5XZEPiwM1ELKZQ786wz0rfPqkSHHny2lqqUCK7Rw+LcQ==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/vue3-apexcharts/-/vue3-apexcharts-1.5.2.tgz", + "integrity": "sha512-rGbgUJDjtsyjfRF0uzwDjzt8+M7ICSRAbm1N9KCDiczW8BSpbEZuaEsJDJYnJuLFIIVXIGilYzIcjNBf6NbeYA==", "peerDependencies": { "apexcharts": "> 3.0.0", "vue": "> 3.0.0"