diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..a84b912 --- /dev/null +++ b/backend/.env.example @@ -0,0 +1,4 @@ +JWKS_URI=https://your-auth0-domain/.well-known/jwks.json +AUDIENCE=your-api-audience +TOKEN_ISSUER=https://your-auth0-domain/ +DYNAMODB_TASKS_TABLE=your-dynamodb-table-name \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore index d3b2aaf..da4aa12 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -1,4 +1,45 @@ +# Logs +logs +*.log +npm-debug.log* + +# Visual Studio Code +.vscode + +tmp + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git node_modules -.serverless + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + +# project files that contain sensitive data .env -.env.local \ No newline at end of file +event.json +policyDocument.json +*.zip \ No newline at end of file diff --git a/backend/.serverless/cloudformation-template-update-stack.json b/backend/.serverless/cloudformation-template-update-stack.json new file mode 100644 index 0000000..8075b80 --- /dev/null +++ b/backend/.serverless/cloudformation-template-update-stack.json @@ -0,0 +1,2029 @@ +{ + "AWSTemplateFormatVersion": "2010-09-09", + "Description": "The AWS CloudFormation template for this Serverless application", + "Resources": { + "CreateTaskLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-createTask" + } + }, + "GetTaskLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-getTask" + } + }, + "UpdateTaskLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-updateTask" + } + }, + "DeleteTaskLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-deleteTask" + } + }, + "ManageTimerLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-manageTimer" + } + }, + "UpdatePreferencesLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-updatePreferences" + } + }, + "GetMusicLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-getMusic" + } + }, + "UpdateBackgroundLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-updateBackground" + } + }, + "Auth0AuthorizerLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-auth0Authorizer" + } + }, + "IamRoleLambdaExecution": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Service": [ + "lambda.amazonaws.com" + ] + }, + "Action": [ + "sts:AssumeRole" + ] + } + ] + }, + "Policies": [ + { + "PolicyName": { + "Fn::Join": [ + "-", + [ + "backend", + "dev", + "lambda" + ] + ] + }, + "PolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "logs:CreateLogStream", + "logs:CreateLogGroup", + "logs:TagResource" + ], + "Resource": [ + { + "Fn::Sub": "arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/backend-dev*:*" + } + ] + }, + { + "Effect": "Allow", + "Action": [ + "logs:PutLogEvents" + ], + "Resource": [ + { + "Fn::Sub": "arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/backend-dev*:*:*" + } + ] + }, + { + "Effect": "Allow", + "Action": [ + "dynamodb:Query", + "dynamodb:Scan", + "dynamodb:GetItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem" + ], + "Resource": [ + "arn:aws:dynamodb:us-east-1:274552760074:table/dev-focusflow-tasks", + "arn:aws:dynamodb:us-east-1:274552760074:table/dev-focusflow-users" + ] + }, + { + "Effect": "Allow", + "Action": [ + "s3:PutObject", + "s3:GetObject", + "s3:DeleteObject" + ], + "Resource": "arn:aws:cloudformation:us-east-1:274552760074:stack/backend-dev/80499180-a60f-11ef-b8d5-124d3fdcb0b3" + }, + { + "Effect": "Allow", + "Action": [ + "cognito-idp:SignUp" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "lambda:InvokeFunction" + ], + "Resource": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-auth0Authenticator" + }, + { + "Effect": "Allow", + "Action": [ + "sts:AssumeRole" + ] + } + ] + } + } + ], + "Path": "/", + "RoleName": { + "Fn::Join": [ + "-", + [ + "backend", + "dev", + { + "Ref": "AWS::Region" + }, + "lambdaRole" + ] + ] + } + } + }, + "CreateTaskLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/task/createTask.createTask", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-createTask", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "CreateTaskLogGroup" + ] + }, + "GetTaskLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/task/getTask.getTasks", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-getTask", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "GetTaskLogGroup" + ] + }, + "UpdateTaskLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/task/updateTask.updateTask", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-updateTask", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "UpdateTaskLogGroup" + ] + }, + "DeleteTaskLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/task/deleteTask.deleteTask", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-deleteTask", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "DeleteTaskLogGroup" + ] + }, + "ManageTimerLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/timer/manageTimer.manageTimer", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-manageTimer", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "ManageTimerLogGroup" + ] + }, + "UpdatePreferencesLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/preferences/updatePreferences.updatePreferences", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-updatePreferences", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "UpdatePreferencesLogGroup" + ] + }, + "GetMusicLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/music/getMusic.getMusic", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-getMusic", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "GetMusicLogGroup" + ] + }, + "UpdateBackgroundLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/background/updateBackground.updateBackground", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-updateBackground", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "UpdateBackgroundLogGroup" + ] + }, + "Auth0AuthorizerLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/auth/index.handler", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-auth0Authorizer", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "Auth0AuthorizerLogGroup" + ] + }, + "CreateTaskLambdaVersionk30cu9y50e5sOq8XtrIxMTWLhghYgNRK8RgZoEYIGYw": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "CreateTaskLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "GetTaskLambdaVersiongXM56yZkGsQlnDb6WDCtOEDbduxrzUj1n6drT1Ds": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "GetTaskLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "UpdateTaskLambdaVersionLVQNXG4ycaaTjNA87jUZHr5KUky8EK3SL1Nnqxf8": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "UpdateTaskLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "DeleteTaskLambdaVersionbIxEVCZEfnNfNmF7C6APqdnRa2qGfa8uJbDu8LgXW0": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "DeleteTaskLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "ManageTimerLambdaVersionC6S83E8qe3dWiTU9VbMMgG77ou962v41HGAoSgzghOg": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "ManageTimerLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "UpdatePreferencesLambdaVersioni5HctCd5bCmzGE75DP4AXMDIxXfWqWLY5HnJgMGU": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "UpdatePreferencesLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "GetMusicLambdaVersionAGbhi19HVk79KS2hVYQLrY4HuhO4As6VfyVaUlrk": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "GetMusicLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "UpdateBackgroundLambdaVersiongFcVopCo5kYCSelYvEKVfGn4pxaLVIjYrPviLUTM": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "UpdateBackgroundLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "Auth0AuthorizerLambdaVersionUMEDyDFlyLIyWSsK6xWjoOLLkQNiEtvaBzHSTree2Xw": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "Auth0AuthorizerLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "ApiGatewayRestApi": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "Name": "dev-backend", + "EndpointConfiguration": { + "Types": [ + "EDGE" + ] + }, + "Policy": "" + } + }, + "ApiGatewayResourceTasks": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "ApiGatewayRestApi", + "RootResourceId" + ] + }, + "PathPart": "tasks", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourceTasksTaskidVar": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Ref": "ApiGatewayResourceTasks" + }, + "PathPart": "{taskId}", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourceTimer": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "ApiGatewayRestApi", + "RootResourceId" + ] + }, + "PathPart": "timer", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourcePreferences": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "ApiGatewayRestApi", + "RootResourceId" + ] + }, + "PathPart": "preferences", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourceMusic": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "ApiGatewayRestApi", + "RootResourceId" + ] + }, + "PathPart": "music", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourceBackgrounds": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "ApiGatewayRestApi", + "RootResourceId" + ] + }, + "PathPart": "backgrounds", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourceAuth": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "ApiGatewayRestApi", + "RootResourceId" + ] + }, + "PathPart": "auth", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourceAuthValidate": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Ref": "ApiGatewayResourceAuth" + }, + "PathPart": "validate", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodTasksOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Credentials": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'http://localhost:5173'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Requested-With,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,POST'", + "method.response.header.Access-Control-Allow-Credentials": "'true'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourceTasks" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodTasksTaskidVarOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'http://localhost:5173'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Requested-With,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,DELETE,PUT'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourceTasksTaskidVar" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodTimerOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Requested-With,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,POST'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourceTimer" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodPreferencesOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Requested-With,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,PUT'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourcePreferences" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodMusicOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Requested-With,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourceMusic" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodBackgroundsOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Requested-With,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,PUT'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourceBackgrounds" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodAuthValidateOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent,X-Amzn-Trace-Id'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,POST'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourceAuthValidate" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodTasksPost": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "POST", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceTasks" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "CreateTaskLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodTasksGet": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "GET", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceTasks" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "GetTaskLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodTasksTaskidVarPut": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "PUT", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceTasksTaskidVar" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "UpdateTaskLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodTasksTaskidVarDelete": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "DELETE", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceTasksTaskidVar" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "DeleteTaskLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodTimerPost": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "POST", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceTimer" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "ManageTimerLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodPreferencesPut": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "PUT", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourcePreferences" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "UpdatePreferencesLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodMusicGet": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "GET", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceMusic" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "GetMusicLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "GetMusicLambdaPermissionApiGateway" + ] + }, + "ApiGatewayMethodBackgroundsPut": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "PUT", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceBackgrounds" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "UpdateBackgroundLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodAuthValidatePost": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "POST", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceAuthValidate" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "Auth0AuthorizerLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerLambdaPermissionApiGateway" + ] + }, + "Auth0AuthorizerApiGatewayAuthorizer": { + "Type": "AWS::ApiGateway::Authorizer", + "Properties": { + "AuthorizerResultTtlInSeconds": 300, + "IdentitySource": "method.request.header.Authorization", + "Name": "auth0Authorizer", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "AuthorizerUri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "Auth0AuthorizerLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + }, + "Type": "REQUEST" + } + }, + "ApiGatewayDeployment1732392175738": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "StageName": "dev" + }, + "DependsOn": [ + "ApiGatewayMethodTasksOptions", + "ApiGatewayMethodTasksTaskidVarOptions", + "ApiGatewayMethodTimerOptions", + "ApiGatewayMethodPreferencesOptions", + "ApiGatewayMethodMusicOptions", + "ApiGatewayMethodBackgroundsOptions", + "ApiGatewayMethodAuthValidateOptions", + "ApiGatewayMethodTasksPost", + "ApiGatewayMethodTasksGet", + "ApiGatewayMethodTasksTaskidVarPut", + "ApiGatewayMethodTasksTaskidVarDelete", + "ApiGatewayMethodTimerPost", + "ApiGatewayMethodPreferencesPut", + "ApiGatewayMethodMusicGet", + "ApiGatewayMethodBackgroundsPut", + "ApiGatewayMethodAuthValidatePost" + ] + }, + "CreateTaskLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "CreateTaskLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "Auth0AuthorizerLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "Auth0AuthorizerLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "GetTaskLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "GetTaskLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "UpdateTaskLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "UpdateTaskLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "DeleteTaskLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "DeleteTaskLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "ManageTimerLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "ManageTimerLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "UpdatePreferencesLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "UpdatePreferencesLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "GetMusicLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "GetMusicLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "UpdateBackgroundLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "UpdateBackgroundLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "TasksTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-tasks", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + }, + { + "AttributeName": "taskId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + }, + { + "AttributeName": "taskId", + "KeyType": "RANGE" + } + ] + } + }, + "UsersTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-users", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + } + ] + } + }, + "AssetsBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "dev-focusflow-assets", + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*" + ], + "AllowedMethods": [ + "GET", + "PUT", + "POST", + "DELETE", + "HEAD" + ], + "AllowedOrigins": [ + "*" + ], + "MaxAge": 3000 + } + ] + } + } + } + }, + "Outputs": { + "ServerlessDeploymentBucketName": { + "Value": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "Export": { + "Name": "sls-backend-dev-ServerlessDeploymentBucketName" + } + }, + "CreateTaskLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "CreateTaskLambdaVersionk30cu9y50e5sOq8XtrIxMTWLhghYgNRK8RgZoEYIGYw" + }, + "Export": { + "Name": "sls-backend-dev-CreateTaskLambdaFunctionQualifiedArn" + } + }, + "GetTaskLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "GetTaskLambdaVersiongXM56yZkGsQlnDb6WDCtOEDbduxrzUj1n6drT1Ds" + }, + "Export": { + "Name": "sls-backend-dev-GetTaskLambdaFunctionQualifiedArn" + } + }, + "UpdateTaskLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "UpdateTaskLambdaVersionLVQNXG4ycaaTjNA87jUZHr5KUky8EK3SL1Nnqxf8" + }, + "Export": { + "Name": "sls-backend-dev-UpdateTaskLambdaFunctionQualifiedArn" + } + }, + "DeleteTaskLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "DeleteTaskLambdaVersionbIxEVCZEfnNfNmF7C6APqdnRa2qGfa8uJbDu8LgXW0" + }, + "Export": { + "Name": "sls-backend-dev-DeleteTaskLambdaFunctionQualifiedArn" + } + }, + "ManageTimerLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "ManageTimerLambdaVersionC6S83E8qe3dWiTU9VbMMgG77ou962v41HGAoSgzghOg" + }, + "Export": { + "Name": "sls-backend-dev-ManageTimerLambdaFunctionQualifiedArn" + } + }, + "UpdatePreferencesLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "UpdatePreferencesLambdaVersioni5HctCd5bCmzGE75DP4AXMDIxXfWqWLY5HnJgMGU" + }, + "Export": { + "Name": "sls-backend-dev-UpdatePreferencesLambdaFunctionQualifiedArn" + } + }, + "GetMusicLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "GetMusicLambdaVersionAGbhi19HVk79KS2hVYQLrY4HuhO4As6VfyVaUlrk" + }, + "Export": { + "Name": "sls-backend-dev-GetMusicLambdaFunctionQualifiedArn" + } + }, + "UpdateBackgroundLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "UpdateBackgroundLambdaVersiongFcVopCo5kYCSelYvEKVfGn4pxaLVIjYrPviLUTM" + }, + "Export": { + "Name": "sls-backend-dev-UpdateBackgroundLambdaFunctionQualifiedArn" + } + }, + "Auth0AuthorizerLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "Auth0AuthorizerLambdaVersionUMEDyDFlyLIyWSsK6xWjoOLLkQNiEtvaBzHSTree2Xw" + }, + "Export": { + "Name": "sls-backend-dev-Auth0AuthorizerLambdaFunctionQualifiedArn" + } + }, + "ServiceEndpoint": { + "Description": "URL of the service endpoint", + "Value": { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "ApiGatewayRestApi" + }, + ".execute-api.", + { + "Ref": "AWS::Region" + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/dev" + ] + ] + }, + "Export": { + "Name": "sls-backend-dev-ServiceEndpoint" + } + } + } +} \ No newline at end of file diff --git a/backend/.serverless/meta.json b/backend/.serverless/meta.json new file mode 100644 index 0000000..148b5ef --- /dev/null +++ b/backend/.serverless/meta.json @@ -0,0 +1,1897 @@ +{ + "D:\\Projects\\Portfolio_Projects\\focusflow\\FocusFlow\\backend": { + "versionSfCore": null, + "versionFramework": "4.4.11", + "isWithinCompose": false, + "isCompose": false, + "composeOrgName": null, + "composeResolverProviders": { + "default-aws-credential-resolver": "", + "self": { + "instance": { + "credentials": "", + "serviceConfigFile": { + "org": "devquesting", + "app": "focusflow", + "service": "backend", + "plugins": [ + "serverless-offline" + ], + "provider": { + "name": "aws", + "runtime": "nodejs20.x", + "region": "us-east-1", + "stage": "dev", + "environment": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + }, + "iam": { + "role": { + "statements": [ + { + "Effect": "Allow", + "Action": [ + "dynamodb:PutItem", + "dynamodb:GetItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:Scan", + "dynamodb:Query" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "s3:PutObject", + "s3:GetObject", + "s3:DeleteObject" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "cognito-idp:SignUp" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "lambda:InvokeFunction" + ], + "Resource": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-auth0Authenticator" + }, + { + "Effect": "Allow", + "Action": [ + "sts:AssumeRole" + ] + } + ] + } + }, + "cors": { + "allowedOrigins": [ + "http://localhost:5173" + ], + "allowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "OPTIONS" + ], + "allowedHeaders": [ + "Authorization", + "Content-Type", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": "" + }, + "versionFunctions": true, + "AwshttpApi": null + }, + "custom": { + "tableName": "dev-focusflow-tasks", + "usersTableName": "dev-focusflow-users", + "bucketName": "dev-focusflow-assets" + }, + "resources": { + "Resources": { + "TasksTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-tasks", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + }, + { + "AttributeName": "taskId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + }, + { + "AttributeName": "taskId", + "KeyType": "RANGE" + } + ] + } + }, + "UsersTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-users", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + } + ] + } + }, + "AssetsBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "dev-focusflow-assets", + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*" + ], + "AllowedMethods": [ + "GET", + "PUT", + "POST", + "DELETE", + "HEAD" + ], + "AllowedOrigins": [ + "*" + ], + "MaxAge": 3000 + } + ] + } + } + } + } + }, + "functions": { + "createTask": { + "handler": "src/handlers/task/createTask.createTask", + "events": [ + { + "http": { + "path": "tasks", + "method": "post", + "cors": { + "origin": "http://localhost:5173", + "allowCredentials": "", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-createTask" + }, + "getTask": { + "handler": "src/handlers/task/getTask.getTasks", + "events": [ + { + "http": { + "path": "tasks", + "method": "get", + "cors": { + "origin": "http://localhost:5173", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + }, + "allowCredentials": "" + } + } + ], + "name": "backend-dev-getTask" + }, + "updateTask": { + "handler": "src/handlers/task/updateTask.updateTask", + "events": [ + { + "http": { + "path": "tasks/{taskId}", + "method": "put", + "cors": { + "origin": "http://localhost:5173", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + }, + "allowCredentials": "" + } + } + ], + "name": "backend-dev-updateTask" + }, + "deleteTask": { + "handler": "src/handlers/task/deleteTask.deleteTask", + "events": [ + { + "http": { + "path": "tasks/{taskId}", + "method": "delete", + "cors": { + "origin": "http://localhost:5173", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + }, + "allowCredentials": "" + } + } + ], + "name": "backend-dev-deleteTask" + }, + "manageTimer": { + "handler": "src/handlers/timer/manageTimer.manageTimer", + "events": [ + { + "http": { + "path": "timer", + "method": "post", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-manageTimer" + }, + "updatePreferences": { + "handler": "src/handlers/preferences/updatePreferences.updatePreferences", + "events": [ + { + "http": { + "path": "preferences", + "method": "put", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-updatePreferences" + }, + "getMusic": { + "handler": "src/handlers/music/getMusic.getMusic", + "events": [ + { + "http": { + "path": "music", + "method": "get", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + } + } + } + ], + "name": "backend-dev-getMusic" + }, + "updateBackground": { + "handler": "src/handlers/background/updateBackground.updateBackground", + "events": [ + { + "http": { + "path": "backgrounds", + "method": "put", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-updateBackground" + }, + "auth0Authorizer": { + "handler": "src/handlers/auth/index.handler", + "events": [ + { + "http": { + "path": "auth/validate", + "method": "post", + "cors": true + } + } + ], + "name": "backend-dev-auth0Authorizer" + } + } + }, + "configFileDirPath": "D:\\Projects\\Portfolio_Projects\\focusflow\\FocusFlow\\backend", + "config": { + "type": "self" + }, + "options": {}, + "stage": "dev", + "dashboard": { + "aws": { + "accessKeyId": "", + "secretAccessKey": "", + "sessionToken": "", + "$source": { + "CREDENTIALS_CODE": "" + } + }, + "params": null, + "accessKey": "" + }, + "logger": { + "namespace": "s:core:resolver:self", + "prefix": null, + "prefixColor": null + }, + "_credentialsPromise": "" + }, + "resolvers": {} + }, + "aws": { + "instance": { + "credentials": "", + "serviceConfigFile": { + "org": "devquesting", + "app": "focusflow", + "service": "backend", + "plugins": [ + "serverless-offline" + ], + "provider": { + "name": "aws", + "runtime": "nodejs20.x", + "region": "us-east-1", + "stage": "dev", + "environment": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + }, + "iam": { + "role": { + "statements": [ + { + "Effect": "Allow", + "Action": [ + "dynamodb:PutItem", + "dynamodb:GetItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:Scan", + "dynamodb:Query" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "s3:PutObject", + "s3:GetObject", + "s3:DeleteObject" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "cognito-idp:SignUp" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "lambda:InvokeFunction" + ], + "Resource": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-auth0Authenticator" + }, + { + "Effect": "Allow", + "Action": [ + "sts:AssumeRole" + ] + } + ] + } + }, + "cors": { + "allowedOrigins": [ + "http://localhost:5173" + ], + "allowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "OPTIONS" + ], + "allowedHeaders": [ + "Authorization", + "Content-Type", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": "" + }, + "versionFunctions": true, + "AwshttpApi": null + }, + "custom": { + "tableName": "dev-focusflow-tasks", + "usersTableName": "dev-focusflow-users", + "bucketName": "dev-focusflow-assets" + }, + "resources": { + "Resources": { + "TasksTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-tasks", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + }, + { + "AttributeName": "taskId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + }, + { + "AttributeName": "taskId", + "KeyType": "RANGE" + } + ] + } + }, + "UsersTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-users", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + } + ] + } + }, + "AssetsBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "dev-focusflow-assets", + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*" + ], + "AllowedMethods": [ + "GET", + "PUT", + "POST", + "DELETE", + "HEAD" + ], + "AllowedOrigins": [ + "*" + ], + "MaxAge": 3000 + } + ] + } + } + } + } + }, + "functions": { + "createTask": { + "handler": "src/handlers/task/createTask.createTask", + "events": [ + { + "http": { + "path": "tasks", + "method": "post", + "cors": { + "origin": "http://localhost:5173", + "allowCredentials": "", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-createTask" + }, + "getTask": { + "handler": "src/handlers/task/getTask.getTasks", + "events": [ + { + "http": { + "path": "tasks", + "method": "get", + "cors": { + "origin": "http://localhost:5173", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + }, + "allowCredentials": "" + } + } + ], + "name": "backend-dev-getTask" + }, + "updateTask": { + "handler": "src/handlers/task/updateTask.updateTask", + "events": [ + { + "http": { + "path": "tasks/{taskId}", + "method": "put", + "cors": { + "origin": "http://localhost:5173", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + }, + "allowCredentials": "" + } + } + ], + "name": "backend-dev-updateTask" + }, + "deleteTask": { + "handler": "src/handlers/task/deleteTask.deleteTask", + "events": [ + { + "http": { + "path": "tasks/{taskId}", + "method": "delete", + "cors": { + "origin": "http://localhost:5173", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + }, + "allowCredentials": "" + } + } + ], + "name": "backend-dev-deleteTask" + }, + "manageTimer": { + "handler": "src/handlers/timer/manageTimer.manageTimer", + "events": [ + { + "http": { + "path": "timer", + "method": "post", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-manageTimer" + }, + "updatePreferences": { + "handler": "src/handlers/preferences/updatePreferences.updatePreferences", + "events": [ + { + "http": { + "path": "preferences", + "method": "put", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-updatePreferences" + }, + "getMusic": { + "handler": "src/handlers/music/getMusic.getMusic", + "events": [ + { + "http": { + "path": "music", + "method": "get", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + } + } + } + ], + "name": "backend-dev-getMusic" + }, + "updateBackground": { + "handler": "src/handlers/background/updateBackground.updateBackground", + "events": [ + { + "http": { + "path": "backgrounds", + "method": "put", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-updateBackground" + }, + "auth0Authorizer": { + "handler": "src/handlers/auth/index.handler", + "events": [ + { + "http": { + "path": "auth/validate", + "method": "post", + "cors": true + } + } + ], + "name": "backend-dev-auth0Authorizer" + } + } + }, + "configFileDirPath": "D:\\Projects\\Portfolio_Projects\\focusflow\\FocusFlow\\backend", + "config": { + "type": "aws" + }, + "options": {}, + "stage": "dev", + "dashboard": { + "aws": { + "accessKeyId": "", + "secretAccessKey": "", + "sessionToken": "", + "$source": { + "CREDENTIALS_CODE": "" + } + }, + "params": null, + "accessKey": "" + }, + "logger": { + "namespace": "s:core:resolver:aws", + "prefix": null, + "prefixColor": null + }, + "_credentialsPromise": "", + "isDefaultConfig": true + }, + "resolvers": {} + }, + "sls": { + "instance": { + "credentials": "", + "serviceConfigFile": { + "org": "devquesting", + "app": "focusflow", + "service": "backend", + "plugins": [ + "serverless-offline" + ], + "provider": { + "name": "aws", + "runtime": "nodejs20.x", + "region": "us-east-1", + "stage": "dev", + "environment": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + }, + "iam": { + "role": { + "statements": [ + { + "Effect": "Allow", + "Action": [ + "dynamodb:PutItem", + "dynamodb:GetItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:Scan", + "dynamodb:Query" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "s3:PutObject", + "s3:GetObject", + "s3:DeleteObject" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "cognito-idp:SignUp" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "lambda:InvokeFunction" + ], + "Resource": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-auth0Authenticator" + }, + { + "Effect": "Allow", + "Action": [ + "sts:AssumeRole" + ] + } + ] + } + }, + "cors": { + "allowedOrigins": [ + "http://localhost:5173" + ], + "allowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "OPTIONS" + ], + "allowedHeaders": [ + "Authorization", + "Content-Type", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": "" + }, + "versionFunctions": true, + "AwshttpApi": null + }, + "custom": { + "tableName": "dev-focusflow-tasks", + "usersTableName": "dev-focusflow-users", + "bucketName": "dev-focusflow-assets" + }, + "resources": { + "Resources": { + "TasksTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-tasks", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + }, + { + "AttributeName": "taskId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + }, + { + "AttributeName": "taskId", + "KeyType": "RANGE" + } + ] + } + }, + "UsersTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-users", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + } + ] + } + }, + "AssetsBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "dev-focusflow-assets", + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*" + ], + "AllowedMethods": [ + "GET", + "PUT", + "POST", + "DELETE", + "HEAD" + ], + "AllowedOrigins": [ + "*" + ], + "MaxAge": 3000 + } + ] + } + } + } + } + }, + "functions": { + "createTask": { + "handler": "src/handlers/task/createTask.createTask", + "events": [ + { + "http": { + "path": "tasks", + "method": "post", + "cors": { + "origin": "http://localhost:5173", + "allowCredentials": "", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-createTask" + }, + "getTask": { + "handler": "src/handlers/task/getTask.getTasks", + "events": [ + { + "http": { + "path": "tasks", + "method": "get", + "cors": { + "origin": "http://localhost:5173", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + }, + "allowCredentials": "" + } + } + ], + "name": "backend-dev-getTask" + }, + "updateTask": { + "handler": "src/handlers/task/updateTask.updateTask", + "events": [ + { + "http": { + "path": "tasks/{taskId}", + "method": "put", + "cors": { + "origin": "http://localhost:5173", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + }, + "allowCredentials": "" + } + } + ], + "name": "backend-dev-updateTask" + }, + "deleteTask": { + "handler": "src/handlers/task/deleteTask.deleteTask", + "events": [ + { + "http": { + "path": "tasks/{taskId}", + "method": "delete", + "cors": { + "origin": "http://localhost:5173", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + }, + "allowCredentials": "" + } + } + ], + "name": "backend-dev-deleteTask" + }, + "manageTimer": { + "handler": "src/handlers/timer/manageTimer.manageTimer", + "events": [ + { + "http": { + "path": "timer", + "method": "post", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-manageTimer" + }, + "updatePreferences": { + "handler": "src/handlers/preferences/updatePreferences.updatePreferences", + "events": [ + { + "http": { + "path": "preferences", + "method": "put", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-updatePreferences" + }, + "getMusic": { + "handler": "src/handlers/music/getMusic.getMusic", + "events": [ + { + "http": { + "path": "music", + "method": "get", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + } + } + } + ], + "name": "backend-dev-getMusic" + }, + "updateBackground": { + "handler": "src/handlers/background/updateBackground.updateBackground", + "events": [ + { + "http": { + "path": "backgrounds", + "method": "put", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-updateBackground" + }, + "auth0Authorizer": { + "handler": "src/handlers/auth/index.handler", + "events": [ + { + "http": { + "path": "auth/validate", + "method": "post", + "cors": true + } + } + ], + "name": "backend-dev-auth0Authorizer" + } + } + }, + "configFileDirPath": "D:\\Projects\\Portfolio_Projects\\focusflow\\FocusFlow\\backend", + "config": { + "type": "sls" + }, + "options": {}, + "stage": "dev", + "dashboard": { + "aws": { + "accessKeyId": "", + "secretAccessKey": "", + "sessionToken": "", + "$source": { + "CREDENTIALS_CODE": "" + } + }, + "params": null, + "accessKey": "" + }, + "logger": { + "namespace": "s:core:resolver:sls", + "prefix": null, + "prefixColor": null + }, + "_credentialsPromise": "" + }, + "resolvers": {} + } + }, + "composeServiceName": null, + "servicePath": "D:\\Projects\\Portfolio_Projects\\focusflow\\FocusFlow\\backend", + "serviceConfigFileName": "serverless.yml", + "service": { + "org": "devquesting", + "app": "focusflow", + "service": "backend", + "plugins": [ + "serverless-offline" + ], + "provider": { + "name": "aws", + "runtime": "nodejs20.x", + "region": "us-east-1", + "stage": "dev", + "environment": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + }, + "iam": { + "role": { + "statements": [ + { + "Effect": "Allow", + "Action": [ + "dynamodb:PutItem", + "dynamodb:GetItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:Scan", + "dynamodb:Query" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "s3:PutObject", + "s3:GetObject", + "s3:DeleteObject" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "cognito-idp:SignUp" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "lambda:InvokeFunction" + ], + "Resource": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-auth0Authenticator" + }, + { + "Effect": "Allow", + "Action": [ + "sts:AssumeRole" + ] + } + ] + } + }, + "cors": { + "allowedOrigins": [ + "http://localhost:5173" + ], + "allowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "OPTIONS" + ], + "allowedHeaders": [ + "Authorization", + "Content-Type", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": "" + }, + "versionFunctions": true, + "AwshttpApi": null + }, + "custom": { + "tableName": "dev-focusflow-tasks", + "usersTableName": "dev-focusflow-users", + "bucketName": "dev-focusflow-assets" + }, + "resources": { + "Resources": { + "TasksTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-tasks", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + }, + { + "AttributeName": "taskId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + }, + { + "AttributeName": "taskId", + "KeyType": "RANGE" + } + ] + } + }, + "UsersTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-users", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + } + ] + } + }, + "AssetsBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "dev-focusflow-assets", + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*" + ], + "AllowedMethods": [ + "GET", + "PUT", + "POST", + "DELETE", + "HEAD" + ], + "AllowedOrigins": [ + "*" + ], + "MaxAge": 3000 + } + ] + } + } + } + } + }, + "functions": { + "createTask": { + "handler": "src/handlers/task/createTask.createTask", + "events": [ + { + "http": { + "path": "tasks", + "method": "post", + "cors": { + "origin": "http://localhost:5173", + "allowCredentials": "", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-createTask" + }, + "getTask": { + "handler": "src/handlers/task/getTask.getTasks", + "events": [ + { + "http": { + "path": "tasks", + "method": "get", + "cors": { + "origin": "http://localhost:5173", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + }, + "allowCredentials": "" + } + } + ], + "name": "backend-dev-getTask" + }, + "updateTask": { + "handler": "src/handlers/task/updateTask.updateTask", + "events": [ + { + "http": { + "path": "tasks/{taskId}", + "method": "put", + "cors": { + "origin": "http://localhost:5173", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + }, + "allowCredentials": "" + } + } + ], + "name": "backend-dev-updateTask" + }, + "deleteTask": { + "handler": "src/handlers/task/deleteTask.deleteTask", + "events": [ + { + "http": { + "path": "tasks/{taskId}", + "method": "delete", + "cors": { + "origin": "http://localhost:5173", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + }, + "allowCredentials": "" + } + } + ], + "name": "backend-dev-deleteTask" + }, + "manageTimer": { + "handler": "src/handlers/timer/manageTimer.manageTimer", + "events": [ + { + "http": { + "path": "timer", + "method": "post", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-manageTimer" + }, + "updatePreferences": { + "handler": "src/handlers/preferences/updatePreferences.updatePreferences", + "events": [ + { + "http": { + "path": "preferences", + "method": "put", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-updatePreferences" + }, + "getMusic": { + "handler": "src/handlers/music/getMusic.getMusic", + "events": [ + { + "http": { + "path": "music", + "method": "get", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + } + } + } + ], + "name": "backend-dev-getMusic" + }, + "updateBackground": { + "handler": "src/handlers/background/updateBackground.updateBackground", + "events": [ + { + "http": { + "path": "backgrounds", + "method": "put", + "cors": { + "origin": "*", + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ] + }, + "authorizer": { + "type": "REQUEST", + "identitySource": "method.request.header.Authorization", + "name": "auth0Authorizer" + } + } + } + ], + "name": "backend-dev-updateBackground" + }, + "auth0Authorizer": { + "handler": "src/handlers/auth/index.handler", + "events": [ + { + "http": { + "path": "auth/validate", + "method": "post", + "cors": true + } + } + ], + "name": "backend-dev-auth0Authorizer" + } + } + }, + "serviceRawFile": "# FocusFlow Serverless Configuration\n\norg: devquesting\napp: focusflow\nservice: backend\n\nplugins:\n - serverless-offline\n\nprovider:\n name: aws\n runtime: nodejs20.x\n region: us-east-1\n stage: dev\n environment:\n AUTH0_DOMAIN: dev-6zeb418i7xs8g1lc.us.auth0.com\n AUTH0_AUDIENCE: focusflow-audience\n AUTH0_ISSUER: https://dev-6zeb418i7xs8g1lc.us.auth0.com/\n DYNAMODB_TASKS_TABLE: dev-focusflow-tasks\n DYNAMODB_USERS_TABLE: dev-focusflow-users\n S3_ASSETS_BUCKET: dev-focusflow-assets \n iam:\n role:\n statements:\n - Effect: Allow\n Action:\n - dynamodb:PutItem\n - dynamodb:GetItem\n - dynamodb:UpdateItem\n - dynamodb:DeleteItem\n - dynamodb:Scan\n - dynamodb:Query\n Resource: \"*\"\n - Effect: Allow\n Action:\n - s3:PutObject\n - s3:GetObject\n - s3:DeleteObject\n Resource: \"*\"\n - Effect: Allow\n Action:\n - cognito-idp:SignUp\n Resource: \"*\"\n - Effect: Allow\n Action:\n - lambda:InvokeFunction\n Resource:\n - arn:aws:lambda:${self:provider.region}:${aws:accountId}:function:${self:service}-${self:provider.stage}-auth0Authenticator\n - Effect: Allow\n Action:\n - sts:AssumeRole\n AwshttpApi:\n cors:\n allowedOrigins:\n - http://localhost:5173\n allowedMethods:\n - GET\n - POST\n - PUT\n - DELETE\n - OPTIONS\n allowedHeaders:\n - Authorization\n - Content-Type\n - X-Amz-Date\n - X-Api-Key\n - X-Amz-Security-Token\n - X-Amz-User-Agent\n allowCredentials: true\n\ncustom:\n tableName: ${sls:stage}-focusflow-tasks\n usersTableName: ${sls:stage}-focusflow-users\n bucketName: ${sls:stage}-focusflow-assets\n\nresources:\n Resources:\n # DynamoDB Table for Tasks\n TasksTable:\n Type: AWS::DynamoDB::Table\n Properties:\n TableName: ${self:custom.tableName}\n BillingMode: PAY_PER_REQUEST\n AttributeDefinitions:\n - AttributeName: userId\n AttributeType: S\n - AttributeName: taskId\n AttributeType: S\n KeySchema:\n - AttributeName: userId\n KeyType: HASH\n - AttributeName: taskId\n KeyType: RANGE\n\n # DynamoDB Table for Users\n UsersTable:\n Type: AWS::DynamoDB::Table\n Properties:\n TableName: ${self:custom.usersTableName}\n BillingMode: PAY_PER_REQUEST\n AttributeDefinitions:\n - AttributeName: userId\n AttributeType: S\n KeySchema:\n - AttributeName: userId\n KeyType: HASH\n\n # S3 Bucket for Assets\n AssetsBucket:\n Type: AWS::S3::Bucket\n Properties:\n BucketName: ${self:custom.bucketName}\n CorsConfiguration:\n CorsRules:\n - AllowedHeaders: [\"*\"]\n AllowedMethods: [GET, PUT, POST, DELETE, HEAD]\n AllowedOrigins: [\"*\"]\n MaxAge: 3000\n\nfunctions:\n # Task Management\n createTask:\n handler: src/handlers/task/createTask.createTask\n events:\n - http:\n path: tasks\n method: post\n cors:\n origin: \"http://localhost:5173\"\n allowCredentials: true\n headers:\n - Content-Type\n - Authorization\n - X-Requested-With\n - X-Amz-Date\n - X-Api-Key\n - X-Amz-Security-Token\n - X-Amz-User-Agent\n authorizer:\n type: REQUEST\n identitySource: method.request.header.Authorization\n name: auth0Authorizer\n getTask:\n handler: src/handlers/task/getTask.getTasks\n events:\n - http:\n path: tasks\n method: get\n cors:\n origin: \"http://localhost:5173\" # Use '*' for all origins or specify 'http://localhost:5173' for development\n headers:\n - Content-Type\n - Authorization\n - X-Requested-With\n - X-Amz-Date\n - X-Api-Key\n - X-Amz-Security-Token\n - X-Amz-User-Agent\n authorizer:\n type: REQUEST\n identitySource: method.request.header.Authorization\n name: auth0Authorizer\n allowCredentials: true\n updateTask:\n handler: src/handlers/task/updateTask.updateTask\n events:\n - http:\n path: tasks/{taskId}\n method: put\n cors:\n origin: \"http://localhost:5173\" # Use '*' for all origins or specify 'http://localhost:5173' for development\n headers:\n - Content-Type\n - Authorization\n - X-Requested-With\n - X-Amz-Date\n - X-Api-Key\n - X-Amz-Security-Token\n - X-Amz-User-Agent\n authorizer:\n type: REQUEST\n identitySource: method.request.header.Authorization\n name: auth0Authorizer\n allowCredentials: true\n deleteTask:\n handler: src/handlers/task/deleteTask.deleteTask\n events:\n - http:\n path: tasks/{taskId}\n method: delete\n cors:\n origin: \"http://localhost:5173\" # Use '*' for all origins or specify 'http://localhost:5173' for development\n headers:\n - Content-Type\n - Authorization\n - X-Requested-With\n - X-Amz-Date\n - X-Api-Key\n - X-Amz-Security-Token\n - X-Amz-User-Agent\n authorizer:\n type: REQUEST\n identitySource: method.request.header.Authorization\n name: auth0Authorizer\n allowCredentials: true\n # Pomodoro Timer\n manageTimer:\n handler: src/handlers/timer/manageTimer.manageTimer\n events:\n - http:\n path: timer\n method: post\n cors:\n origin: \"*\" # Use '*' for all origins or specify 'http://localhost:5173' for development\n headers:\n - Content-Type\n - Authorization\n - X-Requested-With\n - X-Amz-Date\n - X-Api-Key\n - X-Amz-Security-Token\n - X-Amz-User-Agent\n authorizer:\n type: REQUEST\n identitySource: method.request.header.Authorization\n name: auth0Authorizer\n\n # User Preferences\n updatePreferences:\n handler: src/handlers/preferences/updatePreferences.updatePreferences\n events:\n - http:\n path: preferences\n method: put\n cors:\n origin: \"*\" # Use '*' for all origins or specify 'http://localhost:5173' for development\n headers:\n - Content-Type\n - Authorization\n - X-Requested-With\n - X-Amz-Date\n - X-Api-Key\n - X-Amz-Security-Token\n - X-Amz-User-Agent\n authorizer:\n type: REQUEST\n identitySource: method.request.header.Authorization\n name: auth0Authorizer\n\n # Music Player\n getMusic:\n handler: src/handlers/music/getMusic.getMusic\n events:\n - http:\n path: music\n method: get\n cors:\n origin: \"*\" # Use '*' for all origins or specify 'http://localhost:5173' for development\n headers:\n - Content-Type\n - Authorization\n - X-Requested-With\n - X-Amz-Date\n - X-Api-Key\n - X-Amz-Security-Token\n - X-Amz-User-Agent\n\n # Background Management\n updateBackground:\n handler: src/handlers/background/updateBackground.updateBackground\n events:\n - http:\n path: backgrounds\n method: put\n cors:\n origin: \"*\" # Use '*' for all origins or specify 'http://localhost:5173' for development\n headers:\n - Content-Type\n - Authorization\n - X-Requested-With\n - X-Amz-Date\n - X-Api-Key\n - X-Amz-Security-Token\n - X-Amz-User-Agent\n authorizer:\n type: REQUEST\n identitySource: method.request.header.Authorization\n name: auth0Authorizer\n\n auth0Authorizer:\n handler: src/handlers/auth/index.handler\n events:\n - http:\n path: auth/validate\n method: post\n cors: true\n", + "command": [ + "print" + ], + "options": {}, + "error": null, + "params": {}, + "machineId": "6fcc864d3669b1e7a19c8b076386e97f", + "stage": "dev", + "accessKeyV2": "", + "accessKeyV1": "", + "orgId": "a00e51c8-04d8-4141-a358-fe9649ff9764", + "orgName": "devquesting", + "userId": "4g9dD64cGTjcqpfG9h", + "dashboard": { + "isEnabledForService": true, + "requiredAuthentication": false, + "orgFeaturesInUse": { + "providers": true, + "monitoring": false + }, + "orgObservabilityIntegrations": null, + "serviceAppId": "p5lvl4hDnczWh3Vp91", + "serviceProvider": { + "accessKeyId": "", + "secretAccessKey": "", + "sessionToken": "", + "$source": { + "CREDENTIALS_CODE": "" + } + }, + "instanceParameters": null + }, + "userName": "devquesting", + "subscription": null, + "userEmail": "dev.dav.kup@gmail.com", + "serviceProviderAwsRegion": "us-east-1", + "serviceProviderAwsCredentials": "", + "serviceProviderAwsAccountId": "274552760074", + "projectType": "traditional", + "versionSf": "4.4.11", + "serviceProviderAwsCfStackName": "backend-dev", + "integrations": {}, + "serviceUniqueId": "arn:aws:cloudformation:us-east-1:274552760074:stack/backend-dev/80499180-a60f-11ef-b8d5-124d3fdcb0b3", + "serviceProviderAwsCfStackId": "arn:aws:cloudformation:us-east-1:274552760074:stack/backend-dev/80499180-a60f-11ef-b8d5-124d3fdcb0b3", + "serviceProviderAwsCfStackCreated": "2024-11-19T00:44:57.988Z", + "serviceProviderAwsCfStackUpdated": "2024-11-23T20:03:51.449Z", + "serviceProviderAwsCfStackStatus": "UPDATE_ROLLBACK_COMPLETE", + "serviceProviderAwsCfStackOutputs": [ + { + "OutputKey": "ManageTimerLambdaFunctionQualifiedArn", + "OutputValue": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-manageTimer:11", + "Description": "Current Lambda function version", + "ExportName": "sls-backend-dev-ManageTimerLambdaFunctionQualifiedArn" + }, + { + "OutputKey": "GetTasksLambdaFunctionQualifiedArn", + "OutputValue": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-getTasks:11", + "Description": "Current Lambda function version", + "ExportName": "sls-backend-dev-GetTasksLambdaFunctionQualifiedArn" + }, + { + "OutputKey": "DeleteTaskLambdaFunctionQualifiedArn", + "OutputValue": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-deleteTask:11", + "Description": "Current Lambda function version", + "ExportName": "sls-backend-dev-DeleteTaskLambdaFunctionQualifiedArn" + }, + { + "OutputKey": "UpdateTaskLambdaFunctionQualifiedArn", + "OutputValue": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-updateTask:11", + "Description": "Current Lambda function version", + "ExportName": "sls-backend-dev-UpdateTaskLambdaFunctionQualifiedArn" + }, + { + "OutputKey": "UpdatePreferencesLambdaFunctionQualifiedArn", + "OutputValue": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-updatePreferences:11", + "Description": "Current Lambda function version", + "ExportName": "sls-backend-dev-UpdatePreferencesLambdaFunctionQualifiedArn" + }, + { + "OutputKey": "GetMusicLambdaFunctionQualifiedArn", + "OutputValue": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-getMusic:11", + "Description": "Current Lambda function version", + "ExportName": "sls-backend-dev-GetMusicLambdaFunctionQualifiedArn" + }, + { + "OutputKey": "CreateTaskLambdaFunctionQualifiedArn", + "OutputValue": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-createTask:11", + "Description": "Current Lambda function version", + "ExportName": "sls-backend-dev-CreateTaskLambdaFunctionQualifiedArn" + }, + { + "OutputKey": "Auth0AuthorizerLambdaFunctionQualifiedArn", + "OutputValue": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-auth0Authorizer:7", + "Description": "Current Lambda function version", + "ExportName": "sls-backend-dev-Auth0AuthorizerLambdaFunctionQualifiedArn" + }, + { + "OutputKey": "UpdateBackgroundLambdaFunctionQualifiedArn", + "OutputValue": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-updateBackground:11", + "Description": "Current Lambda function version", + "ExportName": "sls-backend-dev-UpdateBackgroundLambdaFunctionQualifiedArn" + }, + { + "OutputKey": "ServiceEndpoint", + "OutputValue": "https://b94obf2k3g.execute-api.us-east-1.amazonaws.com/dev", + "Description": "URL of the service endpoint", + "ExportName": "sls-backend-dev-ServiceEndpoint" + }, + { + "OutputKey": "ServerlessDeploymentBucketName", + "OutputValue": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "ExportName": "sls-backend-dev-ServerlessDeploymentBucketName" + } + ] + } +} \ No newline at end of file diff --git a/backend/.serverless/serverless-state.json b/backend/.serverless/serverless-state.json new file mode 100644 index 0000000..7e0b065 --- /dev/null +++ b/backend/.serverless/serverless-state.json @@ -0,0 +1,2623 @@ +{ + "service": { + "service": "backend", + "serviceObject": { + "name": "backend" + }, + "provider": { + "name": "aws", + "runtime": "nodejs20.x", + "region": "us-east-1", + "stage": "dev", + "environment": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + }, + "iam": { + "role": { + "statements": [ + { + "Effect": "Allow", + "Action": [ + "dynamodb:Query", + "dynamodb:Scan", + "dynamodb:GetItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem" + ], + "Resource": [ + "arn:aws:dynamodb:us-east-1:274552760074:table/dev-focusflow-tasks", + "arn:aws:dynamodb:us-east-1:274552760074:table/dev-focusflow-users" + ] + }, + { + "Effect": "Allow", + "Action": [ + "s3:PutObject", + "s3:GetObject", + "s3:DeleteObject" + ], + "Resource": "arn:aws:cloudformation:us-east-1:274552760074:stack/backend-dev/80499180-a60f-11ef-b8d5-124d3fdcb0b3" + }, + { + "Effect": "Allow", + "Action": [ + "cognito-idp:SignUp" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "lambda:InvokeFunction" + ], + "Resource": "arn:aws:lambda:us-east-1:274552760074:function:backend-dev-auth0Authenticator" + }, + { + "Effect": "Allow", + "Action": [ + "sts:AssumeRole" + ] + } + ] + } + }, + "cors": { + "allowedOrigins": [ + "http://localhost:5173" + ], + "allowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "OPTIONS" + ], + "allowedHeaders": [ + "Authorization", + "Content-Type", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": true + }, + "versionFunctions": true, + "AwshttpApi": null, + "compiledCloudFormationTemplate": { + "AWSTemplateFormatVersion": "2010-09-09", + "Description": "The AWS CloudFormation template for this Serverless application", + "Resources": { + "CreateTaskLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-createTask" + } + }, + "GetTaskLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-getTask" + } + }, + "UpdateTaskLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-updateTask" + } + }, + "DeleteTaskLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-deleteTask" + } + }, + "ManageTimerLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-manageTimer" + } + }, + "UpdatePreferencesLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-updatePreferences" + } + }, + "GetMusicLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-getMusic" + } + }, + "UpdateBackgroundLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-updateBackground" + } + }, + "Auth0AuthorizerLogGroup": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": "/aws/lambda/backend-dev-auth0Authorizer" + } + }, + "IamRoleLambdaExecution": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Service": [ + "lambda.amazonaws.com" + ] + }, + "Action": [ + "sts:AssumeRole" + ] + } + ] + }, + "Policies": [ + { + "PolicyName": { + "Fn::Join": [ + "-", + [ + "backend", + "dev", + "lambda" + ] + ] + }, + "PolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "logs:CreateLogStream", + "logs:CreateLogGroup", + "logs:TagResource" + ], + "Resource": [ + { + "Fn::Sub": "arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/backend-dev*:*" + } + ] + }, + { + "Effect": "Allow", + "Action": [ + "logs:PutLogEvents" + ], + "Resource": [ + { + "Fn::Sub": "arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/backend-dev*:*:*" + } + ] + }, + { + "$ref": "$[\"service\"][\"provider\"][\"iam\"][\"role\"][\"statements\"][0]" + }, + { + "$ref": "$[\"service\"][\"provider\"][\"iam\"][\"role\"][\"statements\"][1]" + }, + { + "$ref": "$[\"service\"][\"provider\"][\"iam\"][\"role\"][\"statements\"][2]" + }, + { + "$ref": "$[\"service\"][\"provider\"][\"iam\"][\"role\"][\"statements\"][3]" + }, + { + "$ref": "$[\"service\"][\"provider\"][\"iam\"][\"role\"][\"statements\"][4]" + } + ] + } + } + ], + "Path": "/", + "RoleName": { + "Fn::Join": [ + "-", + [ + "backend", + "dev", + { + "Ref": "AWS::Region" + }, + "lambdaRole" + ] + ] + } + } + }, + "CreateTaskLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/task/createTask.createTask", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-createTask", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "CreateTaskLogGroup" + ] + }, + "GetTaskLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/task/getTask.getTasks", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-getTask", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "GetTaskLogGroup" + ] + }, + "UpdateTaskLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/task/updateTask.updateTask", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-updateTask", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "UpdateTaskLogGroup" + ] + }, + "DeleteTaskLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/task/deleteTask.deleteTask", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-deleteTask", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "DeleteTaskLogGroup" + ] + }, + "ManageTimerLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/timer/manageTimer.manageTimer", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-manageTimer", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "ManageTimerLogGroup" + ] + }, + "UpdatePreferencesLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/preferences/updatePreferences.updatePreferences", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-updatePreferences", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "UpdatePreferencesLogGroup" + ] + }, + "GetMusicLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/music/getMusic.getMusic", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-getMusic", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "GetMusicLogGroup" + ] + }, + "UpdateBackgroundLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/background/updateBackground.updateBackground", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-updateBackground", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "UpdateBackgroundLogGroup" + ] + }, + "Auth0AuthorizerLambdaFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "S3Key": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z/backend.zip" + }, + "Handler": "src/handlers/auth/index.handler", + "Runtime": "nodejs20.x", + "FunctionName": "backend-dev-auth0Authorizer", + "MemorySize": 1024, + "Timeout": 6, + "Environment": { + "Variables": { + "AUTH0_DOMAIN": "dev-6zeb418i7xs8g1lc.us.auth0.com", + "AUTH0_AUDIENCE": "focusflow-audience", + "AUTH0_ISSUER": "https://dev-6zeb418i7xs8g1lc.us.auth0.com/", + "DYNAMODB_TASKS_TABLE": "dev-focusflow-tasks", + "DYNAMODB_USERS_TABLE": "dev-focusflow-users", + "S3_ASSETS_BUCKET": "dev-focusflow-assets" + } + }, + "Role": { + "Fn::GetAtt": [ + "IamRoleLambdaExecution", + "Arn" + ] + } + }, + "DependsOn": [ + "Auth0AuthorizerLogGroup" + ] + }, + "CreateTaskLambdaVersionk30cu9y50e5sOq8XtrIxMTWLhghYgNRK8RgZoEYIGYw": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "CreateTaskLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "GetTaskLambdaVersiongXM56yZkGsQlnDb6WDCtOEDbduxrzUj1n6drT1Ds": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "GetTaskLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "UpdateTaskLambdaVersionLVQNXG4ycaaTjNA87jUZHr5KUky8EK3SL1Nnqxf8": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "UpdateTaskLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "DeleteTaskLambdaVersionbIxEVCZEfnNfNmF7C6APqdnRa2qGfa8uJbDu8LgXW0": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "DeleteTaskLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "ManageTimerLambdaVersionC6S83E8qe3dWiTU9VbMMgG77ou962v41HGAoSgzghOg": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "ManageTimerLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "UpdatePreferencesLambdaVersioni5HctCd5bCmzGE75DP4AXMDIxXfWqWLY5HnJgMGU": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "UpdatePreferencesLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "GetMusicLambdaVersionAGbhi19HVk79KS2hVYQLrY4HuhO4As6VfyVaUlrk": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "GetMusicLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "UpdateBackgroundLambdaVersiongFcVopCo5kYCSelYvEKVfGn4pxaLVIjYrPviLUTM": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "UpdateBackgroundLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "Auth0AuthorizerLambdaVersionUMEDyDFlyLIyWSsK6xWjoOLLkQNiEtvaBzHSTree2Xw": { + "Type": "AWS::Lambda::Version", + "DeletionPolicy": "Retain", + "Properties": { + "FunctionName": { + "Ref": "Auth0AuthorizerLambdaFunction" + }, + "CodeSha256": "Jcet10Z89nGzu6mC/UrlkPreS1d8bEjBJqk3tXxQijQ=" + } + }, + "ApiGatewayRestApi": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "Name": "dev-backend", + "EndpointConfiguration": { + "Types": [ + "EDGE" + ] + }, + "Policy": "" + } + }, + "ApiGatewayResourceTasks": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "ApiGatewayRestApi", + "RootResourceId" + ] + }, + "PathPart": "tasks", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourceTasksTaskidVar": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Ref": "ApiGatewayResourceTasks" + }, + "PathPart": "{taskId}", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourceTimer": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "ApiGatewayRestApi", + "RootResourceId" + ] + }, + "PathPart": "timer", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourcePreferences": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "ApiGatewayRestApi", + "RootResourceId" + ] + }, + "PathPart": "preferences", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourceMusic": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "ApiGatewayRestApi", + "RootResourceId" + ] + }, + "PathPart": "music", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourceBackgrounds": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "ApiGatewayRestApi", + "RootResourceId" + ] + }, + "PathPart": "backgrounds", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourceAuth": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "ApiGatewayRestApi", + "RootResourceId" + ] + }, + "PathPart": "auth", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayResourceAuthValidate": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Ref": "ApiGatewayResourceAuth" + }, + "PathPart": "validate", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodTasksOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Credentials": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'http://localhost:5173'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Requested-With,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,POST'", + "method.response.header.Access-Control-Allow-Credentials": "'true'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourceTasks" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodTasksTaskidVarOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'http://localhost:5173'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Requested-With,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,DELETE,PUT'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourceTasksTaskidVar" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodTimerOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Requested-With,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,POST'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourceTimer" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodPreferencesOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Requested-With,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,PUT'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourcePreferences" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodMusicOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Requested-With,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourceMusic" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodBackgroundsOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Requested-With,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,PUT'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourceBackgrounds" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodAuthValidateOptions": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "MethodResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true + }, + "ResponseModels": {} + } + ], + "RequestParameters": {}, + "Integration": { + "Type": "MOCK", + "RequestTemplates": { + "application/json": "{statusCode:200}" + }, + "ContentHandling": "CONVERT_TO_TEXT", + "IntegrationResponses": [ + { + "StatusCode": "200", + "ResponseParameters": { + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Allow-Headers": "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent,X-Amzn-Trace-Id'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,POST'" + }, + "ResponseTemplates": { + "application/json": "" + } + } + ] + }, + "ResourceId": { + "Ref": "ApiGatewayResourceAuthValidate" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + } + } + }, + "ApiGatewayMethodTasksPost": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "POST", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceTasks" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "CreateTaskLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodTasksGet": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "GET", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceTasks" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "GetTaskLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodTasksTaskidVarPut": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "PUT", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceTasksTaskidVar" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "UpdateTaskLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodTasksTaskidVarDelete": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "DELETE", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceTasksTaskidVar" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "DeleteTaskLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodTimerPost": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "POST", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceTimer" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "ManageTimerLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodPreferencesPut": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "PUT", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourcePreferences" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "UpdatePreferencesLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodMusicGet": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "GET", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceMusic" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "GetMusicLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "GetMusicLambdaPermissionApiGateway" + ] + }, + "ApiGatewayMethodBackgroundsPut": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "PUT", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceBackgrounds" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "CUSTOM", + "AuthorizerId": { + "Ref": "Auth0AuthorizerApiGatewayAuthorizer" + }, + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "UpdateBackgroundLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerApiGatewayAuthorizer" + ] + }, + "ApiGatewayMethodAuthValidatePost": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "POST", + "RequestParameters": {}, + "ResourceId": { + "Ref": "ApiGatewayResourceAuthValidate" + }, + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "Auth0AuthorizerLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + } + }, + "MethodResponses": [] + }, + "DependsOn": [ + "Auth0AuthorizerLambdaPermissionApiGateway" + ] + }, + "Auth0AuthorizerApiGatewayAuthorizer": { + "Type": "AWS::ApiGateway::Authorizer", + "Properties": { + "AuthorizerResultTtlInSeconds": 300, + "IdentitySource": "method.request.header.Authorization", + "Name": "auth0Authorizer", + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "AuthorizerUri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "Auth0AuthorizerLambdaFunction", + "Arn" + ] + }, + "/invocations" + ] + ] + }, + "Type": "REQUEST" + } + }, + "ApiGatewayDeployment1732392175738": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "ApiGatewayRestApi" + }, + "StageName": "dev" + }, + "DependsOn": [ + "ApiGatewayMethodTasksOptions", + "ApiGatewayMethodTasksTaskidVarOptions", + "ApiGatewayMethodTimerOptions", + "ApiGatewayMethodPreferencesOptions", + "ApiGatewayMethodMusicOptions", + "ApiGatewayMethodBackgroundsOptions", + "ApiGatewayMethodAuthValidateOptions", + "ApiGatewayMethodTasksPost", + "ApiGatewayMethodTasksGet", + "ApiGatewayMethodTasksTaskidVarPut", + "ApiGatewayMethodTasksTaskidVarDelete", + "ApiGatewayMethodTimerPost", + "ApiGatewayMethodPreferencesPut", + "ApiGatewayMethodMusicGet", + "ApiGatewayMethodBackgroundsPut", + "ApiGatewayMethodAuthValidatePost" + ] + }, + "CreateTaskLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "CreateTaskLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "Auth0AuthorizerLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "Auth0AuthorizerLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "GetTaskLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "GetTaskLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "UpdateTaskLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "UpdateTaskLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "DeleteTaskLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "DeleteTaskLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "ManageTimerLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "ManageTimerLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "UpdatePreferencesLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "UpdatePreferencesLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "GetMusicLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "GetMusicLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "UpdateBackgroundLambdaPermissionApiGateway": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "FunctionName": { + "Fn::GetAtt": [ + "UpdateBackgroundLambdaFunction", + "Arn" + ] + }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "ApiGatewayRestApi" + }, + "/*/*" + ] + ] + } + } + }, + "TasksTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-tasks", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + }, + { + "AttributeName": "taskId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + }, + { + "AttributeName": "taskId", + "KeyType": "RANGE" + } + ] + } + }, + "UsersTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-users", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + } + ] + } + }, + "AssetsBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "dev-focusflow-assets", + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*" + ], + "AllowedMethods": [ + "GET", + "PUT", + "POST", + "DELETE", + "HEAD" + ], + "AllowedOrigins": [ + "*" + ], + "MaxAge": 3000 + } + ] + } + } + } + }, + "Outputs": { + "ServerlessDeploymentBucketName": { + "Value": "serverless-framework-deployments-us-east-1-be0e5fd9-feac", + "Export": { + "Name": "sls-backend-dev-ServerlessDeploymentBucketName" + } + }, + "CreateTaskLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "CreateTaskLambdaVersionk30cu9y50e5sOq8XtrIxMTWLhghYgNRK8RgZoEYIGYw" + }, + "Export": { + "Name": "sls-backend-dev-CreateTaskLambdaFunctionQualifiedArn" + } + }, + "GetTaskLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "GetTaskLambdaVersiongXM56yZkGsQlnDb6WDCtOEDbduxrzUj1n6drT1Ds" + }, + "Export": { + "Name": "sls-backend-dev-GetTaskLambdaFunctionQualifiedArn" + } + }, + "UpdateTaskLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "UpdateTaskLambdaVersionLVQNXG4ycaaTjNA87jUZHr5KUky8EK3SL1Nnqxf8" + }, + "Export": { + "Name": "sls-backend-dev-UpdateTaskLambdaFunctionQualifiedArn" + } + }, + "DeleteTaskLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "DeleteTaskLambdaVersionbIxEVCZEfnNfNmF7C6APqdnRa2qGfa8uJbDu8LgXW0" + }, + "Export": { + "Name": "sls-backend-dev-DeleteTaskLambdaFunctionQualifiedArn" + } + }, + "ManageTimerLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "ManageTimerLambdaVersionC6S83E8qe3dWiTU9VbMMgG77ou962v41HGAoSgzghOg" + }, + "Export": { + "Name": "sls-backend-dev-ManageTimerLambdaFunctionQualifiedArn" + } + }, + "UpdatePreferencesLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "UpdatePreferencesLambdaVersioni5HctCd5bCmzGE75DP4AXMDIxXfWqWLY5HnJgMGU" + }, + "Export": { + "Name": "sls-backend-dev-UpdatePreferencesLambdaFunctionQualifiedArn" + } + }, + "GetMusicLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "GetMusicLambdaVersionAGbhi19HVk79KS2hVYQLrY4HuhO4As6VfyVaUlrk" + }, + "Export": { + "Name": "sls-backend-dev-GetMusicLambdaFunctionQualifiedArn" + } + }, + "UpdateBackgroundLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "UpdateBackgroundLambdaVersiongFcVopCo5kYCSelYvEKVfGn4pxaLVIjYrPviLUTM" + }, + "Export": { + "Name": "sls-backend-dev-UpdateBackgroundLambdaFunctionQualifiedArn" + } + }, + "Auth0AuthorizerLambdaFunctionQualifiedArn": { + "Description": "Current Lambda function version", + "Value": { + "Ref": "Auth0AuthorizerLambdaVersionUMEDyDFlyLIyWSsK6xWjoOLLkQNiEtvaBzHSTree2Xw" + }, + "Export": { + "Name": "sls-backend-dev-Auth0AuthorizerLambdaFunctionQualifiedArn" + } + }, + "ServiceEndpoint": { + "Description": "URL of the service endpoint", + "Value": { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "ApiGatewayRestApi" + }, + ".execute-api.", + { + "Ref": "AWS::Region" + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/dev" + ] + ] + }, + "Export": { + "Name": "sls-backend-dev-ServiceEndpoint" + } + } + } + }, + "vpc": {} + }, + "custom": { + "tableName": "dev-focusflow-tasks", + "usersTableName": "dev-focusflow-users", + "bucketName": "dev-focusflow-assets" + }, + "plugins": [ + "serverless-offline" + ], + "pluginsData": {}, + "functions": { + "createTask": { + "handler": "src/handlers/task/createTask.createTask", + "events": [ + { + "http": { + "path": "tasks", + "method": "post", + "cors": { + "origin": "http://localhost:5173", + "methods": [ + "OPTIONS", + "POST" + ], + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": true + }, + "authorizer": { + "type": "REQUEST", + "name": "auth0Authorizer", + "arn": { + "Fn::GetAtt": [ + "Auth0AuthorizerLambdaFunction", + "Arn" + ] + }, + "managedExternally": false, + "resultTtlInSeconds": 300, + "identitySource": "method.request.header.Authorization", + "claims": [] + }, + "integration": "AWS_PROXY" + } + } + ], + "name": "backend-dev-createTask", + "package": {}, + "memory": 1024, + "timeout": 6, + "runtime": "nodejs20.x", + "vpc": {}, + "versionLogicalId": "CreateTaskLambdaVersionk30cu9y50e5sOq8XtrIxMTWLhghYgNRK8RgZoEYIGYw" + }, + "getTask": { + "handler": "src/handlers/task/getTask.getTasks", + "events": [ + { + "http": { + "path": "tasks", + "method": "get", + "cors": { + "origin": "http://localhost:5173", + "methods": [ + "OPTIONS", + "GET" + ], + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": false + }, + "authorizer": { + "type": "REQUEST", + "name": "auth0Authorizer", + "arn": { + "$ref": "$[\"service\"][\"functions\"][\"createTask\"][\"events\"][0][\"http\"][\"authorizer\"][\"arn\"]" + }, + "managedExternally": false, + "resultTtlInSeconds": 300, + "identitySource": "method.request.header.Authorization", + "claims": [] + }, + "allowCredentials": true, + "integration": "AWS_PROXY" + } + } + ], + "name": "backend-dev-getTask", + "package": {}, + "memory": 1024, + "timeout": 6, + "runtime": "nodejs20.x", + "vpc": {}, + "versionLogicalId": "GetTaskLambdaVersiongXM56yZkGsQlnDb6WDCtOEDbduxrzUj1n6drT1Ds" + }, + "updateTask": { + "handler": "src/handlers/task/updateTask.updateTask", + "events": [ + { + "http": { + "path": "tasks/{taskId}", + "method": "put", + "cors": { + "origin": "http://localhost:5173", + "methods": [ + "OPTIONS", + "PUT" + ], + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": false + }, + "authorizer": { + "type": "REQUEST", + "name": "auth0Authorizer", + "arn": { + "$ref": "$[\"service\"][\"functions\"][\"createTask\"][\"events\"][0][\"http\"][\"authorizer\"][\"arn\"]" + }, + "managedExternally": false, + "resultTtlInSeconds": 300, + "identitySource": "method.request.header.Authorization", + "claims": [] + }, + "allowCredentials": true, + "integration": "AWS_PROXY" + } + } + ], + "name": "backend-dev-updateTask", + "package": {}, + "memory": 1024, + "timeout": 6, + "runtime": "nodejs20.x", + "vpc": {}, + "versionLogicalId": "UpdateTaskLambdaVersionLVQNXG4ycaaTjNA87jUZHr5KUky8EK3SL1Nnqxf8" + }, + "deleteTask": { + "handler": "src/handlers/task/deleteTask.deleteTask", + "events": [ + { + "http": { + "path": "tasks/{taskId}", + "method": "delete", + "cors": { + "origin": "http://localhost:5173", + "methods": [ + "OPTIONS", + "DELETE" + ], + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": false + }, + "authorizer": { + "type": "REQUEST", + "name": "auth0Authorizer", + "arn": { + "$ref": "$[\"service\"][\"functions\"][\"createTask\"][\"events\"][0][\"http\"][\"authorizer\"][\"arn\"]" + }, + "managedExternally": false, + "resultTtlInSeconds": 300, + "identitySource": "method.request.header.Authorization", + "claims": [] + }, + "allowCredentials": true, + "integration": "AWS_PROXY" + } + } + ], + "name": "backend-dev-deleteTask", + "package": {}, + "memory": 1024, + "timeout": 6, + "runtime": "nodejs20.x", + "vpc": {}, + "versionLogicalId": "DeleteTaskLambdaVersionbIxEVCZEfnNfNmF7C6APqdnRa2qGfa8uJbDu8LgXW0" + }, + "manageTimer": { + "handler": "src/handlers/timer/manageTimer.manageTimer", + "events": [ + { + "http": { + "path": "timer", + "method": "post", + "cors": { + "origin": "*", + "methods": [ + "OPTIONS", + "POST" + ], + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": false + }, + "authorizer": { + "type": "REQUEST", + "name": "auth0Authorizer", + "arn": { + "$ref": "$[\"service\"][\"functions\"][\"createTask\"][\"events\"][0][\"http\"][\"authorizer\"][\"arn\"]" + }, + "managedExternally": false, + "resultTtlInSeconds": 300, + "identitySource": "method.request.header.Authorization", + "claims": [] + }, + "integration": "AWS_PROXY" + } + } + ], + "name": "backend-dev-manageTimer", + "package": {}, + "memory": 1024, + "timeout": 6, + "runtime": "nodejs20.x", + "vpc": {}, + "versionLogicalId": "ManageTimerLambdaVersionC6S83E8qe3dWiTU9VbMMgG77ou962v41HGAoSgzghOg" + }, + "updatePreferences": { + "handler": "src/handlers/preferences/updatePreferences.updatePreferences", + "events": [ + { + "http": { + "path": "preferences", + "method": "put", + "cors": { + "origin": "*", + "methods": [ + "OPTIONS", + "PUT" + ], + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": false + }, + "authorizer": { + "type": "REQUEST", + "name": "auth0Authorizer", + "arn": { + "$ref": "$[\"service\"][\"functions\"][\"createTask\"][\"events\"][0][\"http\"][\"authorizer\"][\"arn\"]" + }, + "managedExternally": false, + "resultTtlInSeconds": 300, + "identitySource": "method.request.header.Authorization", + "claims": [] + }, + "integration": "AWS_PROXY" + } + } + ], + "name": "backend-dev-updatePreferences", + "package": {}, + "memory": 1024, + "timeout": 6, + "runtime": "nodejs20.x", + "vpc": {}, + "versionLogicalId": "UpdatePreferencesLambdaVersioni5HctCd5bCmzGE75DP4AXMDIxXfWqWLY5HnJgMGU" + }, + "getMusic": { + "handler": "src/handlers/music/getMusic.getMusic", + "events": [ + { + "http": { + "path": "music", + "method": "get", + "cors": { + "origin": "*", + "methods": [ + "OPTIONS", + "GET" + ], + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": false + }, + "integration": "AWS_PROXY" + } + } + ], + "name": "backend-dev-getMusic", + "package": {}, + "memory": 1024, + "timeout": 6, + "runtime": "nodejs20.x", + "vpc": {}, + "versionLogicalId": "GetMusicLambdaVersionAGbhi19HVk79KS2hVYQLrY4HuhO4As6VfyVaUlrk" + }, + "updateBackground": { + "handler": "src/handlers/background/updateBackground.updateBackground", + "events": [ + { + "http": { + "path": "backgrounds", + "method": "put", + "cors": { + "origin": "*", + "methods": [ + "OPTIONS", + "PUT" + ], + "headers": [ + "Content-Type", + "Authorization", + "X-Requested-With", + "X-Amz-Date", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent" + ], + "allowCredentials": false + }, + "authorizer": { + "type": "REQUEST", + "name": "auth0Authorizer", + "arn": { + "$ref": "$[\"service\"][\"functions\"][\"createTask\"][\"events\"][0][\"http\"][\"authorizer\"][\"arn\"]" + }, + "managedExternally": false, + "resultTtlInSeconds": 300, + "identitySource": "method.request.header.Authorization", + "claims": [] + }, + "integration": "AWS_PROXY" + } + } + ], + "name": "backend-dev-updateBackground", + "package": {}, + "memory": 1024, + "timeout": 6, + "runtime": "nodejs20.x", + "vpc": {}, + "versionLogicalId": "UpdateBackgroundLambdaVersiongFcVopCo5kYCSelYvEKVfGn4pxaLVIjYrPviLUTM" + }, + "auth0Authorizer": { + "handler": "src/handlers/auth/index.handler", + "events": [ + { + "http": { + "path": "auth/validate", + "method": "post", + "cors": { + "origin": "*", + "methods": [ + "OPTIONS", + "POST" + ], + "headers": [ + "Content-Type", + "X-Amz-Date", + "Authorization", + "X-Api-Key", + "X-Amz-Security-Token", + "X-Amz-User-Agent", + "X-Amzn-Trace-Id" + ], + "allowCredentials": false + }, + "integration": "AWS_PROXY" + } + } + ], + "name": "backend-dev-auth0Authorizer", + "package": {}, + "memory": 1024, + "timeout": 6, + "runtime": "nodejs20.x", + "vpc": {}, + "versionLogicalId": "Auth0AuthorizerLambdaVersionUMEDyDFlyLIyWSsK6xWjoOLLkQNiEtvaBzHSTree2Xw" + } + }, + "resources": { + "Resources": { + "TasksTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-tasks", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + }, + { + "AttributeName": "taskId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + }, + { + "AttributeName": "taskId", + "KeyType": "RANGE" + } + ] + } + }, + "UsersTable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "dev-focusflow-users", + "BillingMode": "PAY_PER_REQUEST", + "AttributeDefinitions": [ + { + "AttributeName": "userId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "userId", + "KeyType": "HASH" + } + ] + } + }, + "AssetsBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "dev-focusflow-assets", + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*" + ], + "AllowedMethods": [ + "GET", + "PUT", + "POST", + "DELETE", + "HEAD" + ], + "AllowedOrigins": [ + "*" + ], + "MaxAge": 3000 + } + ] + } + } + } + }, + "Outputs": {} + }, + "configValidationMode": "warn", + "serviceFilename": "serverless.yml", + "initialServerlessConfig": { + "org": "devquesting", + "app": "focusflow", + "service": "backend", + "plugins": { + "$ref": "$[\"service\"][\"plugins\"]" + }, + "provider": { + "$ref": "$[\"service\"][\"provider\"]" + }, + "custom": { + "$ref": "$[\"service\"][\"custom\"]" + }, + "resources": { + "$ref": "$[\"service\"][\"resources\"]" + }, + "functions": { + "$ref": "$[\"service\"][\"functions\"]" + } + }, + "app": "focusflow", + "appId": null, + "org": "devquesting", + "orgId": null, + "layers": {}, + "artifact": "D:\\Projects\\Portfolio_Projects\\focusflow\\FocusFlow\\backend\\.serverless\\backend.zip" + }, + "package": { + "artifactDirectoryName": "serverless/backend/dev/1732392193211-2024-11-23T20:03:13.211Z", + "artifact": "backend.zip" + } +} \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json index 267ef75..702d2c9 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -11,13 +11,8 @@ "dependencies": { "aws-sdk": "^2.1692.0", "dotenv": "^16.4.5", - "joi": "^17.13.3", - "jsonwebtoken": "^7.4.3", - "jwk-to-pem": "^1.2.6", - "jwks-rsa": "^3.1.0", - "request": "^2.88.2", - "serverless-webpack": "^5.15.0", - "uuid": "^11.0.3" + "prop-types": "^15.8.1", + "request": "^2.88.2" }, "devDependencies": { "eslint": "^9.15.0", @@ -2057,12 +2052,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" - }, "node_modules/@hapi/iron": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-7.0.1.tgz", @@ -2255,15 +2244,6 @@ "node": ">=14.0.0" } }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, "node_modules/@hapi/validate": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-2.0.1.tgz", @@ -2398,7 +2378,9 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, "license": "ISC", + "peer": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -2415,7 +2397,9 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -2427,7 +2411,9 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -2439,13 +2425,17 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -2462,7 +2452,9 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -2477,7 +2469,9 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -2903,6 +2897,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -2917,6 +2912,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -2926,32 +2922,24 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2988,33 +2976,14 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">=14" } }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" - }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -3780,77 +3749,13 @@ "@babel/types": "^7.20.7" } }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, "license": "MIT" }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -3861,12 +3766,6 @@ "@types/node": "*" } }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "license": "MIT" - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -3898,65 +3797,19 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", - "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "22.9.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.19.8" } }, - "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -3981,197 +3834,11 @@ "dev": true, "license": "MIT" }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -4206,16 +3873,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -4246,6 +3903,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -4255,6 +3913,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -4280,149 +3939,52 @@ "node": ">= 8" } }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-unflat-js": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/array-unflat-js/-/array-unflat-js-0.1.3.tgz", + "integrity": "sha512-8pljkLj4vfz2i7Tf3yB31tRrszjP8/kwIyABGfcZ1GcHlvdUB0Sbx0WzQkOPMqUBxa/bu4+/NAyHEpDtZJzlJw==", + "dev": true, "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, "engines": { - "node": ">= 14" + "node": ">=14.18.0" } }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "license": "MIT", "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" + "safer-buffer": "~2.1.0" } }, - "node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "engines": { + "node": ">=0.8" } }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/archiver-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-unflat-js": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/array-unflat-js/-/array-unflat-js-0.1.3.tgz", - "integrity": "sha512-8pljkLj4vfz2i7Tf3yB31tRrszjP8/kwIyABGfcZ1GcHlvdUB0Sbx0WzQkOPMqUBxa/bu4+/NAyHEpDtZJzlJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -4483,6 +4045,7 @@ "version": "1.7.7", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -4495,6 +4058,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/axios-proxy-builder/-/axios-proxy-builder-0.1.2.tgz", "integrity": "sha512-6uBVsBZzkB3tCC8iyx59mCjQckhB8+GQrI9Cop8eC7ybIsvs/KtnNgEBfRMSEa7GqK2VBGUzgjNYMdPIfotyPA==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -4505,6 +4069,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -4516,12 +4081,6 @@ "node": ">= 6" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -4642,15 +4201,9 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, - "node_modules/bare-events": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", - "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", - "license": "Apache-2.0", - "optional": true - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -4680,18 +4233,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/bn.js": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", - "license": "MIT" - }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", @@ -4861,6 +4402,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -4869,16 +4411,11 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT" - }, "node_modules/browserslist": { "version": "4.24.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "dev": true, "funding": [ { "type": "opencollective", @@ -4928,39 +4465,13 @@ "isarray": "^1.0.0" } }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, "license": "MIT" }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -5004,6 +4515,7 @@ "version": "1.0.30001680", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", + "dev": true, "funding": [ { "type": "opencollective", @@ -5053,16 +4565,6 @@ "node": ">=10" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -5136,6 +4638,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -5148,6 +4651,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/combined-stream": { @@ -5162,29 +4666,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT", - "peer": true - }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5205,31 +4686,6 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "license": "MIT" }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -5269,6 +4725,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -5305,6 +4762,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5419,6 +4877,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, "license": "MIT" }, "node_modules/ecc-jsbn": { @@ -5431,36 +4890,13 @@ "safer-buffer": "^2.1.0" } }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/electron-to-chromium": { "version": "1.5.63", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz", "integrity": "sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA==", + "dev": true, "license": "ISC" }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", @@ -5478,22 +4914,9 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, "license": "MIT" }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -5525,13 +4948,6 @@ "node": ">= 0.4" } }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "license": "MIT", - "peer": true - }, "node_modules/esbuild": { "version": "0.23.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", @@ -5576,6 +4992,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5733,6 +5150,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -5745,6 +5163,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -5760,15 +5179,6 @@ "node": ">=0.10.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -5849,12 +5259,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -5942,6 +5346,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -5967,15 +5372,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "license": "Apache-2.0", - "dependencies": { - "micromatch": "^4.0.2" - } - }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -6001,6 +5397,7 @@ "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, "funding": [ { "type": "individual", @@ -6031,7 +5428,9 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, "license": "ISC", + "peer": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -6047,7 +5446,9 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=14" }, @@ -6095,6 +5496,7 @@ "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -6255,13 +5657,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause", - "peer": true - }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -6291,6 +5686,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/har-schema": { @@ -6320,6 +5716,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6376,16 +5773,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -6398,27 +5785,6 @@ "node": ">= 0.4" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha512-V6Yw1rIcYV/4JsnggjBU0l4Kr+EXhpwqXRusENU1Xx6ro00IHPHYNynCuBTOZAPlr3AAmLvchH9I7N/VUdvOwQ==", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.40" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -6562,21 +5928,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "license": "MIT", - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -6635,6 +5986,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6701,6 +6053,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -6710,6 +6063,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6761,19 +6115,11 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, - "node_modules/isemail": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", - "integrity": "sha512-pZMb1rDrWRAPtVY92VCxWtF+1gExWrCnao+GL1EKHx6z19ovW+xNcnC1iNB7WkbSYWlyl3uwlaH5eaBx2s2crw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, "license": "ISC" }, "node_modules/isstream": { @@ -6870,7 +6216,9 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -7496,19 +6844,6 @@ "node": ">= 0.6.0" } }, - "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, "node_modules/jose": { "version": "5.9.6", "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.6.tgz", @@ -7533,7 +6868,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -7589,6 +6923,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, "license": "MIT" }, "node_modules/json-schema": { @@ -7633,6 +6968,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -7670,40 +7006,6 @@ "node": "*" } }, - "node_modules/jsonwebtoken": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz", - "integrity": "sha512-7WWGEZ+/xedHUHLDvSwvN7LbmLIEgOuBNQOBKvfX5zpLok5q6873aCR2zOuJ/DrORp/DlyYImz06nlNoRCWugw==", - "license": "MIT", - "dependencies": { - "joi": "^6.10.1", - "jws": "^3.1.4", - "lodash.once": "^4.0.0", - "ms": "^2.0.0", - "xtend": "^4.0.1" - }, - "engines": { - "node": ">=0.12", - "npm": ">=1.4.28" - } - }, - "node_modules/jsonwebtoken/node_modules/joi": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", - "integrity": "sha512-K6+OwGaWM1sBEu+XMbgC4zDmg6hnddS2DWiCVtjnhkcrzv+ejSfh7HGUsoxmWQkv6kHEsVFAywttfkpmIE2QwQ==", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "license": "BSD-3-Clause", - "dependencies": { - "hoek": "2.x.x", - "isemail": "1.x.x", - "moment": "2.x.x", - "topo": "1.x.x" - }, - "engines": { - "node": ">=0.10.40", - "npm": ">=2.0.0" - } - }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -7765,64 +7067,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwk-to-pem": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-1.2.6.tgz", - "integrity": "sha512-Ipnj4HJk49KJ6j8u6niB37f8waRf+9uDpJlnk9QRJbH2AIII2w59VoajS5s2V0MYfIS5s+Hys9G6dspJmLn95Q==", - "license": "Apache-2.0", - "dependencies": { - "asn1.js": "^4.5.2", - "elliptic": "^6.2.3", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", - "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", - "license": "MIT", - "dependencies": { - "@types/express": "^4.17.17", - "@types/jsonwebtoken": "^9.0.2", - "debug": "^4.3.4", - "jose": "^4.14.6", - "limiter": "^1.1.5", - "lru-memoizer": "^2.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jwks-rsa/node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -7843,48 +7087,6 @@ "node": ">=6" } }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -7919,11 +7121,6 @@ "immediate": "~3.0.5" } }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -7931,16 +7128,6 @@ "dev": true, "license": "MIT" }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -7957,18 +7144,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -7976,12 +7151,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, "node_modules/long-timeout": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", @@ -7989,6 +7158,18 @@ "dev": true, "license": "MIT" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -7999,34 +7180,6 @@ "yallist": "^3.0.2" } }, - "node_modules/lru-memoizer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", - "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", - "license": "MIT", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "6.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, "node_modules/luxon": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", @@ -8080,12 +7233,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -8126,18 +7281,6 @@ "node": ">=6" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "license": "MIT" - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -8155,24 +7298,18 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=16 || 14 >=14.17" } }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, "node_modules/natural-compare": { @@ -8182,13 +7319,6 @@ "dev": true, "license": "MIT" }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT", - "peer": true - }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -8239,6 +7369,7 @@ "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, "license": "MIT" }, "node_modules/node-schedule": { @@ -8260,6 +7391,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8287,6 +7419,15 @@ "node": "*" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -8420,7 +7561,9 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true }, "node_modules/pako": { "version": "1.0.11", @@ -8485,6 +7628,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8501,7 +7645,9 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -8517,7 +7663,9 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "dev": true, + "license": "ISC", + "peer": true }, "node_modules/performance-now": { "version": "2.1.0", @@ -8529,12 +7677,14 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -8685,19 +7835,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, "license": "MIT" }, "node_modules/prompts": { @@ -8714,10 +7856,28 @@ "node": ">= 6" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, "license": "MIT", "peer": true }, @@ -8780,22 +7940,6 @@ "node": ">=0.4.x" } }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -8803,105 +7947,6 @@ "dev": true, "license": "MIT" }, - "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readable-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/readable-stream/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/readable-stream/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -9029,6 +8074,7 @@ "version": "5.0.10", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, "license": "ISC", "peer": true, "dependencies": { @@ -9045,6 +8091,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -9055,6 +8102,7 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, "license": "ISC", "peer": true, "dependencies": { @@ -9076,6 +8124,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "license": "ISC", "peer": true, "dependencies": { @@ -9120,25 +8169,6 @@ "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", "license": "ISC" }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -9149,20 +8179,11 @@ "semver": "bin/semver.js" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/serverless": { "version": "4.4.11", "resolved": "https://registry.npmjs.org/serverless/-/serverless-4.4.11.tgz", "integrity": "sha512-8FC58j1pfLMBlkdKrHyiFDO0FDUXQdVtHs2K+2XHDCd+gXX0J7kSxS49s2oYmAxknfjs0wlrhrzGe9DVlxpb+A==", + "dev": true, "hasInstallScript": true, "peer": true, "dependencies": { @@ -9376,91 +8397,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serverless-webpack": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/serverless-webpack/-/serverless-webpack-5.15.0.tgz", - "integrity": "sha512-zgPoA89OyKziVR22X6tsfImmoG9UB3QzoVDUpEmuB0VZBN/97RaonSLMoeMQFqcZ7ckXXIjqwb4ylmhD8vGHcA==", - "license": "MIT", - "dependencies": { - "archiver": "^7.0.1", - "bluebird": "^3.7.2", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^11.2.0", - "glob": "^10.4.5", - "is-builtin-module": "^3.2.1", - "lodash": "^4.17.21", - "semver": "^7.6.3" - }, - "engines": { - "node": ">= 16" - }, - "peerDependencies": { - "serverless": "1 || 2 || 3 || 4", - "ts-node": ">= 8.3.0", - "webpack": ">= 3.0.0 < 6" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/serverless-webpack/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/serverless-webpack/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/serverless-webpack/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/serverless-webpack/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -9489,6 +8425,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -9501,6 +8438,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9541,6 +8479,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -9612,29 +8551,6 @@ "node": ">=8" } }, - "node_modules/streamx": { - "version": "2.20.2", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.2.tgz", - "integrity": "sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -9653,6 +8569,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -9668,7 +8585,9 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9682,6 +8601,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -9695,7 +8615,9 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9769,123 +8691,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/terser": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", - "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -9901,12 +8706,6 @@ "node": ">=8" } }, - "node_modules/text-decoder": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", - "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==", - "license": "Apache-2.0" - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -9918,6 +8717,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -9926,19 +8726,6 @@ "node": ">=8.0" } }, - "node_modules/topo": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", - "integrity": "sha512-vpmONxdZoD0R3hzH0lovwv8QmsqZmGCDE1wXW9YGD/reiDOAbPKEgRDlBCAt8u8nJhav/s/I+r+1gvdpA11x7Q==", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "license": "BSD-3-Clause", - "dependencies": { - "hoek": "2.x.x" - }, - "engines": { - "node": ">=0.10.40" - } - }, "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -10002,6 +8789,7 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, "license": "MIT", "peer": true, "engines": { @@ -10066,12 +8854,14 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, "license": "MIT" }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -10081,6 +8871,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, "funding": [ { "type": "opencollective", @@ -10152,21 +8943,9 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, "license": "MIT" }, - "node_modules/uuid": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", - "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -10222,20 +9001,6 @@ "makeerror": "1.0.12" } }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "license": "MIT", - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", @@ -10246,101 +9011,11 @@ "node": ">= 8" } }, - "node_modules/webpack": { - "version": "5.96.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", - "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -10474,7 +9149,9 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -10552,15 +9229,6 @@ "node": ">=4.0" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -10619,20 +9287,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } } } } diff --git a/backend/package.json b/backend/package.json index 432349c..472389a 100644 --- a/backend/package.json +++ b/backend/package.json @@ -12,13 +12,8 @@ "dependencies": { "aws-sdk": "^2.1692.0", "dotenv": "^16.4.5", - "joi": "^17.13.3", - "jsonwebtoken": "^7.4.3", - "jwk-to-pem": "^1.2.6", - "jwks-rsa": "^3.1.0", - "request": "^2.88.2", - "serverless-webpack": "^5.15.0", - "uuid": "^11.0.3" + "prop-types": "^15.8.1", + "request": "^2.88.2" }, "devDependencies": { "eslint": "^9.15.0", diff --git a/backend/serverless.yml b/backend/serverless.yml index 0d1fb9c..b5d390d 100644 --- a/backend/serverless.yml +++ b/backend/serverless.yml @@ -7,48 +7,67 @@ service: backend plugins: - serverless-offline - provider: name: aws runtime: nodejs20.x region: us-east-1 stage: dev environment: - AUTH0_DOMAIN: your-auth0-domain.auth0.com + AUTH0_DOMAIN: dev-6zeb418i7xs8g1lc.us.auth0.com AUTH0_AUDIENCE: focusflow-audience AUTH0_ISSUER: https://dev-6zeb418i7xs8g1lc.us.auth0.com/ - DYNAMODB_TASKS_TABLE: ${self:custom.tableName} - DYNAMODB_USERS_TABLE: ${self:custom.usersTableName} - S3_ASSETS_BUCKET: ${self:custom.bucketName} + DYNAMODB_TASKS_TABLE: dev-focusflow-tasks + DYNAMODB_USERS_TABLE: dev-focusflow-users + S3_ASSETS_BUCKET: dev-focusflow-assets iam: role: statements: - Effect: Allow Action: - - dynamodb:Query - - dynamodb:Scan - - dynamodb:GetItem - dynamodb:PutItem + - dynamodb:GetItem - dynamodb:UpdateItem - dynamodb:DeleteItem - Resource: - - !GetAtt TasksTable.Arn - - !GetAtt UsersTable.Arn + - dynamodb:Scan + - dynamodb:Query + Resource: "*" - Effect: Allow Action: - s3:PutObject - s3:GetObject - s3:DeleteObject - Resource: !Join ["/", [!GetAtt AssetsBucket.Arn, "*"]] + Resource: "*" + - Effect: Allow + Action: + - lambda:InvokeFunction + Resource: + - arn:aws:lambda:${self:provider.region}:${aws:accountId}:function:${self:service}-${self:provider.stage}-auth0Authenticator - Effect: Allow Action: - - cognito-idp:SignUp - Resource: '*' + - sts:AssumeRole + AwshttpApi: + cors: + allowedOrigins: + - http://localhost:5173 + allowedMethods: + - GET + - POST + - PUT + - DELETE + - OPTIONS + allowedHeaders: + - Authorization + - Content-Type + - X-Amz-Date + - X-Api-Key + - X-Amz-Security-Token + - X-Amz-User-Agent + allowCredentials: true custom: tableName: ${sls:stage}-focusflow-tasks usersTableName: ${sls:stage}-focusflow-users - bucketName: ${sls:stage}-focusflow-assets + bucketName: ${sls:stage}-focusflow-assets-${aws:accountId} resources: Resources: @@ -102,49 +121,84 @@ functions: - http: path: tasks method: post - cors: true + cors: + origin: "http://localhost:5173" + allowCredentials: true + headers: + - Content-Type + - Authorization + - X-Requested-With + - X-Amz-Date + - X-Api-Key + - X-Amz-Security-Token + - X-Amz-User-Agent authorizer: type: REQUEST identitySource: method.request.header.Authorization - authorizerResultTtlInSeconds: 300 name: auth0Authorizer - getTasks: - handler: src/handlers/task/getTasks.getTasks + getTask: + handler: src/handlers/task/getTask.getTasks events: - http: path: tasks method: get - cors: true + cors: + origin: "http://localhost:5173" # Use '*' for all origins or specify 'http://localhost:5173' for development + headers: + - Content-Type + - Authorization + - X-Requested-With + - X-Amz-Date + - X-Api-Key + - X-Amz-Security-Token + - X-Amz-User-Agent authorizer: type: REQUEST identitySource: method.request.header.Authorization - authorizerResultTtlInSeconds: 300 name: auth0Authorizer + allowCredentials: true updateTask: handler: src/handlers/task/updateTask.updateTask events: - http: path: tasks/{taskId} method: put - cors: true + cors: + origin: "http://localhost:5173" # Use '*' for all origins or specify 'http://localhost:5173' for development + headers: + - Content-Type + - Authorization + - X-Requested-With + - X-Amz-Date + - X-Api-Key + - X-Amz-Security-Token + - X-Amz-User-Agent authorizer: type: REQUEST identitySource: method.request.header.Authorization - authorizerResultTtlInSeconds: 300 name: auth0Authorizer + allowCredentials: true deleteTask: handler: src/handlers/task/deleteTask.deleteTask events: - http: path: tasks/{taskId} method: delete - cors: true + cors: + origin: "http://localhost:5173" # Use '*' for all origins or specify 'http://localhost:5173' for development + headers: + - Content-Type + - Authorization + - X-Requested-With + - X-Amz-Date + - X-Api-Key + - X-Amz-Security-Token + - X-Amz-User-Agent authorizer: type: REQUEST identitySource: method.request.header.Authorization - authorizerResultTtlInSeconds: 300 name: auth0Authorizer - + allowCredentials: true # Pomodoro Timer manageTimer: handler: src/handlers/timer/manageTimer.manageTimer @@ -152,11 +206,19 @@ functions: - http: path: timer method: post - cors: true + cors: + origin: "*" # Use '*' for all origins or specify 'http://localhost:5173' for development + headers: + - Content-Type + - Authorization + - X-Requested-With + - X-Amz-Date + - X-Api-Key + - X-Amz-Security-Token + - X-Amz-User-Agent authorizer: type: REQUEST identitySource: method.request.header.Authorization - authorizerResultTtlInSeconds: 300 name: auth0Authorizer # User Preferences @@ -166,11 +228,19 @@ functions: - http: path: preferences method: put - cors: true + cors: + origin: "*" # Use '*' for all origins or specify 'http://localhost:5173' for development + headers: + - Content-Type + - Authorization + - X-Requested-With + - X-Amz-Date + - X-Api-Key + - X-Amz-Security-Token + - X-Amz-User-Agent authorizer: type: REQUEST identitySource: method.request.header.Authorization - authorizerResultTtlInSeconds: 300 name: auth0Authorizer # Music Player @@ -180,7 +250,16 @@ functions: - http: path: music method: get - cors: true + cors: + origin: "*" # Use '*' for all origins or specify 'http://localhost:5173' for development + headers: + - Content-Type + - Authorization + - X-Requested-With + - X-Amz-Date + - X-Api-Key + - X-Amz-Security-Token + - X-Amz-User-Agent # Background Management updateBackground: @@ -189,12 +268,25 @@ functions: - http: path: backgrounds method: put - cors: true + cors: + origin: "*" # Use '*' for all origins or specify 'http://localhost:5173' for development + headers: + - Content-Type + - Authorization + - X-Requested-With + - X-Amz-Date + - X-Api-Key + - X-Amz-Security-Token + - X-Amz-User-Agent authorizer: type: REQUEST identitySource: method.request.header.Authorization - authorizerResultTtlInSeconds: 300 name: auth0Authorizer auth0Authorizer: - handler: src/handlers/auth/auth.auth0Authorizer + handler: src/handlers/auth/index.handler + events: + - http: + path: auth/validate + method: post + cors: true diff --git a/backend/src/handlers/auth/auth.js b/backend/src/handlers/auth/auth.js deleted file mode 100644 index 8201cee..0000000 --- a/backend/src/handlers/auth/auth.js +++ /dev/null @@ -1,56 +0,0 @@ -const jwt = require("jsonwebtoken"); -const jwksClient = require("jwks-rsa"); - -const client = jwksClient({ - jwksUri: `https://${process.env.AUTH0_DOMAIN}/.well-known/jwks.json`, -}); - -function getKey(header, callback) { - client.getSigningKey(header.kid, (err, key) => { - const signingKey = key.getPublicKey(); - callback(null, signingKey); - }); -} - -module.exports.auth0Authorizer = async (event) => { - const token = event.headers.Authorization || event.headers.authorization; - - if (!token) { - return { - statusCode: 401, - body: JSON.stringify({ message: "Unauthorized" }), - }; - } - - const bearerToken = token.split(" ")[1]; - - try { - const decoded = await new Promise((resolve, reject) => { - jwt.verify( - bearerToken, - getKey, - { audience: process.env.AUTH0_AUDIENCE, issuer: process.env.AUTH0_ISSUER }, - (err, decoded) => (err ? reject(err) : resolve(decoded)) - ); - }); - - return { - principalId: decoded.sub, - policyDocument: { - Version: "2012-10-17", - Statement: [ - { - Action: "execute-api:Invoke", - Effect: "Allow", - Resource: event.methodArn, - }, - ], - }, - }; - } catch (err) { - return { - statusCode: 401, - body: JSON.stringify({ message: "Unauthorized" }), - }; - } -}; diff --git a/backend/src/handlers/auth/index.js b/backend/src/handlers/auth/index.js new file mode 100644 index 0000000..3381218 --- /dev/null +++ b/backend/src/handlers/auth/index.js @@ -0,0 +1,14 @@ +const lib = require('./lib'); +let data; + +// Lambda function index.handler - thin wrapper around lib.authenticate +module.exports.handler = async (event, context, callback) => { + try { + data = await lib.authenticate(event); + } + catch (err) { + console.log(err); + return context.fail("Unauthorized"); + } + return data; +}; \ No newline at end of file diff --git a/backend/src/handlers/auth/lib.js b/backend/src/handlers/auth/lib.js new file mode 100644 index 0000000..d480735 --- /dev/null +++ b/backend/src/handlers/auth/lib.js @@ -0,0 +1,70 @@ +require('dotenv').config({ silent: true }); + +const jwksClient = require('jwks-rsa'); +const jwt = require('jsonwebtoken'); +const util = require('util'); + +const getPolicyDocument = (effect, resource) => { + const policyDocument = { + Version: '2012-10-17', // default version + Statement: [{ + Action: 'execute-api:Invoke', // default action + Effect: effect, + Resource: resource, + }] + }; + return policyDocument; +} + + +// extract and return the Bearer Token from the Lambda event parameters +const getToken = (params) => { + if (!params.type || params.type !== 'TOKEN') { + throw new Error('Expected "event.type" parameter to have value "TOKEN"'); + } + + const tokenString = params.authorizationToken; + if (!tokenString) { + throw new Error('Expected "event.authorizationToken" parameter to be set'); + } + + const match = tokenString.match(/^Bearer (.*)$/); + if (!match || match.length < 2) { + throw new Error(`Invalid Authorization token - ${tokenString} does not match "Bearer .*"`); + } + return match[1]; +} + +const jwtOptions = { + audience: process.env.AUDIENCE, + issuer: process.env.TOKEN_ISSUER +}; + +module.exports.authenticate = (params) => { + console.log(params); + const token = getToken(params); + + const decoded = jwt.decode(token, { complete: true }); + if (!decoded || !decoded.header || !decoded.header.kid) { + throw new Error('invalid token'); + } + + const getSigningKey = util.promisify(client.getSigningKey); + return getSigningKey(decoded.header.kid) + .then((key) => { + const signingKey = key.publicKey || key.rsaPublicKey; + return jwt.verify(token, signingKey, jwtOptions); + }) + .then((decoded)=> ({ + principalId: decoded.sub, + policyDocument: getPolicyDocument('Allow', params.methodArn), + context: { scope: decoded.scope } + })); +} + + const client = jwksClient({ + cache: true, + rateLimit: true, + jwksRequestsPerMinute: 10, // Default value + jwksUri: process.env.JWKS_URI + }); \ No newline at end of file diff --git a/backend/src/handlers/auth/package-lock.json b/backend/src/handlers/auth/package-lock.json new file mode 100644 index 0000000..e8b451f --- /dev/null +++ b/backend/src/handlers/auth/package-lock.json @@ -0,0 +1,1739 @@ +{ + "name": "lambda-auth0-authenticator", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lambda-auth0-authenticator", + "version": "0.1.0", + "license": "Apache-2.0", + "dependencies": { + "auth0": "^2.5.0", + "bluebird": "^3.4.6", + "jsonwebtoken": "^8.2.1", + "jwks-rsa": "^1.1.1" + }, + "devDependencies": { + "aws-sdk": "^2.2.48", + "lambda-local": "^1.4.8" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", + "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-jwt": { + "version": "0.0.42", + "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.42.tgz", + "integrity": "sha512-WszgUddvM1t5dPpJ3LhWNH8kfNN8GPIBrAGxgIYXVCEGx6Bx4A036aAuf/r5WH9DIEdlmp7gHOYvSM6U87B0ag==", + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/express-unless": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz", + "integrity": "sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express-unless": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.3.tgz", + "integrity": "sha512-TyPLQaF6w8UlWdv4gj8i46B+INBVzURBNRahCozCSXfsK2VTlL1wNyTlMKw817VHygBtlcl5jfnPadlydr06Yw==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.3.tgz", + "integrity": "sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.8" + } + }, + "node_modules/@types/qs": { + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/auth0": { + "version": "2.44.1", + "resolved": "https://registry.npmjs.org/auth0/-/auth0-2.44.1.tgz", + "integrity": "sha512-+/lloZ2YGa8Epf2e1TRhyeXNEN1xHd4mw7arhYvD0ZY83ZOZxsHtaVyaOXuSL+rp0uqXHjyNjAbkGeyYxTUe7Q==", + "license": "MIT", + "dependencies": { + "axios": "^0.27.2", + "form-data": "^3.0.1", + "jsonwebtoken": "^8.5.1", + "jwks-rsa": "^1.12.1", + "lru-memoizer": "^2.1.4", + "rest-facade": "^1.16.3", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sdk": { + "version": "2.1692.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1692.0.tgz", + "integrity": "sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-1.2.2.tgz", + "integrity": "sha512-rUug78lL8mqStaLehmH2F0LxMJ2TM9fnPFxb+gFkgyUjUM/1o2wKTQtalypHnkb2cFwH/DENBw7YEAOYLgSMxQ==", + "license": "MIT", + "dependencies": { + "sentence-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "node_modules/change-case": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-2.3.1.tgz", + "integrity": "sha512-3HE5jrTqqn9jeKzD0+yWi7FU4OMicLbwB57ph4bpwEn5jGi3hZug5WjZjnBD2RY7YyTKAAck86ACfShXUWJKLg==", + "license": "MIT", + "dependencies": { + "camel-case": "^1.1.1", + "constant-case": "^1.1.0", + "dot-case": "^1.1.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "param-case": "^1.1.0", + "pascal-case": "^1.1.0", + "path-case": "^1.1.0", + "sentence-case": "^1.1.1", + "snake-case": "^1.1.0", + "swap-case": "^1.1.0", + "title-case": "^1.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/constant-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-1.1.2.tgz", + "integrity": "sha512-FQ/HuOuSnX6nIF8OnofRWj+KnOpGAHXQpOKHmsL1sAnuLwu6r5mHGK+mJc0SkHkbmNfcU/SauqXLTEOL1JQfJA==", + "license": "MIT", + "dependencies": { + "snake-case": "^1.1.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/dot-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-1.1.2.tgz", + "integrity": "sha512-NzEIt12UjECXi6JZ/R/nBey6EE1qCN0yUTEFaPIaKW0AcOEwlKqujtcJVbtSfLNnj3CDoXLQyli79vAaqohyvw==", + "license": "MIT", + "dependencies": { + "sentence-case": "^1.1.2" + } + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz", + "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "license": "MIT", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "license": "MIT", + "dependencies": { + "upper-case": "^1.1.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwks-rsa": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.12.3.tgz", + "integrity": "sha512-cFipFDeYYaO9FhhYJcZWX/IyZgc0+g316rcHnDpT2dNRNIE/lMOmWKKqp09TkJoYlNFzrEVODsR4GgXJMgWhnA==", + "license": "MIT", + "dependencies": { + "@types/express-jwt": "0.0.42", + "axios": "^0.21.1", + "debug": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "jsonwebtoken": "^8.5.1", + "limiter": "^1.1.5", + "lru-memoizer": "^2.1.2", + "ms": "^2.1.2", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/jwks-rsa/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/lambda-local": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lambda-local/-/lambda-local-1.7.4.tgz", + "integrity": "sha512-uLrFPGj2//glOgJGLZn8hNTNlhU+eGx0WFRLZxIoC39nfjLRZ1fncHcPK2t5gA2GcvgtGUT2dnw60M8vJAOIkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aws-sdk": "^2.689.0", + "commander": "^6.1.0", + "dotenv": "^8.2.0", + "winston": "^3.2.1" + }, + "bin": { + "lambda-local": "build/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "license": "MIT" + }, + "node_modules/lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.2" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-memoizer": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", + "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", + "license": "MIT", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "6.0.0" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/param-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-1.1.2.tgz", + "integrity": "sha512-gksk6zeZQxwBm1AHsKh+XDFsTGf1LvdZSkkpSIkfDtzW+EQj/P2PBgNb3Cs0Y9Xxqmbciv2JZe3fWU6Xbher+Q==", + "license": "MIT", + "dependencies": { + "sentence-case": "^1.1.2" + } + }, + "node_modules/pascal-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-1.1.2.tgz", + "integrity": "sha512-QWlbdQHdKWlcyTEuv/M0noJtlCa7qTmg5QFAqhx5X9xjAfCU1kXucL+rcOmd2HliESuRLIOz8521RAW/yhuQog==", + "license": "MIT", + "dependencies": { + "camel-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, + "node_modules/path-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-1.1.2.tgz", + "integrity": "sha512-2snAGA6xVRqTuTPa40bn0iEpYtVK6gEqeyS/63dqpm5pGlesOv6EmRcnB9Rr6eAnAC2Wqlbz0tqgJZryttxhxg==", + "license": "MIT", + "dependencies": { + "sentence-case": "^1.1.2" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rest-facade": { + "version": "1.16.4", + "resolved": "https://registry.npmjs.org/rest-facade/-/rest-facade-1.16.4.tgz", + "integrity": "sha512-EeQm4TMYFAvEw/6wV0OyjerdR8V2cThnmXuPCmRWSrwG6p2fZw9ZkzMIYy33OpdnvHCoGHggKOly7J6Nu3nsAQ==", + "license": "MIT", + "dependencies": { + "change-case": "^2.3.0", + "deepmerge": "^3.2.0", + "lodash.get": "^4.4.2", + "superagent": "^7.1.3" + }, + "peerDependencies": { + "superagent-proxy": "^3.0.0" + }, + "peerDependenciesMeta": { + "superagent-proxy": { + "optional": true + } + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "dev": true, + "license": "ISC" + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sentence-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-1.1.3.tgz", + "integrity": "sha512-laa/UDTPXsrQnoN/Kc8ZO7gTeEjMsuPiDgUCk9N0iINRZvqAMCTXjGl8+tD27op1eF/JHbdUlEUmovDh6AX7sA==", + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/snake-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-1.1.2.tgz", + "integrity": "sha512-oapUKC+qulnUIN+/O7Tbl2msi9PQvJeivGN9RNbygxzI2EOY0gA96i8BJLYnGUWSLGcYtyW4YYqnGTZEySU/gg==", + "license": "MIT", + "dependencies": { + "sentence-case": "^1.1.2" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/superagent": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.6.tgz", + "integrity": "sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==", + "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net", + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.3", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.10.3", + "readable-stream": "^3.6.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/superagent/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "dev": true, + "license": "MIT" + }, + "node_modules/title-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-1.1.2.tgz", + "integrity": "sha512-xYbo5Um5MBgn24xJSK+x5hZ8ehuGXTVhgx32KJCThHRHwpyIb1lmABi1DH5VvN9E7rNEquPjz//rF/tZQd7mjQ==", + "license": "MIT", + "dependencies": { + "sentence-case": "^1.1.1", + "upper-case": "^1.0.3" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "license": "MIT" + }, + "node_modules/upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", + "license": "MIT", + "dependencies": { + "upper-case": "^1.1.1" + } + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/winston": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + } + } +} diff --git a/backend/src/handlers/auth/package.json b/backend/src/handlers/auth/package.json new file mode 100644 index 0000000..5082532 --- /dev/null +++ b/backend/src/handlers/auth/package.json @@ -0,0 +1,22 @@ +{ + "name": "lambda-auth0-authenticator", + "version": "0.1.0", + "description": "An AWS Lambda function to provide a Custom Authenticator for AWS API Gateway that verifies RS* signed tokens", + "main": "index.js", + "scripts": { + "test": "lambda-local --timeout 300 --lambda-path index.js --event-path event.json", + "bundle": "rm -f custom-authorizer.zip ; zip custom-authorizer.zip -r *.js *.json node_modules/" + }, + "author": "Jason Haines", + "license": "Apache-2.0", + "dependencies": { + "auth0": "^2.5.0", + "bluebird": "^3.4.6", + "jsonwebtoken": "^8.2.1", + "jwks-rsa": "^1.1.1" + }, + "devDependencies": { + "aws-sdk": "^2.2.48", + "lambda-local": "^1.4.8" + } +} \ No newline at end of file diff --git a/backend/src/handlers/task/createTask.js b/backend/src/handlers/task/createTask.js index a552a10..339f9d1 100644 --- a/backend/src/handlers/task/createTask.js +++ b/backend/src/handlers/task/createTask.js @@ -1,17 +1,74 @@ const db = require('../../utils/db'); module.exports.createTask = async (event) => { - const { userId, taskId, title, description, dueDate } = JSON.parse(event.body); + // Log the received body + console.log("Received event body:", event.body); + + let taskData; + try { + taskData = JSON.parse(event.body); + } catch (error) { + return { + statusCode: 400, + headers: { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": true, + }, + body: JSON.stringify({ error: "Invalid JSON body" }), + }; + } + + const { userId, taskId, title, description, dueDate } = taskData; + + // Validate required fields + if (!userId || !taskId || !title) { + console.error("Missing required fields:", { userId, taskId, title }); + return { + statusCode: 400, + headers: { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": true, + }, + body: JSON.stringify({ + error: "Missing required fields: userId, taskId, title", + details: { userId, taskId, title }, + }), + }; + } const params = { TableName: process.env.DYNAMODB_TASKS_TABLE, - Item: { userId, taskId, title, description, dueDate, status: 'pending' }, + Item: { + userId, + taskId, + title, + description: description || null, + dueDate: dueDate || null, + status: "pending", + createdAt: new Date().toISOString(), + }, }; - await db.put(params); - - return { - statusCode: 201, - body: JSON.stringify({ message: 'Task created successfully', taskId }), - }; + try { + const result = await db.put(params); + console.log("DynamoDB PUT Success:", result); + return { + statusCode: 201, + headers: { + 'Access-Control-Allow-Origin': 'http://localhost:5173', + 'Access-Control-Allow-Credentials': true, + }, + body: JSON.stringify({ message: 'Task created successfully', taskId }), + }; + } catch (error) { + console.error("DynamoDB PUT Error:", error); + return { + statusCode: 500, + headers: { + 'Access-Control-Allow-Origin': 'http://localhost:5173', + 'Access-Control-Allow-Credentials': true, + }, + body: JSON.stringify({ error: error.message }), + }; + } }; diff --git a/backend/src/handlers/task/getTask.js b/backend/src/handlers/task/getTask.js index f9a189c..74b8a60 100644 --- a/backend/src/handlers/task/getTask.js +++ b/backend/src/handlers/task/getTask.js @@ -1,18 +1,57 @@ const db = require('../../utils/db'); module.exports.getTasks = async (event) => { - const userId = event.queryStringParameters.userId; + console.log("Starting getTasks handler"); + // Get userId from query string parameters + const userId = event.queryStringParameters?.userId; + + if (!userId) { + return { + statusCode: 400, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Credentials': true, + }, + body: JSON.stringify({ error: 'Missing userId in query parameters' }), + }; + } + + // DynamoDB query parameters const params = { - TableName: process.env.DYNAMODB_TASKS_TABLE, - KeyConditionExpression: 'userId = :userId', - ExpressionAttributeValues: { ':userId': userId }, + TableName: process.env.DYNAMODB_TASKS_TABLE, // Ensure the environment variable is correct + KeyConditionExpression: 'userId = :userId', // Query based on the partition key + ExpressionAttributeValues: { + ':userId': userId, // Pass the userId to the query + }, }; - const result = await db.query(params); + console.log("UserId:", userId); + console.log("DynamoDB params:", params); - return { - statusCode: 200, - body: JSON.stringify(result.Items), - }; + try { + console.log("Attempting DynamoDB query..."); + const result = await db.query(params); + console.log("Query result:", result); + + return { + statusCode: 200, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Credentials': true, + }, + body: JSON.stringify(result.Items), // Return the fetched items + }; + } catch (error) { + console.error("Database query failed:", error); + + return { + statusCode: 500, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Credentials': true, + }, + body: JSON.stringify({ error: error.message }), + }; + } }; diff --git a/backend/src/utils/db.js b/backend/src/utils/db.js index 367d3ab..be4925d 100644 --- a/backend/src/utils/db.js +++ b/backend/src/utils/db.js @@ -1,10 +1,11 @@ const AWS = require('aws-sdk'); + const dynamoDb = new AWS.DynamoDB.DocumentClient(); module.exports = { put: (params) => dynamoDb.put(params).promise(), get: (params) => dynamoDb.get(params).promise(), + query: (params) => dynamoDb.query(params).promise(), update: (params) => dynamoDb.update(params).promise(), delete: (params) => dynamoDb.delete(params).promise(), - query: (params) => dynamoDb.query(params).promise(), }; diff --git a/frontend/.gitignore b/frontend/.gitignore index ac3b64f..754658c 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -23,3 +23,9 @@ dist-ssr *.njsproj *.sln *.sw? +.env +.env.local +.env.development.local +.env.production.local +.env.test.local +VITE_.env diff --git a/frontend/src/assets/musicData.js b/frontend/src/assets/musicData.js index ac7a2d2..d1ac83d 100644 --- a/frontend/src/assets/musicData.js +++ b/frontend/src/assets/musicData.js @@ -4,35 +4,9 @@ const baseYouTubeThumbnailUrl = 'https://img.youtube.com/vi'; const videos = [ { - id: 'IRp0zhUFi-M', - title: 'Lofi Hip Hop Beats 24/7 Radio', - }, - { - id: 'JWlKA9wmO64', - title: 'Japanese Lofi Radio 24/7', - }, - { - id: 'unl1zQoWD9A', - title: '24/7 Dark Ambient Lofi 🌌 In Memory of Those We Miss', - }, - { - id: '8Yqx3we3WJ4', - title: - 'Space Lofi Hip Hop Radio 24/7 🚀 Chill Lofi Beats To Study, Lofi Sleep Music', - }, - { - id: '9ljhQoFsahw', - title: - 'Lofi Space Station 🚀 Aesthetic Lofi Beats to Chill / Study to 🌌 Lofi Radio', - }, - { - id: 'RyA-7mzA2SI', - title: 'Rain Sounds & Lofi Music 🌧 Relaxing Lofi Sleep & Study Music 🌧', - }, - { - id: 'JQUNIbAT934', - title: 'At the Laundry 🔴 Chill Lofi Hip Hop Beats to sleep/ study', - }, + id: 'c3suauAz0zQ', + title: 'Nordic home office', + } ]; // Adding thumbnail URL dynamically to each video object diff --git a/frontend/src/components/TaskPopover.jsx b/frontend/src/components/TaskPopover.jsx index 337fd12..26bd676 100644 --- a/frontend/src/components/TaskPopover.jsx +++ b/frontend/src/components/TaskPopover.jsx @@ -1,158 +1,388 @@ -import React, { useState } from 'react'; +/** + * @file TaskPopover.jsx + * @description This component renders a popover for managing tasks in the FocusFlow application. + * It allows users to view, add, edit, delete, and toggle the completion status of tasks. + * + * @requires React + * @requires @material-tailwind/react + * @requires @heroicons/react + * @requires react-toastify + * @requires @auth0/auth0-react + */ + +import React, { useState, useEffect } from "react"; import { - Popover, - PopoverHandler, - PopoverContent, - IconButton, - Input, -} from '@material-tailwind/react'; + Popover, + PopoverHandler, + PopoverContent, + IconButton, + Input, +} from "@material-tailwind/react"; import { - BoltIcon, - CheckCircleIcon, - PencilIcon, - TrashIcon, - PlusCircleIcon, -} from '@heroicons/react/24/outline'; -import { CheckCircleIcon as CheckCircleIconSolid } from '@heroicons/react/24/solid'; -import { ToastContainer, Zoom, toast } from 'react-toastify'; - -const TaskPopover = ({ - tasks = [], - setTasks, - newTask, - setNewTask, - addTask, - deleteTask, - toggleCompleteTask, - selectTaskForSession, - currentTaskId, - isActive, - isVisible -}) => { - const [isEditing, setIsEditing] = useState(null); - const [editTaskName, setEditTaskName] = useState(''); - - const handlePopoverClick = (event) => { - event.stopPropagation(); - event.preventDefault(); - }; - - const handleEditTask = (task) => { - setIsEditing(task.id); - setEditTaskName(task.name); - }; - - const handleEditTaskChange = (e) => { - setEditTaskName(e.target.value); - }; - - const saveEditedTask = (taskId) => { - if (editTaskName.trim() === '') return; - const updatedTasks = tasks.map(task => - task.id === taskId ? { ...task, name: editTaskName } : task - ); - setTasks(updatedTasks); - setIsEditing(null); - setEditTaskName(''); + CheckCircleIcon, + PencilIcon, + TrashIcon, + PlusCircleIcon, +} from "@heroicons/react/24/outline"; +import { CheckCircleIcon as CheckCircleIconSolid } from "@heroicons/react/24/solid"; +import { toast } from "react-toastify"; +import { API_BASE_URL } from "../config/config"; +import { useAuth0 } from '@auth0/auth0-react'; +import PropTypes from 'prop-types'; + +/** + * TaskPopover Component + * + * @component + * @param {Object} props - Component props + * @param {boolean} props.isActive - Indicates if the component is active + * @param {boolean} props.isVisible - Indicates if the component is visible + * @returns {React.Component} TaskPopover component + */ +const TaskPopover = ({ isActive, isVisible }) => { + // State declarations + const [tasks, setTasks] = useState([]); + const [newTask, setNewTask] = useState(""); + const [isEditing, setIsEditing] = useState(null); + const [editTaskName, setEditTaskName] = useState(""); + const { getAccessTokenSilently, user } = useAuth0(); + const [isLoading, setIsLoading] = useState(false); + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const [shouldRefetch, setShouldRefetch] = useState(true); + + /** + * Fetches tasks from the API + * + * @async + * @function fetchTasks + * @throws {Error} When the API request fails + */ + const fetchTasks = async () => { + if (!user?.sub) { + console.error("User ID is undefined"); + toast.error("Unable to fetch tasks: User not authenticated"); + return; + } + + setIsLoading(true); + try { + const token = await getAccessTokenSilently({ audience: "focusflow-audience" }); + + const response = await fetch(`${API_BASE_URL}/tasks?userId=${user.sub}`, { + method: "GET", + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + }); + + if (!response.ok) { + throw new Error(`HTTP Error: ${response.status}`); + } + + const data = await response.json(); + setTasks(data); + console.log(data); + } catch (err) { + console.error("Error fetching tasks:", err); + toast.error("Failed to load tasks"); + } finally { + setIsLoading(false); + } + }; + + // Effect hooks + useEffect(() => { + if (isPopoverOpen && user?.sub && shouldRefetch) { + fetchTasks(); + setShouldRefetch(false); + } + }, [isPopoverOpen, user?.sub, shouldRefetch]); + + /** + * Handles adding a new task + * + * @async + * @function handleAddTask + * @throws {Error} When the API request fails + */ + const handleAddTask = async () => { + if (newTask.trim() === "") { + toast.warn("Task name cannot be empty"); + return; + } + + try { + const token = await getAccessTokenSilently({ audience: "focusflow-audience" }); + + const response = await fetch(`${API_BASE_URL}/tasks`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ + userId: user.sub, + taskId: crypto.randomUUID(), + title: newTask, + description: "Optional description", + dueDate: new Date().toISOString(), + }), + }); + + if (response.ok) { + const createdTask = await response.json(); + setTasks((prev) => [...prev, createdTask]); + setNewTask(""); + setShouldRefetch(true); + toast.success("Task added successfully"); + } else { + const errorData = await response.json(); + toast.error(`Failed to add task: ${errorData.message || "Unknown error"}`); + } + } catch (error) { + console.error("Error adding task:", error); + toast.error("Failed to add task. Please try again."); + } + }; + + /** + * Handles deleting a task + * + * @async + * @function handleDeleteTask + * @param {string} taskId - ID of the task to delete + * @throws {Error} When the API request fails + */ + const handleDeleteTask = async (taskId) => { + try { + const response = await fetch(`${API_BASE_URL}/tasks/${taskId}`, { + method: "DELETE", + }); + + if (response.ok) { + setTasks((prev) => prev.filter((task) => task.id !== taskId)); + toast.success("Task deleted successfully"); + } else { + toast.error("Failed to delete task"); + } + } catch (error) { + toast.error("Failed to delete task"); + console.error("Error deleting task:", error); + } }; + /** + * Toggles the completion status of a task + * + * @async + * @function toggleCompleteTask + * @param {string} taskId - ID of the task to toggle + * @throws {Error} When the API request fails + */ + const toggleCompleteTask = async (taskId) => { + const taskToToggle = tasks.find((task) => task.id === taskId); + if (!taskToToggle) return; + + try { + const response = await fetch(`${API_BASE_URL}/tasks/${taskId}`, { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ completed: !taskToToggle.completed }), + }); + + if (response.ok) { + const updatedTask = await response.json(); + setTasks((prev) => + prev.map((task) => (task.id === taskId ? updatedTask : task)) + ); + toast.success("Task updated successfully"); + } else { + toast.error("Failed to update task"); + } + } catch (error) { + toast.error("Failed to update task"); + console.error("Error updating task:", error); + } + }; + + /** + * Handles editing a task + * + * @function handleEditTask + * @param {Object} task - Task object to edit + */ + const handleEditTask = (task) => { + setIsEditing(task.id); + setEditTaskName(task.name); + }; + + /** + * Handles changes in the edit task input + * + * @function handleEditTaskChange + * @param {Event} e - Input change event + */ + const handleEditTaskChange = (e) => { + setEditTaskName(e.target.value); + }; + + /** + * Saves the edited task + * + * @async + * @function saveEditedTask + * @param {string} taskId - ID of the task being edited + * @throws {Error} When the API request fails + */ + const saveEditedTask = async (taskId) => { + if (editTaskName.trim() === "") return; + + try { + const response = await fetch(`${API_BASE_URL}/tasks/${taskId}`, { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ name: editTaskName }), + }); + + if (response.ok) { + const updatedTask = await response.json(); + setTasks((prev) => + prev.map((task) => (task.id === taskId ? updatedTask : task)) + ); + setIsEditing(null); + setEditTaskName(""); + setShouldRefetch(true); + toast.success("Task updated successfully"); + } else { + toast.error("Failed to update task"); + } + } catch (error) { + toast.error("Failed to update task"); + console.error("Error updating task:", error); + } + }; + + /** + * Handles the submission of an edited task + * + * @function handleEditTaskSubmit + * @param {Event} e - Keydown event + * @param {string} taskId - ID of the task being edited + */ const handleEditTaskSubmit = (e, taskId) => { - if (e.key === 'Enter') { + if (e.key === "Enter") { e.preventDefault(); saveEditedTask(taskId); } }; + /** + * Handles the submission of a new task + * + * @function handleAddTaskSubmit + * @param {Event} e - Keydown event + */ const handleAddTaskSubmit = (e) => { - if (e.key === 'Enter') { + if (e.key === "Enter") { e.preventDefault(); - addTask(); + handleAddTask(); } }; return ( - + - - - - + + - -
-
Tasks
-
Add, edit, select for session or delete tasks
-
-
- {tasks.map(task => ( -
-
- + setIsPopoverOpen(false)} + variant="text" + className="rounded-full w-24 h-24 ml-[32px] transition-opacity duration-500" + > + + +
+ +
+ {isLoading ? ( +
+
Loading tasks...
+
+ ) : tasks.length === 0 ? ( +
No tasks available
+ ) : ( + tasks.map((task) => ( +
+ + {isEditing === task.taskId ? ( + handleEditTaskSubmit(e, task.taskId)} + autoFocus + className="flex-1 bg-gray-600 text-white" + /> ) : ( - + {task.title} )} - - {isEditing === task.id ? ( - handleEditTaskSubmit(e, task.id)} - className="bg-gray-800 border border-gray-600 rounded-md text-white p-1 w-full" - autoFocus - /> - ) : ( - {task.name} - )} -
-
- - - -
-
- ))} -
-
- setNewTask(e.target.value)} - placeholder="I want..." - className="bg-gray-800 border border-gray-600 rounded-md text-white p-2 w-full" - onKeyDown={handleAddTaskSubmit} - /> - -
- + + +
+ )) + )} + +
+ setNewTask(e.target.value)} + onKeyDown={handleAddTaskSubmit} + /> + +
+
+ )}
); }; +TaskPopover.propTypes = { + isActive: PropTypes.bool.isRequired, + isVisible: PropTypes.bool.isRequired +}; + export default TaskPopover; diff --git a/frontend/src/config/config.js b/frontend/src/config/config.js index c2e7ed6..1b098b1 100644 --- a/frontend/src/config/config.js +++ b/frontend/src/config/config.js @@ -1 +1 @@ -export const API_BASE_URL = "https://.execute-api..amazonaws.com/dev"; \ No newline at end of file +export const API_BASE_URL = import.meta.env.VITE_API_BASE_URL; diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index 75dc1d4..26f71fd 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -12,7 +12,8 @@ ReactDOM.createRoot(document.getElementById("root")).render( domain="dev-6zeb418i7xs8g1lc.us.auth0.com" clientId="I6OcR4a74Bw97KHAJ6IpfWrEu5GcV2cz" authorizationParams={{ - redirect_uri: window.location.origin + redirect_uri: window.location.origin, + audience: 'focusflow-audience' }} >