├── .gitignore ├── docs └── workflow.png ├── functions ├── send-api-request │ ├── package.json │ ├── index.js │ └── package-lock.json ├── send-email-sendgrid │ ├── package.json │ └── index.js ├── parse-post │ ├── package.json │ ├── index.js │ └── package-lock.json ├── identify-new-content │ ├── package.json │ └── index.js └── load-cross-posts │ ├── package.json │ ├── index.js │ └── package-lock.json ├── layers ├── index.js └── package.json ├── template.yaml ├── README.md └── workflows └── cross-post.asl.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .aws-sam/ 3 | samconfig.toml -------------------------------------------------------------------------------- /docs/workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-community-projects/blog-crossposting-automation/HEAD/docs/workflow.png -------------------------------------------------------------------------------- /functions/send-api-request/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "send-api-request", 3 | "version": "1.0.0", 4 | "description": "Sends an API request via axios", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "allenheltondev", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "axios": "^1.2.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /functions/send-email-sendgrid/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "send-email-sendgrid", 3 | "version": "1.0.0", 4 | "description": "Sends an email via sendgrid", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "allenheltondev", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@sendgrid/mail": "^7.7.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /functions/parse-post/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "parse-post", 3 | "version": "1.0.0", 4 | "description": "Parse a markdown file and convert it to a format for a specific blogging site", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "allenheltondev", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@github-docs/frontmatter": "^1.3.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /functions/identify-new-content/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "identify-new-content", 3 | "version": "1.0.0", 4 | "description": "Identifies if new content was recently published on your blog", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "allenheltondev", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "octokit": "^2.0.10", 13 | "@aws-sdk/client-sfn": "^3.229.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /functions/load-cross-posts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "load-cross-posts", 3 | "version": "1.0.0", 4 | "description": "Bootstrap your existing articles into the database", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "allenheltondev", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@aws-sdk/client-dynamodb": "^3.229.0", 13 | "@aws-sdk/util-dynamodb": "^3.229.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /layers/index.js: -------------------------------------------------------------------------------- 1 | const { SecretsManagerClient, GetSecretValueCommand } = require('@aws-sdk/client-secrets-manager'); 2 | 3 | const secrets = new SecretsManagerClient(); 4 | let cachedSecrets; 5 | 6 | exports.getSecret = async (secretKey) => { 7 | if (cachedSecrets) { 8 | return cachedSecrets[secretKey]; 9 | } else { 10 | const secretResponse = await secrets.send(new GetSecretValueCommand({ SecretId: process.env.SECRET_ID })); 11 | if (secretResponse) { 12 | cachedSecrets = JSON.parse(secretResponse.SecretString); 13 | return cachedSecrets[secretKey]; 14 | } 15 | } 16 | }; -------------------------------------------------------------------------------- /layers/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dependency-layer", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "allenheltondev", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@aws-sdk/client-dynamodb": "^3.231.0", 13 | "@aws-sdk/client-secrets-manager": "^3.231.0", 14 | "@aws-sdk/client-sfn": "^3.231.0", 15 | "@aws-sdk/util-dynamodb": "^3.231.0", 16 | "@github-docs/frontmatter": "^1.3.1", 17 | "@sendgrid/client": "^7.7.0", 18 | "@sendgrid/mail": "^7.7.0", 19 | "axios": "^1.2.1", 20 | "handlebars": "^4.7.7", 21 | "octokit": "^2.0.10", 22 | "showdown": "^2.1.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /functions/send-email-sendgrid/index.js: -------------------------------------------------------------------------------- 1 | const sendgrid = require('@sendgrid/mail'); 2 | const shared = require('/opt/nodejs/index'); 3 | 4 | exports.handler = async (state) => { 5 | try { 6 | const apiKey = await shared.getSecret('sendgrid'); 7 | sendgrid.setApiKey(apiKey); 8 | 9 | let { to, subject, html, text } = state; 10 | if(state.detail){ 11 | to = state.detail.to; 12 | subject = state.detail.subject; 13 | html = state.detail.html; 14 | text = state.detail.text; 15 | } 16 | 17 | await sendMessage(to, subject, html, text); 18 | } catch (err) { 19 | console.error(err); 20 | } 21 | }; 22 | 23 | const sendMessage = async (to, subject, html, text) => { 24 | const msg = { 25 | to: to, 26 | from: process.env.FROM_EMAIL, 27 | subject: subject, 28 | ...html && { 29 | content: [ 30 | { 31 | type: 'text/html', 32 | value: html 33 | } 34 | ] 35 | }, 36 | ...text && { text: text } 37 | }; 38 | 39 | await sendgrid.send(msg); 40 | }; -------------------------------------------------------------------------------- /functions/load-cross-posts/index.js: -------------------------------------------------------------------------------- 1 | const { PutItemCommand, DynamoDBClient } = require('@aws-sdk/client-dynamodb'); 2 | const { marshall } = require('@aws-sdk/util-dynamodb'); 3 | 4 | const ddb = new DynamoDBClient(); 5 | 6 | exports.handler = async (event) => { 7 | try { 8 | const data = getData(); 9 | await Promise.allSettled(data.map(async (item) => { 10 | await addToDb(item); 11 | })); 12 | } catch (err) { 13 | console.error(err); 14 | } 15 | }; 16 | 17 | const addToDb = async (item) => { 18 | await ddb.send(new PutItemCommand({ 19 | TableName: process.env.TABLE_NAME, 20 | Item: marshall({ 21 | pk: item.url, 22 | sk: 'article', 23 | GSI1PK: 'article', 24 | GSI1SK: item.title, 25 | title: item.title, 26 | links: { 27 | url: item.url, 28 | ...item.devUrl && { devUrl: item.devUrl }, 29 | ...item.mediumUrl && { mediumUrl: item.mediumUrl }, 30 | ...item.hashnodeUrl && { hashnodeUrl: item.hashnodeUrl } 31 | } 32 | }) 33 | })); 34 | }; 35 | 36 | const getData = () => { 37 | return [ 38 | { 39 | title: '', 40 | devUrl: '<url of article on dev.to>', 41 | url: '<relative url of article on your blog>', 42 | mediumUrl: '<url of article on medium>', 43 | hashnodeUrl: '<url of article on hashnode>' 44 | } 45 | ] 46 | }; -------------------------------------------------------------------------------- /functions/send-api-request/index.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios').default; 2 | const shared = require('/opt/nodejs/index'); 3 | 4 | exports.handler = async (state) => { 5 | const authToken = await shared.getSecret(state.secretKey); 6 | if (!authToken) { 7 | throw new Error('Unable to get secret'); 8 | } 9 | 10 | const config = getAxiosConfig(state, authToken); 11 | const response = await axios.request(config); 12 | return response.data; 13 | }; 14 | 15 | const getAxiosConfig = (state, authToken) => { 16 | const config = { 17 | method: state.request.method, 18 | baseURL: state.request.baseUrl, 19 | headers: state.request.headers ?? {}, 20 | ...state.request.body && { data: state.request.body }, 21 | responseType: 'json', 22 | validateStatus: (status) => status < 400 23 | }; 24 | 25 | let authValue = authToken; 26 | if (state.auth.prefix) { 27 | authValue = `${state.auth.prefix} ${authToken}`; 28 | } 29 | 30 | if (state.auth.location == 'query') { 31 | config.baseURL = `${config.baseURL}?${state.auth.key}=${authValue}`; 32 | } else if (state.auth.location == 'header') { 33 | config.headers[state.auth.key] = authValue; 34 | } 35 | 36 | if (state.request.query) { 37 | const query = Object.entries(state.request.query).map(entry => `${entry[0]}=${entry[1]}`).join('&'); 38 | if (config.baseURL.includes('?')) { 39 | config.baseURL = `${config.baseURL}&${query}`; 40 | } else { 41 | config.baseURL = `${config.baseURL}?${query}`; 42 | } 43 | } 44 | 45 | return config; 46 | }; -------------------------------------------------------------------------------- /functions/identify-new-content/index.js: -------------------------------------------------------------------------------- 1 | const { Octokit } = require('octokit'); 2 | const { SFNClient, StartExecutionCommand } = require('@aws-sdk/client-sfn'); 3 | const shared = require('/opt/nodejs/index'); 4 | 5 | const sfn = new SFNClient(); 6 | let octokit; 7 | 8 | exports.handler = async (event) => { 9 | try { 10 | await initializeOctokit(); 11 | 12 | const recentCommits = await getRecentCommits(); 13 | if (recentCommits.length) { 14 | const newContent = await getNewContent(recentCommits); 15 | if (newContent.length) { 16 | const data = await getContentData(newContent); 17 | await processNewContent(data); 18 | } 19 | } 20 | } catch (err) { 21 | console.error(err); 22 | } 23 | }; 24 | 25 | const initializeOctokit = async () => { 26 | if (!octokit) { 27 | const gitHubSecret = await shared.getSecret('github'); 28 | octokit = new Octokit({ auth: gitHubSecret }); 29 | } 30 | }; 31 | 32 | const getRecentCommits = async () => { 33 | const timeTolerance = Number(process.env.COMMIT_TIME_TOLERANCE_MINUTES); 34 | const date = new Date(); 35 | date.setMinutes(date.getMinutes() - timeTolerance); 36 | 37 | const result = await octokit.rest.repos.listCommits({ 38 | owner: process.env.OWNER, 39 | repo: process.env.REPO, 40 | path: process.env.PATH, 41 | since: date.toISOString() 42 | }); 43 | 44 | const newPostCommits = result.data.filter(c => c.commit.message.toLowerCase().startsWith(process.env.NEW_CONTENT_INDICATOR)); 45 | return newPostCommits.map(d => d.sha); 46 | }; 47 | 48 | const getNewContent = async (commits) => { 49 | const newContent = await Promise.allSettled(commits.map(async (commit) => { 50 | const commitDetail = await octokit.rest.repos.getCommit({ 51 | owner: process.env.OWNER, 52 | repo: process.env.REPO, 53 | ref: commit 54 | }); 55 | 56 | const newFiles = commitDetail.data.files.filter(f => f.status == 'added' && f.filename.startsWith(`${process.env.PATH}/`)); 57 | return newFiles.map(p => { 58 | return { 59 | fileName: p.filename, 60 | commit: commit 61 | } 62 | }); 63 | })); 64 | 65 | let content = []; 66 | for (const result of newContent) { 67 | if (result.status == 'rejected') { 68 | console.error(result.reason); 69 | } else { 70 | content = [...content, ...result.value]; 71 | } 72 | } 73 | 74 | return content; 75 | }; 76 | 77 | const getContentData = async (newContent) => { 78 | const contentData = await Promise.allSettled(newContent.map(async (content) => { 79 | const postContent = await octokit.request('GET /repos/{owner}/{repo}/contents/{path}', { 80 | owner: process.env.OWNER, 81 | repo: process.env.REPO, 82 | path: content.fileName 83 | }); 84 | 85 | const buffer = Buffer.from(postContent.data.content, 'base64'); 86 | const data = buffer.toString('utf8'); 87 | 88 | return { 89 | fileName: content.fileName, 90 | commit: content.commit, 91 | content: data, 92 | sendStatusEmail: process.env.SEND_STATUS_EMAIL == 'true' 93 | }; 94 | })); 95 | 96 | let allContent = []; 97 | for (const result of contentData) { 98 | if (result.status == 'rejected') { 99 | console.error(result.reason); 100 | } else { 101 | allContent.push(result.value); 102 | } 103 | } 104 | 105 | return allContent; 106 | }; 107 | 108 | const processNewContent = async (newContent) => { 109 | const executions = await Promise.allSettled(newContent.map(async (content) => { 110 | const command = new StartExecutionCommand({ 111 | stateMachineArn: process.env.STATE_MACHINE_ARN, 112 | input: JSON.stringify(content) 113 | }); 114 | await sfn.send(command); 115 | })); 116 | 117 | for (const execution of executions) { 118 | if (execution.status == 'rejected') { 119 | console.error(execution.reason); 120 | } 121 | } 122 | }; -------------------------------------------------------------------------------- /functions/parse-post/index.js: -------------------------------------------------------------------------------- 1 | const frontmatter = require('@github-docs/frontmatter'); 2 | 3 | exports.handler = async (state) => { 4 | const details = frontmatter(state.post); 5 | const links = getLinks(details.content); 6 | const tweets = getTweets(details.content); 7 | 8 | let payload; 9 | switch (state.format.toLowerCase()) { 10 | case 'medium': 11 | payload = formatMediumData(details, state.articleCatalog, links, tweets); 12 | break; 13 | case 'dev': 14 | payload = formatDevData(details, state.articleCatalog, links, tweets); 15 | break; 16 | case 'hashnode': 17 | payload = formatHashnodeData(details, state.articleCatalog, links, tweets); 18 | break; 19 | } 20 | return { 21 | payload, 22 | url: `/${details.data.slug.replace(/^\/|\/$/g, '')}` 23 | }; 24 | }; 25 | 26 | const formatMediumData = (postDetail, articleCatalog, links, tweets) => { 27 | let mediumContent = `\n# ${postDetail.data.title}\n` 28 | + `#### ${postDetail.data.description}\n` 29 | + `![${postDetail.data.image_attribution ?? ''}](${postDetail.data.image})\n` 30 | + `${postDetail.content.slice(0)}`; 31 | 32 | for (const link of links) { 33 | const replacement = articleCatalog.find(c => c.links.M.url.S == link[1]); 34 | if (replacement) { 35 | if (replacement.links.M.mediumUrl && replacement.links.M.mediumUrl.S) { 36 | mediumContent = mediumContent.replace(link[1], replacement.links.M.mediumUrl.S); 37 | } else { 38 | mediumContent = mediumContent.replace(link[1], `${process.env.BLOG_BASE_URL}${replacement.links.M.url.S}`); 39 | } 40 | } 41 | } 42 | 43 | for (const tweet of tweets) { 44 | const tweetUrl = getTweetUrl(tweet); 45 | mediumContent = mediumContent.replace(tweet[0], tweetUrl); 46 | } 47 | 48 | const mediumData = { 49 | title: postDetail.data.title, 50 | contentFormat: 'markdown', 51 | tags: [...postDetail.data.categories, ...postDetail.data.tags], 52 | canonicalUrl: `${process.env.BLOG_BASE_URL}/${postDetail.data.slug.replace(/^\/|\/$/g, '')}`, 53 | publishStatus: 'draft', 54 | notifyFollowers: true, 55 | content: mediumContent 56 | }; 57 | 58 | return mediumData; 59 | }; 60 | 61 | const formatDevData = (postDetail, articleCatalog, links, tweets) => { 62 | let devContent = postDetail.content.slice(0); 63 | for (const link of links) { 64 | const replacement = articleCatalog.find(c => c.links.M.url.S == link[1]); 65 | if (replacement) { 66 | if (replacement.links.M.devUrl && replacement.links.M.devUrl.S) { 67 | devContent = devContent.replace(link[1], replacement.links.M.devUrl.S); 68 | } else { 69 | devContent = devContent.replace(link[1], `${process.env.BLOG_BASE_URL}${replacement.links.M.url.S}`); 70 | } 71 | } 72 | } 73 | 74 | for (const tweet of tweets) { 75 | const tweetUrl = getTweetUrl(tweet); 76 | devContent = devContent.replace(tweet[0], `{% twitter ${tweetUrl} %}`); 77 | } 78 | 79 | const devData = { 80 | title: postDetail.data.title, 81 | published: true, 82 | main_image: postDetail.data.image, 83 | canonical_url: `${process.env.BLOG_BASE_URL}/${postDetail.data.slug.replace(/^\/|\/$/g, '')}`, 84 | description: postDetail.data.description, 85 | tags: [...postDetail.data.categories.map(c => c.replace(/ /g, '')), ...postDetail.data.tags.map(t => t.toString().replace(/ /g, ''))], 86 | ...process.env.DEV_ORG_ID && { organization_id: process.env.DEV_ORG_ID }, 87 | body_markdown: devContent 88 | }; 89 | 90 | return { article: devData }; 91 | }; 92 | 93 | const formatHashnodeData = (postDetail, articleCatalog, links, tweets) => { 94 | let hashnodeContent = postDetail.content.slice(0); 95 | for (const link of links) { 96 | const replacement = articleCatalog.find(c => c.links.M.url.S == link[1]); 97 | if (replacement) { 98 | if (replacement.links.M.hashnodeUrl && replacement.links.M.hashnodeUrl.S) { 99 | hashnodeContent = hashnodeContent.replace(link[1], replacement.links.M.hashnodeUrl.S); 100 | } else { 101 | hashnodeContent = hashnodeContent.replace(link[1], `${process.env.BLOG_BASE_URL}${replacement.links.M.url.S}`); 102 | } 103 | } 104 | } 105 | 106 | for (const tweet of tweets) { 107 | const tweetUrl = getTweetUrl(tweet); 108 | hashnodeContent = hashnodeContent.replace(tweet[0], `%[${tweetUrl}]`); 109 | } 110 | 111 | const hashnodeData = { 112 | query: 'mutation createPublicationStory($input: CreateStoryInput!, $publicationId: String!){ createPublicationStory( input: $input, publicationId: $publicationId ){ code success message post { slug }} }', 113 | variables: { 114 | publicationId: process.env.HASHNODE_PUBLICATION_ID, 115 | input: { 116 | title: postDetail.data.title, 117 | contentMarkdown: hashnodeContent, 118 | coverImageURL: postDetail.data.image, 119 | isRepublished: { 120 | originalArticleURL: `${process.env.BLOG_BASE_URL}/${postDetail.data.slug.replace(/^\/|\/$/g, '')}` 121 | }, 122 | tags: [], 123 | subtitle: postDetail.data.description 124 | }, 125 | } 126 | } 127 | 128 | return hashnodeData; 129 | }; 130 | 131 | const getLinks = (postContent) => { 132 | const linkMatches = postContent.matchAll(/\(([^\)]*)\)/g); 133 | return linkMatches; 134 | }; 135 | 136 | const getTweets = (postContent) => { 137 | const tweetMatches = postContent.matchAll(/\{\{<tweet user="([a-zA-Z0-9]*)" id="([\d]*)">\}\}/g); 138 | return tweetMatches; 139 | }; 140 | 141 | const getTweetUrl = (tweet) => { 142 | return `https://twitter.com/${tweet[1]}/status/${tweet[2]}`; 143 | } -------------------------------------------------------------------------------- /functions/send-api-request/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "send-api-request", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "send-api-request", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "axios": "^1.2.1" 13 | } 14 | }, 15 | "node_modules/asynckit": { 16 | "version": "0.4.0", 17 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 18 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 19 | "dev": true 20 | }, 21 | "node_modules/axios": { 22 | "version": "1.2.2", 23 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz", 24 | "integrity": "sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==", 25 | "dev": true, 26 | "dependencies": { 27 | "follow-redirects": "^1.15.0", 28 | "form-data": "^4.0.0", 29 | "proxy-from-env": "^1.1.0" 30 | } 31 | }, 32 | "node_modules/combined-stream": { 33 | "version": "1.0.8", 34 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 35 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 36 | "dev": true, 37 | "dependencies": { 38 | "delayed-stream": "~1.0.0" 39 | }, 40 | "engines": { 41 | "node": ">= 0.8" 42 | } 43 | }, 44 | "node_modules/delayed-stream": { 45 | "version": "1.0.0", 46 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 47 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 48 | "dev": true, 49 | "engines": { 50 | "node": ">=0.4.0" 51 | } 52 | }, 53 | "node_modules/follow-redirects": { 54 | "version": "1.15.2", 55 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 56 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 57 | "dev": true, 58 | "funding": [ 59 | { 60 | "type": "individual", 61 | "url": "https://github.com/sponsors/RubenVerborgh" 62 | } 63 | ], 64 | "engines": { 65 | "node": ">=4.0" 66 | }, 67 | "peerDependenciesMeta": { 68 | "debug": { 69 | "optional": true 70 | } 71 | } 72 | }, 73 | "node_modules/form-data": { 74 | "version": "4.0.0", 75 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 76 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 77 | "dev": true, 78 | "dependencies": { 79 | "asynckit": "^0.4.0", 80 | "combined-stream": "^1.0.8", 81 | "mime-types": "^2.1.12" 82 | }, 83 | "engines": { 84 | "node": ">= 6" 85 | } 86 | }, 87 | "node_modules/mime-db": { 88 | "version": "1.52.0", 89 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 90 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 91 | "dev": true, 92 | "engines": { 93 | "node": ">= 0.6" 94 | } 95 | }, 96 | "node_modules/mime-types": { 97 | "version": "2.1.35", 98 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 99 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 100 | "dev": true, 101 | "dependencies": { 102 | "mime-db": "1.52.0" 103 | }, 104 | "engines": { 105 | "node": ">= 0.6" 106 | } 107 | }, 108 | "node_modules/proxy-from-env": { 109 | "version": "1.1.0", 110 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 111 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 112 | "dev": true 113 | } 114 | }, 115 | "dependencies": { 116 | "asynckit": { 117 | "version": "0.4.0", 118 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 119 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 120 | "dev": true 121 | }, 122 | "axios": { 123 | "version": "1.2.2", 124 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz", 125 | "integrity": "sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==", 126 | "dev": true, 127 | "requires": { 128 | "follow-redirects": "^1.15.0", 129 | "form-data": "^4.0.0", 130 | "proxy-from-env": "^1.1.0" 131 | } 132 | }, 133 | "combined-stream": { 134 | "version": "1.0.8", 135 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 136 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 137 | "dev": true, 138 | "requires": { 139 | "delayed-stream": "~1.0.0" 140 | } 141 | }, 142 | "delayed-stream": { 143 | "version": "1.0.0", 144 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 145 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 146 | "dev": true 147 | }, 148 | "follow-redirects": { 149 | "version": "1.15.2", 150 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 151 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 152 | "dev": true 153 | }, 154 | "form-data": { 155 | "version": "4.0.0", 156 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 157 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 158 | "dev": true, 159 | "requires": { 160 | "asynckit": "^0.4.0", 161 | "combined-stream": "^1.0.8", 162 | "mime-types": "^2.1.12" 163 | } 164 | }, 165 | "mime-db": { 166 | "version": "1.52.0", 167 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 168 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 169 | "dev": true 170 | }, 171 | "mime-types": { 172 | "version": "2.1.35", 173 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 174 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 175 | "dev": true, 176 | "requires": { 177 | "mime-db": "1.52.0" 178 | } 179 | }, 180 | "proxy-from-env": { 181 | "version": "1.1.0", 182 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 183 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 184 | "dev": true 185 | } 186 | } 187 | } 188 | -------------------------------------------------------------------------------- /functions/parse-post/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "parse-post", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "parse-post", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@github-docs/frontmatter": "^1.3.1" 13 | } 14 | }, 15 | "node_modules/@github-docs/frontmatter": { 16 | "version": "1.3.1", 17 | "resolved": "https://registry.npmjs.org/@github-docs/frontmatter/-/frontmatter-1.3.1.tgz", 18 | "integrity": "sha512-1BFouSuheb7GelUDlLmv/Qrpi8Ybtyfch91grZbqx+aGzDEh7CAna+mAHIYaaN3HppNB8JnppGvX2DXM4v0pzQ==", 19 | "dev": true, 20 | "dependencies": { 21 | "gray-matter": "^4.0.2", 22 | "lodash": "^4.17.15", 23 | "revalidator": "^0.3.1" 24 | } 25 | }, 26 | "node_modules/argparse": { 27 | "version": "1.0.10", 28 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 29 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 30 | "dev": true, 31 | "dependencies": { 32 | "sprintf-js": "~1.0.2" 33 | } 34 | }, 35 | "node_modules/esprima": { 36 | "version": "4.0.1", 37 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 38 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 39 | "dev": true, 40 | "bin": { 41 | "esparse": "bin/esparse.js", 42 | "esvalidate": "bin/esvalidate.js" 43 | }, 44 | "engines": { 45 | "node": ">=4" 46 | } 47 | }, 48 | "node_modules/extend-shallow": { 49 | "version": "2.0.1", 50 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 51 | "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", 52 | "dev": true, 53 | "dependencies": { 54 | "is-extendable": "^0.1.0" 55 | }, 56 | "engines": { 57 | "node": ">=0.10.0" 58 | } 59 | }, 60 | "node_modules/gray-matter": { 61 | "version": "4.0.3", 62 | "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", 63 | "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", 64 | "dev": true, 65 | "dependencies": { 66 | "js-yaml": "^3.13.1", 67 | "kind-of": "^6.0.2", 68 | "section-matter": "^1.0.0", 69 | "strip-bom-string": "^1.0.0" 70 | }, 71 | "engines": { 72 | "node": ">=6.0" 73 | } 74 | }, 75 | "node_modules/is-extendable": { 76 | "version": "0.1.1", 77 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 78 | "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", 79 | "dev": true, 80 | "engines": { 81 | "node": ">=0.10.0" 82 | } 83 | }, 84 | "node_modules/js-yaml": { 85 | "version": "3.14.1", 86 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 87 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 88 | "dev": true, 89 | "dependencies": { 90 | "argparse": "^1.0.7", 91 | "esprima": "^4.0.0" 92 | }, 93 | "bin": { 94 | "js-yaml": "bin/js-yaml.js" 95 | } 96 | }, 97 | "node_modules/kind-of": { 98 | "version": "6.0.3", 99 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 100 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 101 | "dev": true, 102 | "engines": { 103 | "node": ">=0.10.0" 104 | } 105 | }, 106 | "node_modules/lodash": { 107 | "version": "4.17.21", 108 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 109 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 110 | "dev": true 111 | }, 112 | "node_modules/revalidator": { 113 | "version": "0.3.1", 114 | "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.3.1.tgz", 115 | "integrity": "sha512-orq+Nw+V5pDpQwGEuN2n1AgJ+0A8WqhFHKt5KgkxfAowUKgO1CWV32IR3TNB4g9/FX3gJt9qBJO8DYlwonnB0Q==", 116 | "dev": true, 117 | "engines": { 118 | "node": ">= 0.8.0" 119 | } 120 | }, 121 | "node_modules/section-matter": { 122 | "version": "1.0.0", 123 | "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", 124 | "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", 125 | "dev": true, 126 | "dependencies": { 127 | "extend-shallow": "^2.0.1", 128 | "kind-of": "^6.0.0" 129 | }, 130 | "engines": { 131 | "node": ">=4" 132 | } 133 | }, 134 | "node_modules/sprintf-js": { 135 | "version": "1.0.3", 136 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 137 | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 138 | "dev": true 139 | }, 140 | "node_modules/strip-bom-string": { 141 | "version": "1.0.0", 142 | "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", 143 | "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", 144 | "dev": true, 145 | "engines": { 146 | "node": ">=0.10.0" 147 | } 148 | } 149 | }, 150 | "dependencies": { 151 | "@github-docs/frontmatter": { 152 | "version": "1.3.1", 153 | "resolved": "https://registry.npmjs.org/@github-docs/frontmatter/-/frontmatter-1.3.1.tgz", 154 | "integrity": "sha512-1BFouSuheb7GelUDlLmv/Qrpi8Ybtyfch91grZbqx+aGzDEh7CAna+mAHIYaaN3HppNB8JnppGvX2DXM4v0pzQ==", 155 | "dev": true, 156 | "requires": { 157 | "gray-matter": "^4.0.2", 158 | "lodash": "^4.17.15", 159 | "revalidator": "^0.3.1" 160 | } 161 | }, 162 | "argparse": { 163 | "version": "1.0.10", 164 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 165 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 166 | "dev": true, 167 | "requires": { 168 | "sprintf-js": "~1.0.2" 169 | } 170 | }, 171 | "esprima": { 172 | "version": "4.0.1", 173 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 174 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 175 | "dev": true 176 | }, 177 | "extend-shallow": { 178 | "version": "2.0.1", 179 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 180 | "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", 181 | "dev": true, 182 | "requires": { 183 | "is-extendable": "^0.1.0" 184 | } 185 | }, 186 | "gray-matter": { 187 | "version": "4.0.3", 188 | "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", 189 | "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", 190 | "dev": true, 191 | "requires": { 192 | "js-yaml": "^3.13.1", 193 | "kind-of": "^6.0.2", 194 | "section-matter": "^1.0.0", 195 | "strip-bom-string": "^1.0.0" 196 | } 197 | }, 198 | "is-extendable": { 199 | "version": "0.1.1", 200 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 201 | "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", 202 | "dev": true 203 | }, 204 | "js-yaml": { 205 | "version": "3.14.1", 206 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 207 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 208 | "dev": true, 209 | "requires": { 210 | "argparse": "^1.0.7", 211 | "esprima": "^4.0.0" 212 | } 213 | }, 214 | "kind-of": { 215 | "version": "6.0.3", 216 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 217 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 218 | "dev": true 219 | }, 220 | "lodash": { 221 | "version": "4.17.21", 222 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 223 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 224 | "dev": true 225 | }, 226 | "revalidator": { 227 | "version": "0.3.1", 228 | "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.3.1.tgz", 229 | "integrity": "sha512-orq+Nw+V5pDpQwGEuN2n1AgJ+0A8WqhFHKt5KgkxfAowUKgO1CWV32IR3TNB4g9/FX3gJt9qBJO8DYlwonnB0Q==", 230 | "dev": true 231 | }, 232 | "section-matter": { 233 | "version": "1.0.0", 234 | "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", 235 | "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", 236 | "dev": true, 237 | "requires": { 238 | "extend-shallow": "^2.0.1", 239 | "kind-of": "^6.0.0" 240 | } 241 | }, 242 | "sprintf-js": { 243 | "version": "1.0.3", 244 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 245 | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 246 | "dev": true 247 | }, 248 | "strip-bom-string": { 249 | "version": "1.0.0", 250 | "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", 251 | "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", 252 | "dev": true 253 | } 254 | } 255 | } 256 | -------------------------------------------------------------------------------- /template.yaml: -------------------------------------------------------------------------------- 1 | AWSTemplateFormatVersion: '2010-09-09' 2 | Transform: AWS::Serverless-2016-10-31 3 | Description: > 4 | Cross post blogs to Medium, Dev.to, and Hashnode triggered by a successful Amplify build 5 | 6 | Parameters: 7 | TableName: 8 | Type: String 9 | Default: blog 10 | GSI1: 11 | Type: String 12 | Default: GSI1 13 | GitHubPAT: 14 | Type: String 15 | Description: PAT to load blog markdown content from your repository 16 | GitHubOwner: 17 | Type: String 18 | Description: Owner's username of the GitHub repository that holds blog content 19 | GitHubRepo: 20 | Type: String 21 | Description: Repository name of the blog 22 | AmplifyProjectId: 23 | Type: String 24 | Description: Identifier of the Amplify project that triggers the cross-posting 25 | MediumApiKey: 26 | Type: String 27 | Description: API key used to manipulate data in your Medium account 28 | MediumPublicationId: 29 | Type: String 30 | Description: Identifier of the publication you wish to submit to on Medium 31 | Default: '' 32 | MediumAuthorId: 33 | Type: String 34 | Description: Identifier of your user on Medium 35 | Default: '' 36 | DevApiKey: 37 | Type: String 38 | Description: API key used to manipulate data in your Dev.to account 39 | DevOrganizationId: 40 | Type: String 41 | Description: Identifier of the publication you wish to submit to on Dev.to 42 | Default: '' 43 | HashnodeApiKey: 44 | Type: String 45 | Description: API key used to manipulate data in your Hashnode account 46 | HashnodePublicationId: 47 | Type: String 48 | Description: Identifier for your blog publication on Hashnode 49 | HashnodeBlogUrl: 50 | Type: String 51 | Description: Base url of your blog hosted in Hashnode 52 | BlogBaseUrl: 53 | Type: String 54 | Description: Base url of your blog on your personal site 55 | BlogContentPath: 56 | Type: String 57 | Description: Relative path from the root directory to the blog content folder in your GitHub repo 58 | SendgridApiKey: 59 | Type: String 60 | Default: '' 61 | Description: Api Key of the SendGrid account that will send the status report when cross-posting is complete 62 | NotificationEmail: 63 | Type: String 64 | Default: '' 65 | Description: Email address to notify when cross posting is complete 66 | SendgridFromEmail: 67 | Type: String 68 | Default: '' 69 | Description: Email address for SendGrid that sends you the status email 70 | 71 | Conditions: 72 | ShouldSendStatusEmail: 73 | !Not [!Equals [ !Ref SendgridApiKey, '']] 74 | PostToMediumPublication: 75 | !Not [!Equals [!Ref MediumPublicationId, '']] 76 | 77 | Globals: 78 | Function: 79 | Runtime: nodejs14.x #set to this because Amplify build image has SAM version that supports up to 14 80 | Architectures: 81 | - arm64 82 | Tracing: Active 83 | Timeout: 15 84 | MemorySize: 1024 85 | Handler: index.handler 86 | Layers: 87 | - !Ref SharedLayer 88 | Environment: 89 | Variables: 90 | AWS_NODEJS_CONNECTION_REUSE_ENABLED: 1 91 | 92 | Resources: 93 | BlogTable: 94 | Type: AWS::DynamoDB::Table 95 | Properties: 96 | TableName: !Ref TableName 97 | BillingMode: PAY_PER_REQUEST 98 | KeySchema: 99 | - AttributeName: pk 100 | KeyType: HASH 101 | - AttributeName: sk 102 | KeyType: RANGE 103 | AttributeDefinitions: 104 | - AttributeName: pk 105 | AttributeType: S 106 | - AttributeName: sk 107 | AttributeType: S 108 | - AttributeName: GSI1PK 109 | AttributeType: S 110 | - AttributeName: GSI1SK 111 | AttributeType: S 112 | GlobalSecondaryIndexes: 113 | - IndexName: !Ref GSI1 114 | KeySchema: 115 | - AttributeName: GSI1PK 116 | KeyType: HASH 117 | - AttributeName: GSI1SK 118 | KeyType: RANGE 119 | Projection: 120 | ProjectionType: ALL 121 | 122 | SharedLayer: 123 | Type: AWS::Serverless::LayerVersion 124 | Metadata: 125 | BuildMethod: nodejs14.x 126 | BuildArchitecture: arm64 127 | Properties: 128 | ContentUri: layers/ 129 | CompatibleRuntimes: 130 | - nodejs14.x 131 | 132 | ParsePostFunction: 133 | Type: AWS::Serverless::Function 134 | Properties: 135 | CodeUri: functions/parse-post 136 | Policies: 137 | - AWSLambdaBasicExecutionRole 138 | Environment: 139 | Variables: 140 | BLOG_BASE_URL: !Ref BlogBaseUrl 141 | HASHNODE_PUBLICATION_ID: !Ref HashnodePublicationId 142 | DEV_ORG_ID: !Ref DevOrganizationId 143 | 144 | SendApiRequestFunction: 145 | Type: AWS::Serverless::Function 146 | Properties: 147 | CodeUri: functions/send-api-request 148 | Policies: 149 | - AWSLambdaBasicExecutionRole 150 | - Version: 2012-10-17 151 | Statement: 152 | - Effect: Allow 153 | Action: 154 | - secretsmanager:GetSecretValue 155 | Resource: !Ref AuthTokensSecret 156 | Environment: 157 | Variables: 158 | SECRET_ID: !Ref AuthTokensSecret 159 | 160 | AuthTokensSecret: 161 | Type: AWS::SecretsManager::Secret 162 | Properties: 163 | SecretString: 164 | Fn::Sub: 165 | - |- 166 | { 167 | "medium": "${MediumApiKey}", 168 | "dev": "${DevApiKey}", 169 | "hashnode": "${HashnodeApiKey}", 170 | "github": "${GitHubPAT}", 171 | "sendgrid":"${SengridApiKey}" 172 | } 173 | - MediumApiKey: !Ref MediumApiKey 174 | DevApiKey: !Ref DevApiKey 175 | HashnodeApiKey: !Ref HashnodeApiKey 176 | GitHubPAT: !Ref GitHubPAT 177 | SengridApiKey: !Ref SendgridApiKey 178 | 179 | LoadCrossPostsFunction: 180 | Type: AWS::Serverless::Function 181 | Properties: 182 | CodeUri: functions/load-cross-posts 183 | Policies: 184 | - AWSLambdaBasicExecutionRole 185 | - Version: 2012-10-17 186 | Statement: 187 | - Effect: Allow 188 | Action: 189 | - dynamodb:PutItem 190 | Resource: !GetAtt BlogTable.Arn 191 | Environment: 192 | Variables: 193 | TABLE_NAME: !Ref TableName 194 | 195 | IdentifyNewArticlesFunction: 196 | Type: AWS::Serverless::Function 197 | Properties: 198 | CodeUri: functions/identify-new-content 199 | Policies: 200 | - AWSLambdaBasicExecutionRole 201 | - Version: 2012-10-17 202 | Statement: 203 | - Effect: Allow 204 | Action: 205 | - secretsmanager:GetSecretValue 206 | Resource: !Ref AuthTokensSecret 207 | - Effect: Allow 208 | Action: 209 | - states:StartExecution 210 | Resource: 211 | - !Ref CrossPostStateMachine 212 | Environment: 213 | Variables: 214 | SECRET_ID: !Ref AuthTokensSecret 215 | OWNER: !Ref GitHubOwner 216 | REPO: !Ref GitHubRepo 217 | COMMIT_TIME_TOLERANCE_MINUTES: 10 218 | STATE_MACHINE_ARN: !Ref CrossPostStateMachine 219 | PATH: !Ref BlogContentPath 220 | NEW_CONTENT_INDICATOR: "[blog]" 221 | SEND_STATUS_EMAIL: !If [ShouldSendStatusEmail, 'true', 'false'] 222 | Events: 223 | AmplifyBuildSuccessful: 224 | Type: EventBridgeRule 225 | Properties: 226 | Pattern: 227 | source: 228 | - aws.amplify 229 | detail-type: 230 | - Amplify Deployment Status Change 231 | detail: 232 | appId: 233 | - !Ref AmplifyProjectId 234 | jobStatus: 235 | - SUCCEED 236 | 237 | CrossPostStateMachine: 238 | Type: AWS::Serverless::StateMachine 239 | Properties: 240 | Type: STANDARD 241 | DefinitionUri: workflows/cross-post.asl.json 242 | DefinitionSubstitutions: 243 | DynamodbGetItem: !Sub arn:${AWS::Partition}:states:::dynamodb:getItem 244 | TableName: !Ref TableName 245 | DynamodbPutItem: !Sub arn:${AWS::Partition}:states:::dynamodb:putItem 246 | DynamodbQuery: !Sub arn:${AWS::Partition}:states:::aws-sdk:dynamodb:query 247 | IndexName: !Ref GSI1 248 | DynamodbUpdateItem: !Sub arn:${AWS::Partition}:states:::dynamodb:updateItem 249 | LambdaInvoke: !Sub arn:${AWS::Partition}:states:::lambda:invoke 250 | ParsePostFunction: !GetAtt ParsePostFunction.Arn 251 | SendApiRequestFunction: !GetAtt SendApiRequestFunction.Arn 252 | AdminEmail: !Ref NotificationEmail 253 | HashnodeBlogUrl: !Ref HashnodeBlogUrl 254 | EventBridgePutEvents: !Sub arn:${AWS::Partition}:states:::events:putEvents 255 | ExecutionUrl: !Sub https://${AWS::Region}.console.${AWS::Partition}.amazon.com/states/home?region=${AWS::Region}#/v2/executions/details 256 | MediumUrl: !If [ PostToMediumPublication, !Sub 'https://api.medium.com/v1/publications/${MediumPublicationId}/posts', !Sub 'https://api.medium.com/v1/users/${MediumAuthorId}/posts' ] 257 | Policies: 258 | - Version: 2012-10-17 259 | Statement: 260 | - Effect: Allow 261 | Action: 262 | - dynamodb:getItem 263 | - dynamodb:putItem 264 | - dynamodb:updateItem 265 | Resource: 266 | - !Sub arn:${AWS::Partition}:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${TableName} 267 | - Effect: Allow 268 | Action: 269 | - dynamodb:query 270 | Resource: 271 | - !Sub arn:${AWS::Partition}:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${TableName}/index/${GSI1} 272 | - Effect: Allow 273 | Action: 274 | - lambda:InvokeFunction 275 | Resource: 276 | - !GetAtt ParsePostFunction.Arn 277 | - !GetAtt SendApiRequestFunction.Arn 278 | - Effect: Allow 279 | Action: 280 | - events:PutEvents 281 | Resource: 282 | - !Sub arn:${AWS::Partition}:events:${AWS::Region}:${AWS::AccountId}:event-bus/default 283 | 284 | SendEmailFunction: 285 | Type: AWS::Serverless::Function 286 | Properties: 287 | CodeUri: functions/send-email-sendgrid 288 | Policies: 289 | - AWSLambdaBasicExecutionRole 290 | - Version: 2012-10-17 291 | Statement: 292 | - Effect: Allow 293 | Action: 294 | - secretsmanager:GetSecretValue 295 | Resource: !Ref AuthTokensSecret 296 | Environment: 297 | Variables: 298 | SECRET_ID: !Ref AuthTokensSecret 299 | FROM_EMAIL: !Ref SendgridFromEmail 300 | Events: 301 | SendMailEvent: 302 | Type: EventBridgeRule 303 | Properties: 304 | Pattern: 305 | detail-type: 306 | - Send Email -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Blog Crossposting Automation 2 | 3 | Are you a blog writer? Hate cross-posting your content across the web? You're in luck! 4 | 5 | This solution will hook into your blog creation process and automatically cross-post your content for you to Medium, Dev.to, and Hashnode! 6 | 7 | Deploy into your AWS account and type away! 8 | 9 | For a full summary of this solution [please refer to this blog post](https://www.readysetcloud.io/blog/allen.helton/how-i-built-a-serverless-automation-to-cross-post-my-blogs/) by [Allen Helton](https://twitter.com/allenheltondev). 10 | 11 | ## Prerequisites 12 | 13 | For cross-posts to work successfully, there are a few prereqs that must be met in your setup. 14 | 15 | * Your blog post must be written in [markdown](https://en.wikipedia.org/wiki/Markdown). 16 | * Content is checked into a repository in GitHub 17 | * You have an application in [AWS Amplify](https://aws.amazon.com/amplify/) that has a runnable CI pipeline 18 | * Blog posts have front matter in the format outlined in the [Blog Metadata](#blog-metadata) section 19 | 20 | *Note - it is highly recommended you host your blog on your own site. This guarantees you own your content and prevents accidental loss if your favorite platform goes down or has an incident. It also enables [easy canonification](https://support.google.com/webmasters/answer/10347851) of your content when it is cross posted so it ranks higher in search engine results. For a step by step guide on hosting your own blog for free, please [reference this post](https://www.readysetcloud.io/blog/allen.helton/how-to-build-your-blog-with-aws-and-hugo/).* 21 | 22 | ## How It Works 23 | 24 | ![](/docs/workflow.png) 25 | 26 | The cross posting process is outlined below. 27 | 28 | 1. Completed blog post written in markdown is committed to main branch 29 | 2. AWS Amplify CI pipeline picks up changes and runs build 30 | 3. On success, Amplify publishes a `Amplify Deployment Status Change` event to EventBridge, triggering a Lambda function deployed in this stack 31 | 4. The function uses your GitHub PAT to identify and load the blog post content and pass it into a Step Function workflow 32 | 5. The workflow will do an idempotency check, and if it's ok to continue will transform and publish to Medium, Hashnode, and Dev.to in parallel 33 | 6. After publish is complete, the workflow checks if there were any failures. 34 | * If there was a failure, it sends an email with a link to the execution for debugging 35 | * On success, it sends an email with links to the published content and updates the idempotency record and article catalog 36 | 37 | *Note - If you do not provide a SendGrid API key, you will not receive email status updates* 38 | 39 | ## Platforms 40 | 41 | This solution will take content you create and automatically cross-post it on three platforms: 42 | 43 | * [Medium](https://medium.com) - *[generate API Key](https://help.medium.com/hc/en-us/articles/213480228-Get-an-integration-token-for-your-writing-app)* 44 | * [Dev.to](https://dev.to) - *[generate API Key](https://dev.to/settings/extensions)* 45 | * [Hashnode](https://hashnode.com) - *[generate API Key](https://hashnode.com/settings/developer)* 46 | 47 | You are required to have an account on all three platforms and must generate an API key for each of them. 48 | 49 | Optionally, you can publish straight to publications on each of the platforms. If there is a specific organization on Dev.to or publication on Medium or Hashnode you typically write for, you can fill out `DevOrganizationId`, `MediumPublicationId`, and `HashnodePublicationId` deployment variables respectively. For example, you could automatically submit your story to the [AWS Community Builders](https://dev.to/aws-builders) organization on dev.to instead of under your name. 50 | 51 | ## Deployment 52 | 53 | The solution is built using AWS SAM. To deploy the resources into the cloud you must install the [SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html). 54 | 55 | Once installed, run the following commands in the root folder of the solution. 56 | 57 | ```bash 58 | sam build --parallel 59 | sam deploy --guided 60 | ``` 61 | 62 | This will walk you through deployment, prompting you for all the parameters necessary for proper use. Below are the parameters you must fill out on deploy. 63 | 64 | |Parameter|Description|Required| 65 | |---------|-----------|--------| 66 | |TableName|Name of the DynamoDB table to create|No| 67 | |GSI1|Name of the GSI on the DDB table|No| 68 | |GitHubPAT|Personal Access Token to load newsletter content from your repository|Yes| 69 | |GitHubOwner|The GitHub user name that owns the repository for your content|Yes| 70 | |GitHubRepo|The repository name that contains your content|Yes| 71 | |AmplifyProjectId|Identifier of the Amplify project that builds your newsletter|Yes| 72 | |MediumApiKey|API key used to manipulate data in your Medium account|Yes| 73 | |MediumPublicationId|Identifier of the publication you wish to submit to on Medium|No| 74 | |MediumAuthorId|Identifier of your user on Medium|Yes if `MediumPublicationId` is not provided| 75 | |DevApiKey|API key used to manipulate data in your Dev.to account|Yes| 76 | |DevOrganizationId|Identifier of the organization you wish to submit to on Dev.to|No| 77 | |HashnodeApiKey|API key used to manipulate data in your Hashnode account|Yes| 78 | |HashnodePublicationId|Identifier for your blog publication on Hashnode|Yes| 79 | |HashnodeBlogUrl|Base url of your blog hosted in Hashnode|Yes| 80 | |BlogBaseUrl|Vase url of your blog on your personal site|Yes| 81 | |BlogContentPath|Relative path from the root directory to the blog content folder in your GitHub repo|Yes| 82 | |SendgridApiKey|Api Key of the SendGrid account that will send the status report when cross-posting is complete|No| 83 | |NotificationEmail|Email address to notify when cross posting is complete|No| 84 | |SendgridFromEmail|Email address for SendGrid that sends you the status email|No| 85 | 86 | ## Notification Emails 87 | 88 | If you wish to get notification emails on the status of the cross posting, you must use [SendGrid](https://sendgrid.com). SendGrid offers a generous free tier for email messages and is quick to get started. To configure SendGrid to send you emails you must: 89 | 90 | * [Create an API key](https://docs.sendgrid.com/ui/account-and-settings/api-keys) 91 | * [Create a sender](https://docs.sendgrid.com/ui/sending-email/senders) 92 | 93 | Once you perform the above actions, you may use the values in the respective deployment variables listed above. 94 | 95 | ## Replay / Idempotency 96 | 97 | In the event the cross-posting does not work, it can be safely retried without worrying about pushing your content multiple times. Each post will update the idempotency DynamoDB record for the cross-posting state machine. This record holds the status (*success/failure*) for each platform. If the article was successfully posted on a platform, it will be skipped on subsequent executions. 98 | 99 | ## Blog Metadata 100 | 101 | Your blog must be written in Markdown for this solution to work appropriately. To save metadata about your post, you can add [front matter](https://gohugo.io/content-management/front-matter/) at the beginning of the file. This solution requires a specific set of metadata in order to function appropriately. 102 | 103 | **Example** 104 | ```yaml 105 | --- 106 | title: My first blog! 107 | description: This is the subtitle that is used for SEO and visible in Medium and Hashnode posts. 108 | image: https://link-to-hero-image.png 109 | image_attribution: Any attribution required for hero image 110 | categories: 111 | - categoryOne 112 | tags: 113 | - serverless 114 | - other tag 115 | slug: /my-first-blog 116 | --- 117 | ``` 118 | 119 | |Field|Description|Required?| 120 | |-----|-----------|---------| 121 | |title|Title of the blog issue |Yes| 122 | |description| Brief summary of article. This shows up on Hashnode and Medium and is used in SEO previews|Yes| 123 | |image|Link to the hero image for your article|Yes| 124 | |image_attribution|Any attribution text needed for your hero image|No| 125 | |categories|Array of categories. This will be used as tags for Dev and Medium|No| 126 | |tags|Array of tags. Also used as tags for Dev and Medium|No| 127 | |slug|Relative url of your post. Used in the article catalog|Yes| 128 | 129 | ## Article Catalog 130 | 131 | One of the neat features provided by this solution is substituting relative urls for the appropriate urls on a given page. For example, if you use a relative url to link to another blog post you've written on your site, this solution will replace that with the cross-posted version. So Medium articles will always point to Medium articles, Hashnode articles will always point to Hashnode, etc... 132 | 133 | This is managed for you by the solution. It creates entries for your content in DynamoDB with the following format: 134 | 135 | ```json 136 | { 137 | "pk": "<article slug>", 138 | "sk": "article", 139 | "GSI1PK": "article", 140 | "GSI1SK": "<title of the post>", 141 | "links": { 142 | "url": "<article slug>", 143 | "devUrl": "<full path to article on dev.to>", 144 | "mediumUrl": "<full path to article on Medium>", 145 | "hashnodeUrl": "<full path to article on Hashnode>" 146 | } 147 | } 148 | ``` 149 | 150 | When transforming your Markdown content, it will load all articles from DynamoDB, use a Regex to match on the article slug in your content, and replace with the url of appropriate site. 151 | 152 | If you already have a number of articles and wish to seed the database with the cross references, you will have to compile the data manually and put it in the following format: 153 | 154 | ```json 155 | [ 156 | { 157 | "title": "<title of article>", 158 | "devUrl": "<url of article on dev.to>", 159 | "url": "<relative url of article on your blog>", 160 | "mediumUrl": "<url of article on medium>", 161 | "hashnodeUrl": "<url of article on hashnode>" 162 | } 163 | ] 164 | ``` 165 | 166 | Take this data and update the [load-cross-posts](/functions/load-cross-posts/index.js) function to load and handle that data. Run the function manually to seed the data in your database table. 167 | 168 | ## Embeds 169 | 170 | If you are embedding content in your posts, they might not work out of the box. *There is only support for Hugo twitter embeds.* The format of a Hugo Twitter embed is: 171 | 172 | ``` 173 | {{<tweet user="" id="">}} 174 | ``` 175 | 176 | If you include this in your content, it will be automatically transformed to the appropriate embed style on the appropriate platform. 177 | 178 | ## Limitations 179 | 180 | Below are a list of known limitations: 181 | 182 | * Your content must be written in Markdown with front matter describing the blog post. 183 | * Content must be hosted in GitHub. 184 | * You are required to post to Dev.to, Medium, and Hashnode. You cannot pick and choose which platforms you want to use. 185 | * Only Hugo style Twitter embeds are supported. Embeds for other content will not work. 186 | * This process is triggered on a successful build of an AWS Amplify project. Other triggers are not supported (but can easily be modified to add them). 187 | * Notifications are limited to sending emails in SendGrid. 188 | * The only way to deploy the solution is with AWS SAM. 189 | 190 | ## Contributions 191 | 192 | Please feel free to contribute to this project! Bonus points if you can meaningfully address any of the limitations listed above :) 193 | 194 | This is an AWS Community Builders project and is meant to help the community. If you see fit, please donate some time into making it better! 195 | -------------------------------------------------------------------------------- /workflows/cross-post.asl.json: -------------------------------------------------------------------------------- 1 | { 2 | "Comment": "Cross-post a blog on dev.to, medium, and hashnode", 3 | "StartAt": "Get Existing Article", 4 | "States": { 5 | "Get Existing Article": { 6 | "Type": "Task", 7 | "Resource": "${DynamodbGetItem}", 8 | "Parameters": { 9 | "TableName": "${TableName}", 10 | "Key": { 11 | "pk": { 12 | "S.$": "States.Format('{}#{}', $.commit, $.fileName)" 13 | }, 14 | "sk": { 15 | "S": "article" 16 | } 17 | } 18 | }, 19 | "Next": "Has Article Been Processed?", 20 | "ResultPath": "$.existingArticle" 21 | }, 22 | "Has Article Been Processed?": { 23 | "Type": "Choice", 24 | "Choices": [ 25 | { 26 | "Not": { 27 | "Variable": "$.existingArticle.Item", 28 | "IsPresent": true 29 | }, 30 | "Next": "Set Article Record To In Progress" 31 | }, 32 | { 33 | "And": [ 34 | { 35 | "Variable": "$.existingArticle.Item", 36 | "IsPresent": true 37 | }, 38 | { 39 | "Variable": "$.existingArticle.Item.status.S", 40 | "StringEquals": "failed" 41 | } 42 | ], 43 | "Next": "Set Article Record To In Progress" 44 | } 45 | ], 46 | "Default": "Success - Duplicate Request" 47 | }, 48 | "Set Article Record To In Progress": { 49 | "Type": "Task", 50 | "Resource": "${DynamodbUpdateItem}", 51 | "Parameters": { 52 | "TableName": "${TableName}", 53 | "Key": { 54 | "pk": { 55 | "S.$": "States.Format('{}#{}', $.commit, $.fileName)" 56 | }, 57 | "sk": { 58 | "S": "article" 59 | } 60 | }, 61 | "UpdateExpression": "SET #status = :status", 62 | "ExpressionAttributeNames": { 63 | "#status": "status" 64 | }, 65 | "ExpressionAttributeValues": { 66 | ":status": { 67 | "S": "in progress" 68 | } 69 | } 70 | }, 71 | "Next": "Load Article Catalog", 72 | "ResultPath": null 73 | }, 74 | "Load Article Catalog": { 75 | "Type": "Task", 76 | "Next": "Transform and Publish", 77 | "Parameters": { 78 | "TableName": "${TableName}", 79 | "IndexName": "${IndexName}", 80 | "KeyConditionExpression": "#GSI1PK = :GSI1PK", 81 | "ExpressionAttributeNames": { 82 | "#GSI1PK": "GSI1PK" 83 | }, 84 | "ExpressionAttributeValues": { 85 | ":GSI1PK": { 86 | "S": "article" 87 | } 88 | } 89 | }, 90 | "Resource": "${DynamodbQuery}", 91 | "ResultPath": "$.catalog", 92 | "Catch": [ 93 | { 94 | "ErrorEquals": [ 95 | "States.ALL" 96 | ], 97 | "Next": "Update Article Record (Failure)" 98 | } 99 | ] 100 | }, 101 | "Update Article Record (Failure)": { 102 | "Type": "Task", 103 | "Resource": "${DynamodbUpdateItem}", 104 | "Parameters": { 105 | "TableName": "${TableName}", 106 | "Key": { 107 | "pk": { 108 | "S.$": "States.Format('{}#{}', $$.Execution.Input.commit, $$.Execution.Input.fileName)" 109 | }, 110 | "sk": { 111 | "S": "article" 112 | } 113 | }, 114 | "UpdateExpression": "SET #status = :status", 115 | "ExpressionAttributeNames": { 116 | "#status": "status" 117 | }, 118 | "ExpressionAttributeValues": { 119 | ":status": { 120 | "S": "failed" 121 | } 122 | } 123 | }, 124 | "End": true, 125 | "ResultPath": null 126 | }, 127 | "Transform and Publish": { 128 | "Type": "Parallel", 129 | "Branches": [ 130 | { 131 | "StartAt": "Skip Publish to Dev?", 132 | "States": { 133 | "Skip Publish to Dev?": { 134 | "Type": "Choice", 135 | "Choices": [ 136 | { 137 | "And": [ 138 | { 139 | "Variable": "$.existingArticle.Item.dev.M.status.S", 140 | "IsPresent": true 141 | }, 142 | { 143 | "Variable": "$.existingArticle.Item.dev.M.status.S", 144 | "StringEquals": "succeeded" 145 | } 146 | ], 147 | "Next": "Format Skipped Output - Dev" 148 | } 149 | ], 150 | "Default": "Transform For Dev" 151 | }, 152 | "Format Skipped Output - Dev": { 153 | "Type": "Pass", 154 | "Parameters": { 155 | "url.$": "$.existingArticle.Item.url.S", 156 | "devUrl.$": "$.existingArticle.Item.dev.M.devUrl.S", 157 | "success": true 158 | }, 159 | "End": true 160 | }, 161 | "Transform For Dev": { 162 | "Type": "Task", 163 | "Resource": "${LambdaInvoke}", 164 | "OutputPath": "$.Payload", 165 | "Parameters": { 166 | "FunctionName": "${ParsePostFunction}", 167 | "Payload": { 168 | "post.$": "$.content", 169 | "articleCatalog.$": "$.catalog.Items", 170 | "format": "dev" 171 | } 172 | }, 173 | "Retry": [ 174 | { 175 | "ErrorEquals": [ 176 | "Lambda.ServiceException", 177 | "Lambda.AWSLambdaException", 178 | "Lambda.SdkClientException", 179 | "Lambda.TooManyRequestsException" 180 | ], 181 | "IntervalSeconds": 2, 182 | "MaxAttempts": 6, 183 | "BackoffRate": 2 184 | } 185 | ], 186 | "Next": "Publish to Dev", 187 | "Catch": [ 188 | { 189 | "ErrorEquals": [ 190 | "States.ALL" 191 | ], 192 | "Next": "Update Article Record (Failure-Dev)" 193 | } 194 | ] 195 | }, 196 | "Update Article Record (Failure-Dev)": { 197 | "Type": "Task", 198 | "Resource": "${DynamodbUpdateItem}", 199 | "Parameters": { 200 | "TableName": "${TableName}", 201 | "Key": { 202 | "pk": { 203 | "S.$": "States.Format('{}#{}', $$.Execution.Input.commit, $$.Execution.Input.fileName)" 204 | }, 205 | "sk": { 206 | "S": "article" 207 | } 208 | }, 209 | "UpdateExpression": "SET #dev = :dev", 210 | "ExpressionAttributeNames": { 211 | "#dev": "dev" 212 | }, 213 | "ExpressionAttributeValues": { 214 | ":dev": { 215 | "M": { 216 | "status": { 217 | "S": "failed" 218 | } 219 | } 220 | } 221 | } 222 | }, 223 | "ResultPath": null, 224 | "Next": "Format Failed Output - Dev" 225 | }, 226 | "Format Failed Output - Dev": { 227 | "Type": "Pass", 228 | "Parameters": { 229 | "success": false 230 | }, 231 | "End": true 232 | }, 233 | "Publish to Dev": { 234 | "Type": "Task", 235 | "Resource": "${LambdaInvoke}", 236 | "Parameters": { 237 | "FunctionName": "${SendApiRequestFunction}", 238 | "Payload": { 239 | "secretKey": "dev", 240 | "auth": { 241 | "location": "header", 242 | "key": "api-key" 243 | }, 244 | "request": { 245 | "method": "POST", 246 | "headers": { 247 | "accept": "application/vnd.forem.api-v1+json" 248 | }, 249 | "baseUrl": "https://dev.to/api/articles", 250 | "body.$": "$.payload" 251 | } 252 | } 253 | }, 254 | "Retry": [ 255 | { 256 | "ErrorEquals": [ 257 | "Lambda.ServiceException", 258 | "Lambda.AWSLambdaException", 259 | "Lambda.SdkClientException", 260 | "Lambda.TooManyRequestsException" 261 | ], 262 | "IntervalSeconds": 2, 263 | "MaxAttempts": 6, 264 | "BackoffRate": 2 265 | } 266 | ], 267 | "Catch": [ 268 | { 269 | "ErrorEquals": [ 270 | "States.ALL" 271 | ], 272 | "Next": "Update Article Record (Failure-Dev)" 273 | } 274 | ], 275 | "ResultPath": "$.result", 276 | "Next": "Update Article Record (Success-Dev)" 277 | }, 278 | "Update Article Record (Success-Dev)": { 279 | "Type": "Task", 280 | "Resource": "${DynamodbUpdateItem}", 281 | "Parameters": { 282 | "TableName": "${TableName}", 283 | "Key": { 284 | "pk": { 285 | "S.$": "States.Format('{}#{}', $$.Execution.Input.commit, $$.Execution.Input.fileName)" 286 | }, 287 | "sk": { 288 | "S": "article" 289 | } 290 | }, 291 | "UpdateExpression": "SET #dev = :dev, #url = :url", 292 | "ExpressionAttributeNames": { 293 | "#dev": "dev", 294 | "#url": "url" 295 | }, 296 | "ExpressionAttributeValues": { 297 | ":dev": { 298 | "M": { 299 | "status": { 300 | "S": "succeeded" 301 | }, 302 | "devUrl": { 303 | "S.$": "$.result.Payload.url" 304 | } 305 | } 306 | }, 307 | ":url": { 308 | "S.$": "$.url" 309 | } 310 | } 311 | }, 312 | "ResultPath": null, 313 | "Next": "Format Success Output - Dev" 314 | }, 315 | "Format Success Output - Dev": { 316 | "Type": "Pass", 317 | "Parameters": { 318 | "url.$": "$.url", 319 | "devUrl.$": "$.result.Payload.url", 320 | "success": true 321 | }, 322 | "End": true 323 | } 324 | } 325 | }, 326 | { 327 | "StartAt": "Skip Publish to Medium?", 328 | "States": { 329 | "Skip Publish to Medium?": { 330 | "Type": "Choice", 331 | "Choices": [ 332 | { 333 | "And": [ 334 | { 335 | "Variable": "$.existingArticle.Item.medium.M.status.S", 336 | "IsPresent": true 337 | }, 338 | { 339 | "Variable": "$.existingArticle.Item.medium.M.status.S", 340 | "StringEquals": "succeeded" 341 | } 342 | ], 343 | "Next": "Format Skipped Output - Medium" 344 | } 345 | ], 346 | "Default": "Transform For Medium" 347 | }, 348 | "Format Skipped Output - Medium": { 349 | "Type": "Pass", 350 | "Parameters": { 351 | "url.$": "$.existingArticle.Item.url.S", 352 | "mediumUrl.$": "$.existingArticle.Item.medium.M.mediumUrl.S", 353 | "success": true 354 | }, 355 | "End": true 356 | }, 357 | "Transform For Medium": { 358 | "Type": "Task", 359 | "Resource": "${LambdaInvoke}", 360 | "OutputPath": "$.Payload", 361 | "Parameters": { 362 | "FunctionName": "${ParsePostFunction}", 363 | "Payload": { 364 | "post.$": "$.content", 365 | "articleCatalog.$": "$.catalog.Items", 366 | "format": "medium" 367 | } 368 | }, 369 | "Retry": [ 370 | { 371 | "ErrorEquals": [ 372 | "Lambda.ServiceException", 373 | "Lambda.AWSLambdaException", 374 | "Lambda.SdkClientException", 375 | "Lambda.TooManyRequestsException" 376 | ], 377 | "IntervalSeconds": 2, 378 | "MaxAttempts": 6, 379 | "BackoffRate": 2 380 | } 381 | ], 382 | "Catch": [ 383 | { 384 | "ErrorEquals": [ 385 | "States.ALL" 386 | ], 387 | "Next": "Update Article Record (Failure-Medium)" 388 | } 389 | ], 390 | "Next": "Publish to Medium" 391 | }, 392 | "Update Article Record (Failure-Medium)": { 393 | "Type": "Task", 394 | "Resource": "${DynamodbUpdateItem}", 395 | "Parameters": { 396 | "TableName": "${TableName}", 397 | "Key": { 398 | "pk": { 399 | "S.$": "States.Format('{}#{}', $$.Execution.Input.commit, $$.Execution.Input.fileName)" 400 | }, 401 | "sk": { 402 | "S": "article" 403 | } 404 | }, 405 | "UpdateExpression": "SET #medium = :medium", 406 | "ExpressionAttributeNames": { 407 | "#medium": "medium" 408 | }, 409 | "ExpressionAttributeValues": { 410 | ":medium": { 411 | "M": { 412 | "status": { 413 | "S": "failed" 414 | } 415 | } 416 | } 417 | } 418 | }, 419 | "ResultPath": null, 420 | "Next": "Format Failed Output - Medium" 421 | }, 422 | "Format Failed Output - Medium": { 423 | "Type": "Pass", 424 | "Parameters": { 425 | "success": false 426 | }, 427 | "End": true 428 | }, 429 | "Publish to Medium": { 430 | "Type": "Task", 431 | "Resource": "${LambdaInvoke}", 432 | "Parameters": { 433 | "FunctionName": "${SendApiRequestFunction}", 434 | "Payload": { 435 | "secretKey": "medium", 436 | "auth": { 437 | "location": "query", 438 | "key": "accessToken" 439 | }, 440 | "request": { 441 | "method": "POST", 442 | "baseUrl": "${MediumUrl}", 443 | "body.$": "$.payload" 444 | } 445 | } 446 | }, 447 | "Retry": [ 448 | { 449 | "ErrorEquals": [ 450 | "Lambda.ServiceException", 451 | "Lambda.AWSLambdaException", 452 | "Lambda.SdkClientException", 453 | "Lambda.TooManyRequestsException" 454 | ], 455 | "IntervalSeconds": 2, 456 | "MaxAttempts": 6, 457 | "BackoffRate": 2 458 | } 459 | ], 460 | "Catch": [ 461 | { 462 | "ErrorEquals": [ 463 | "States.ALL" 464 | ], 465 | "Next": "Update Article Record (Failure-Medium)" 466 | } 467 | ], 468 | "Next": "Update Article Record (Success-Medium)", 469 | "ResultPath": "$.result" 470 | }, 471 | "Update Article Record (Success-Medium)": { 472 | "Type": "Task", 473 | "Resource": "${DynamodbUpdateItem}", 474 | "Parameters": { 475 | "TableName": "${TableName}", 476 | "Key": { 477 | "pk": { 478 | "S.$": "States.Format('{}#{}', $$.Execution.Input.commit, $$.Execution.Input.fileName)" 479 | }, 480 | "sk": { 481 | "S": "article" 482 | } 483 | }, 484 | "UpdateExpression": "SET #medium = :medium, #url = :url", 485 | "ExpressionAttributeNames": { 486 | "#medium": "medium", 487 | "#url": "url" 488 | }, 489 | "ExpressionAttributeValues": { 490 | ":medium": { 491 | "M": { 492 | "status": { 493 | "S": "succeeded" 494 | }, 495 | "mediumUrl": { 496 | "S.$": "$.result.Payload.data.url" 497 | } 498 | } 499 | }, 500 | ":url": { 501 | "S.$": "$.url" 502 | } 503 | } 504 | }, 505 | "ResultPath": null, 506 | "Next": "Format Success Output - Medium" 507 | }, 508 | "Format Success Output - Medium": { 509 | "Type": "Pass", 510 | "End": true, 511 | "Parameters": { 512 | "mediumUrl.$": "$.result.Payload.data.url", 513 | "url.$": "$.url", 514 | "success": true 515 | } 516 | } 517 | } 518 | }, 519 | { 520 | "StartAt": "Skip Publish to Hashnode?", 521 | "States": { 522 | "Skip Publish to Hashnode?": { 523 | "Type": "Choice", 524 | "Choices": [ 525 | { 526 | "And": [ 527 | { 528 | "Variable": "$.existingArticle.Item.hashnode.M.status.S", 529 | "IsPresent": true 530 | }, 531 | { 532 | "Variable": "$.existingArticle.Item.hashnode.M.status.S", 533 | "StringEquals": "succeeded" 534 | } 535 | ], 536 | "Next": "Format Skipped Output - Hashnode" 537 | } 538 | ], 539 | "Default": "Transform For Hashnode" 540 | }, 541 | "Format Skipped Output - Hashnode": { 542 | "Type": "Pass", 543 | "End": true, 544 | "Parameters": { 545 | "url.$": "$.existingArticle.Item.url.S", 546 | "hashnodeUrl.$": "$.existingArticle.Item.hashnode.M.hashnodeUrl.S", 547 | "success": true 548 | } 549 | }, 550 | "Transform For Hashnode": { 551 | "Type": "Task", 552 | "Resource": "${LambdaInvoke}", 553 | "OutputPath": "$.Payload", 554 | "Parameters": { 555 | "FunctionName": "${ParsePostFunction}", 556 | "Payload": { 557 | "post.$": "$.content", 558 | "articleCatalog.$": "$.catalog.Items", 559 | "format": "hashnode" 560 | } 561 | }, 562 | "Retry": [ 563 | { 564 | "ErrorEquals": [ 565 | "Lambda.ServiceException", 566 | "Lambda.AWSLambdaException", 567 | "Lambda.SdkClientException", 568 | "Lambda.TooManyRequestsException" 569 | ], 570 | "IntervalSeconds": 2, 571 | "MaxAttempts": 6, 572 | "BackoffRate": 2 573 | } 574 | ], 575 | "Catch": [ 576 | { 577 | "ErrorEquals": [ 578 | "States.ALL" 579 | ], 580 | "Next": "Update Article Record (Failure-Hashnode)" 581 | } 582 | ], 583 | "Next": "Publish to Hashnode" 584 | }, 585 | "Publish to Hashnode": { 586 | "Type": "Task", 587 | "Resource": "${LambdaInvoke}", 588 | "Parameters": { 589 | "FunctionName": "${SendApiRequestFunction}", 590 | "Payload": { 591 | "secretKey": "hashnode", 592 | "auth": { 593 | "location": "header", 594 | "key": "Authorization" 595 | }, 596 | "request": { 597 | "method": "POST", 598 | "headers": { 599 | "content-type": "application/json" 600 | }, 601 | "baseUrl": "https://api.hashnode.com", 602 | "body.$": "$.payload" 603 | } 604 | } 605 | }, 606 | "Retry": [ 607 | { 608 | "ErrorEquals": [ 609 | "Lambda.ServiceException", 610 | "Lambda.AWSLambdaException", 611 | "Lambda.SdkClientException", 612 | "Lambda.TooManyRequestsException" 613 | ], 614 | "IntervalSeconds": 2, 615 | "MaxAttempts": 6, 616 | "BackoffRate": 2 617 | } 618 | ], 619 | "Catch": [ 620 | { 621 | "ErrorEquals": [ 622 | "States.ALL" 623 | ], 624 | "Next": "Update Article Record (Failure-Hashnode)" 625 | } 626 | ], 627 | "ResultPath": "$.result", 628 | "Next": "Update Article Record (Success-Hashnode)" 629 | }, 630 | "Update Article Record (Success-Hashnode)": { 631 | "Type": "Task", 632 | "Resource": "${DynamodbUpdateItem}", 633 | "Parameters": { 634 | "TableName": "${TableName}", 635 | "Key": { 636 | "pk": { 637 | "S.$": "States.Format('{}#{}', $$.Execution.Input.commit, $$.Execution.Input.fileName)" 638 | }, 639 | "sk": { 640 | "S": "article" 641 | } 642 | }, 643 | "UpdateExpression": "SET #hashnode = :hashnode, #url = :url", 644 | "ExpressionAttributeNames": { 645 | "#hashnode": "hashnode", 646 | "#url": "url" 647 | }, 648 | "ExpressionAttributeValues": { 649 | ":hashnode": { 650 | "M": { 651 | "status": { 652 | "S": "succeeded" 653 | }, 654 | "hashnodeUrl": { 655 | "S.$": "States.Format('${HashnodeBlogUrl}/{}', $.result.Payload.data.createPublicationStory.post.slug)" 656 | } 657 | } 658 | }, 659 | ":url": { 660 | "S.$": "$.url" 661 | } 662 | } 663 | }, 664 | "ResultPath": null, 665 | "Next": "Format Hashnode Data" 666 | }, 667 | "Format Hashnode Data": { 668 | "Type": "Pass", 669 | "End": true, 670 | "Parameters": { 671 | "hashnodeUrl.$": "States.Format('${HashnodeBlogUrl}/{}', $.result.Payload.data.createPublicationStory.post.slug)", 672 | "url.$": "$.url", 673 | "success": true 674 | } 675 | }, 676 | "Update Article Record (Failure-Hashnode)": { 677 | "Type": "Task", 678 | "Resource": "${DynamodbUpdateItem}", 679 | "Parameters": { 680 | "TableName": "${TableName}", 681 | "Key": { 682 | "pk": { 683 | "S.$": "States.Format('{}#{}', $$.Execution.Input.commit, $$.Execution.Input.fileName)" 684 | }, 685 | "sk": { 686 | "S": "article" 687 | } 688 | }, 689 | "UpdateExpression": "SET #hashnode = :hashnode", 690 | "ExpressionAttributeNames": { 691 | "#hashnode": "hashnode" 692 | }, 693 | "ExpressionAttributeValues": { 694 | ":hashnode": { 695 | "M": { 696 | "status": { 697 | "S": "failed" 698 | } 699 | } 700 | } 701 | } 702 | }, 703 | "ResultPath": null, 704 | "Next": "Format Failed Output - Hashnode" 705 | }, 706 | "Format Failed Output - Hashnode": { 707 | "Type": "Pass", 708 | "Parameters": { 709 | "success": false 710 | }, 711 | "End": true 712 | } 713 | } 714 | } 715 | ], 716 | "Next": "Format Failure Check", 717 | "ResultPath": "$.transform" 718 | }, 719 | "Format Failure Check": { 720 | "Type": "Pass", 721 | "Next": "Check For Failures", 722 | "Parameters": { 723 | "results.$": "$.transform", 724 | "failureFormat": { 725 | "success": false 726 | } 727 | } 728 | }, 729 | "Check For Failures": { 730 | "Type": "Pass", 731 | "Next": "Did Failure Occur?", 732 | "Parameters": { 733 | "results.$": "$.results", 734 | "hasFailure.$": "States.ArrayContains($.results, $.failureFormat)" 735 | } 736 | }, 737 | "Did Failure Occur?": { 738 | "Type": "Choice", 739 | "Choices": [ 740 | { 741 | "Variable": "$.hasFailure", 742 | "BooleanEquals": true, 743 | "Next": "Update Article Record (failed)" 744 | } 745 | ], 746 | "Default": "Format Catalog Article" 747 | }, 748 | "Update Article Record (failed)": { 749 | "Type": "Task", 750 | "Resource": "${DynamodbUpdateItem}", 751 | "Parameters": { 752 | "TableName": "${TableName}", 753 | "Key": { 754 | "pk": { 755 | "S.$": "States.Format('{}#{}', $$.Execution.Input.commit, $$.Execution.Input.fileName)" 756 | }, 757 | "sk": { 758 | "S": "article" 759 | } 760 | }, 761 | "UpdateExpression": "SET #status = :status", 762 | "ExpressionAttributeNames": { 763 | "#status": "status" 764 | }, 765 | "ExpressionAttributeValues": { 766 | ":status": { 767 | "S": "failed" 768 | } 769 | } 770 | }, 771 | "ResultPath": null, 772 | "Next": "Should Send Failure Email?" 773 | }, 774 | "Should Send Failure Email?": { 775 | "Type": "Choice", 776 | "Choices": [ 777 | { 778 | "And": [ 779 | { 780 | "Variable": "$$.Execution.Input.sendStatusEmail", 781 | "IsPresent": true 782 | }, 783 | { 784 | "Variable": "$$.Execution.Input.sendStatusEmail", 785 | "BooleanEquals": true 786 | } 787 | ], 788 | "Next": "Send Failure Email" 789 | } 790 | ], 791 | "Default": "Something Went Wrong" 792 | }, 793 | "Something Went Wrong": { 794 | "Type": "Fail", 795 | "Error": "PublishError", 796 | "Cause": "An error occurred publishing to one or more sites" 797 | }, 798 | "Send Failure Email": { 799 | "Type": "Task", 800 | "Resource": "${EventBridgePutEvents}", 801 | "Parameters": { 802 | "Entries": [ 803 | { 804 | "Detail": { 805 | "subject": "Cross Post Failed!", 806 | "to": "${AdminEmail}", 807 | "html.$": "States.Format('<p>Republishing of your new blog post failed :(</p><p>Found file: <i>{}</i></p><p><a href=\"${ExecutionUrl}/{}\">View state machine execution</a></p>', $$.Execution.Input.fileName, $$.Execution.Id)" 808 | }, 809 | "DetailType": "Send Email", 810 | "Source": "user.CrossPostStateMachine" 811 | } 812 | ] 813 | }, 814 | "Next": "Something Went Wrong" 815 | }, 816 | "Format Catalog Article": { 817 | "Type": "Pass", 818 | "Parameters": { 819 | "url.$": "$.results[0].url", 820 | "devUrl.$": "$.results[0].devUrl", 821 | "mediumUrl.$": "$.results[1].mediumUrl", 822 | "hashnodeUrl.$": "$.results[2].hashnodeUrl" 823 | }, 824 | "Next": "Save Records" 825 | }, 826 | "Save Records": { 827 | "Type": "Parallel", 828 | "Next": "Should Send Success Email?", 829 | "Branches": [ 830 | { 831 | "StartAt": "Save Catalog Article", 832 | "States": { 833 | "Save Catalog Article": { 834 | "Type": "Task", 835 | "Resource": "${DynamodbPutItem}", 836 | "Parameters": { 837 | "TableName": "${TableName}", 838 | "Item": { 839 | "pk": { 840 | "S.$": "$.url" 841 | }, 842 | "sk": { 843 | "S": "article" 844 | }, 845 | "GSI1PK": { 846 | "S": "article" 847 | }, 848 | "GSI1SK": { 849 | "S.$": "$$.Execution.Input.fileName" 850 | }, 851 | "links": { 852 | "M": { 853 | "devUrl": { 854 | "S.$": "$.devUrl" 855 | }, 856 | "url": { 857 | "S.$": "$.url" 858 | }, 859 | "mediumUrl": { 860 | "S.$": "$.mediumUrl" 861 | }, 862 | "hashnodeUrl": { 863 | "S.$": "$.hashnodeUrl" 864 | } 865 | } 866 | } 867 | } 868 | }, 869 | "ResultPath": null, 870 | "End": true 871 | } 872 | } 873 | }, 874 | { 875 | "StartAt": "Update Article Record (success)", 876 | "States": { 877 | "Update Article Record (success)": { 878 | "Type": "Task", 879 | "Resource": "${DynamodbUpdateItem}", 880 | "Parameters": { 881 | "TableName": "${TableName}", 882 | "Key": { 883 | "pk": { 884 | "S.$": "States.Format('{}#{}', $$.Execution.Input.commit, $$.Execution.Input.fileName)" 885 | }, 886 | "sk": { 887 | "S": "article" 888 | } 889 | }, 890 | "UpdateExpression": "SET #status = :status", 891 | "ExpressionAttributeNames": { 892 | "#status": "status" 893 | }, 894 | "ExpressionAttributeValues": { 895 | ":status": { 896 | "S": "succeeded" 897 | } 898 | } 899 | }, 900 | "ResultPath": null, 901 | "End": true 902 | } 903 | } 904 | } 905 | ], 906 | "ResultPath": null 907 | }, 908 | "Should Send Success Email?": { 909 | "Type": "Choice", 910 | "Choices": [ 911 | { 912 | "And": [ 913 | { 914 | "Variable": "$$.Execution.Input.sendStatusEmail", 915 | "IsPresent": true 916 | }, 917 | { 918 | "Variable": "$$.Execution.Input.sendStatusEmail", 919 | "BooleanEquals": true 920 | } 921 | ], 922 | "Next": "Send Success Email" 923 | } 924 | ], 925 | "Default": "Success" 926 | }, 927 | "Send Success Email": { 928 | "Type": "Task", 929 | "Resource": "${EventBridgePutEvents}", 930 | "Parameters": { 931 | "Entries": [ 932 | { 933 | "Detail": { 934 | "subject": "Cross Post Successful!", 935 | "to": "${AdminEmail}", 936 | "html.$": "States.Format('<p>Republishing of your new blog post was successful!</p><p>Found file: <i>{}</i></p><p><b>Links</b></p><ul><li><b><a href=\"{}\">Medium</a></b></li><li><b><a href=\"{}\">Dev.to</a></b></li><li><b><a href=\"{}\">Hashnode</a></b></li></ul>', $$.Execution.Input.fileName, $.mediumUrl, $.devUrl, $.hashnodeUrl)" 937 | }, 938 | "DetailType": "Send Email", 939 | "Source": "user.CrossPostStateMachine" 940 | } 941 | ] 942 | }, 943 | "Next": "Success" 944 | }, 945 | "Success": { 946 | "Type": "Succeed" 947 | }, 948 | "Success - Duplicate Request": { 949 | "Type": "Succeed", 950 | "Comment": "This article has already been processed" 951 | } 952 | } 953 | } -------------------------------------------------------------------------------- /functions/load-cross-posts/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "load-cross-posts", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "load-cross-posts", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@aws-sdk/client-dynamodb": "^3.229.0", 13 | "@aws-sdk/util-dynamodb": "^3.229.0" 14 | } 15 | }, 16 | "node_modules/@aws-crypto/ie11-detection": { 17 | "version": "2.0.2", 18 | "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", 19 | "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", 20 | "dev": true, 21 | "dependencies": { 22 | "tslib": "^1.11.1" 23 | } 24 | }, 25 | "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { 26 | "version": "1.14.1", 27 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 28 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 29 | "dev": true 30 | }, 31 | "node_modules/@aws-crypto/sha256-browser": { 32 | "version": "2.0.0", 33 | "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", 34 | "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", 35 | "dev": true, 36 | "dependencies": { 37 | "@aws-crypto/ie11-detection": "^2.0.0", 38 | "@aws-crypto/sha256-js": "^2.0.0", 39 | "@aws-crypto/supports-web-crypto": "^2.0.0", 40 | "@aws-crypto/util": "^2.0.0", 41 | "@aws-sdk/types": "^3.1.0", 42 | "@aws-sdk/util-locate-window": "^3.0.0", 43 | "@aws-sdk/util-utf8-browser": "^3.0.0", 44 | "tslib": "^1.11.1" 45 | } 46 | }, 47 | "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { 48 | "version": "1.14.1", 49 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 50 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 51 | "dev": true 52 | }, 53 | "node_modules/@aws-crypto/sha256-js": { 54 | "version": "2.0.0", 55 | "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", 56 | "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", 57 | "dev": true, 58 | "dependencies": { 59 | "@aws-crypto/util": "^2.0.0", 60 | "@aws-sdk/types": "^3.1.0", 61 | "tslib": "^1.11.1" 62 | } 63 | }, 64 | "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { 65 | "version": "1.14.1", 66 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 67 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 68 | "dev": true 69 | }, 70 | "node_modules/@aws-crypto/supports-web-crypto": { 71 | "version": "2.0.2", 72 | "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", 73 | "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", 74 | "dev": true, 75 | "dependencies": { 76 | "tslib": "^1.11.1" 77 | } 78 | }, 79 | "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { 80 | "version": "1.14.1", 81 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 82 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 83 | "dev": true 84 | }, 85 | "node_modules/@aws-crypto/util": { 86 | "version": "2.0.2", 87 | "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", 88 | "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", 89 | "dev": true, 90 | "dependencies": { 91 | "@aws-sdk/types": "^3.110.0", 92 | "@aws-sdk/util-utf8-browser": "^3.0.0", 93 | "tslib": "^1.11.1" 94 | } 95 | }, 96 | "node_modules/@aws-crypto/util/node_modules/tslib": { 97 | "version": "1.14.1", 98 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 99 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 100 | "dev": true 101 | }, 102 | "node_modules/@aws-sdk/abort-controller": { 103 | "version": "3.226.0", 104 | "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.226.0.tgz", 105 | "integrity": "sha512-cJVzr1xxPBd08voknXvR0RLgtZKGKt6WyDpH/BaPCu3rfSqWCDZKzwqe940eqosjmKrxC6pUZNKASIqHOQ8xxQ==", 106 | "dev": true, 107 | "dependencies": { 108 | "@aws-sdk/types": "3.226.0", 109 | "tslib": "^2.3.1" 110 | }, 111 | "engines": { 112 | "node": ">=14.0.0" 113 | } 114 | }, 115 | "node_modules/@aws-sdk/client-dynamodb": { 116 | "version": "3.245.0", 117 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.245.0.tgz", 118 | "integrity": "sha512-k9zPoUXQ6o91iAIceaDyz1p1tXhA3gcmw4R0oB6gREDGc9bkIqBzwS6+Zu8m4B2PPhZQIl9uMpktHw9NPyMRxA==", 119 | "dev": true, 120 | "dependencies": { 121 | "@aws-crypto/sha256-browser": "2.0.0", 122 | "@aws-crypto/sha256-js": "2.0.0", 123 | "@aws-sdk/client-sts": "3.245.0", 124 | "@aws-sdk/config-resolver": "3.234.0", 125 | "@aws-sdk/credential-provider-node": "3.245.0", 126 | "@aws-sdk/fetch-http-handler": "3.226.0", 127 | "@aws-sdk/hash-node": "3.226.0", 128 | "@aws-sdk/invalid-dependency": "3.226.0", 129 | "@aws-sdk/middleware-content-length": "3.226.0", 130 | "@aws-sdk/middleware-endpoint": "3.226.0", 131 | "@aws-sdk/middleware-endpoint-discovery": "3.234.0", 132 | "@aws-sdk/middleware-host-header": "3.226.0", 133 | "@aws-sdk/middleware-logger": "3.226.0", 134 | "@aws-sdk/middleware-recursion-detection": "3.226.0", 135 | "@aws-sdk/middleware-retry": "3.235.0", 136 | "@aws-sdk/middleware-serde": "3.226.0", 137 | "@aws-sdk/middleware-signing": "3.226.0", 138 | "@aws-sdk/middleware-stack": "3.226.0", 139 | "@aws-sdk/middleware-user-agent": "3.226.0", 140 | "@aws-sdk/node-config-provider": "3.226.0", 141 | "@aws-sdk/node-http-handler": "3.226.0", 142 | "@aws-sdk/protocol-http": "3.226.0", 143 | "@aws-sdk/smithy-client": "3.234.0", 144 | "@aws-sdk/types": "3.226.0", 145 | "@aws-sdk/url-parser": "3.226.0", 146 | "@aws-sdk/util-base64": "3.208.0", 147 | "@aws-sdk/util-body-length-browser": "3.188.0", 148 | "@aws-sdk/util-body-length-node": "3.208.0", 149 | "@aws-sdk/util-defaults-mode-browser": "3.234.0", 150 | "@aws-sdk/util-defaults-mode-node": "3.234.0", 151 | "@aws-sdk/util-endpoints": "3.245.0", 152 | "@aws-sdk/util-retry": "3.229.0", 153 | "@aws-sdk/util-user-agent-browser": "3.226.0", 154 | "@aws-sdk/util-user-agent-node": "3.226.0", 155 | "@aws-sdk/util-utf8-browser": "3.188.0", 156 | "@aws-sdk/util-utf8-node": "3.208.0", 157 | "@aws-sdk/util-waiter": "3.226.0", 158 | "tslib": "^2.3.1", 159 | "uuid": "^8.3.2" 160 | }, 161 | "engines": { 162 | "node": ">=14.0.0" 163 | } 164 | }, 165 | "node_modules/@aws-sdk/client-sso": { 166 | "version": "3.245.0", 167 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.245.0.tgz", 168 | "integrity": "sha512-dxzRwRo55ZNQ4hQigC+cishxLSWlBrbr3iszG0FLviavLDOlnVG5UUxWpOIGvwr8pYiSfM4jnfMxiwYwiCLg1g==", 169 | "dev": true, 170 | "dependencies": { 171 | "@aws-crypto/sha256-browser": "2.0.0", 172 | "@aws-crypto/sha256-js": "2.0.0", 173 | "@aws-sdk/config-resolver": "3.234.0", 174 | "@aws-sdk/fetch-http-handler": "3.226.0", 175 | "@aws-sdk/hash-node": "3.226.0", 176 | "@aws-sdk/invalid-dependency": "3.226.0", 177 | "@aws-sdk/middleware-content-length": "3.226.0", 178 | "@aws-sdk/middleware-endpoint": "3.226.0", 179 | "@aws-sdk/middleware-host-header": "3.226.0", 180 | "@aws-sdk/middleware-logger": "3.226.0", 181 | "@aws-sdk/middleware-recursion-detection": "3.226.0", 182 | "@aws-sdk/middleware-retry": "3.235.0", 183 | "@aws-sdk/middleware-serde": "3.226.0", 184 | "@aws-sdk/middleware-stack": "3.226.0", 185 | "@aws-sdk/middleware-user-agent": "3.226.0", 186 | "@aws-sdk/node-config-provider": "3.226.0", 187 | "@aws-sdk/node-http-handler": "3.226.0", 188 | "@aws-sdk/protocol-http": "3.226.0", 189 | "@aws-sdk/smithy-client": "3.234.0", 190 | "@aws-sdk/types": "3.226.0", 191 | "@aws-sdk/url-parser": "3.226.0", 192 | "@aws-sdk/util-base64": "3.208.0", 193 | "@aws-sdk/util-body-length-browser": "3.188.0", 194 | "@aws-sdk/util-body-length-node": "3.208.0", 195 | "@aws-sdk/util-defaults-mode-browser": "3.234.0", 196 | "@aws-sdk/util-defaults-mode-node": "3.234.0", 197 | "@aws-sdk/util-endpoints": "3.245.0", 198 | "@aws-sdk/util-retry": "3.229.0", 199 | "@aws-sdk/util-user-agent-browser": "3.226.0", 200 | "@aws-sdk/util-user-agent-node": "3.226.0", 201 | "@aws-sdk/util-utf8-browser": "3.188.0", 202 | "@aws-sdk/util-utf8-node": "3.208.0", 203 | "tslib": "^2.3.1" 204 | }, 205 | "engines": { 206 | "node": ">=14.0.0" 207 | } 208 | }, 209 | "node_modules/@aws-sdk/client-sso-oidc": { 210 | "version": "3.245.0", 211 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.245.0.tgz", 212 | "integrity": "sha512-0pGPA00kEsu2Yq1Ul+OwftHxws5YVllm4iZrPtGnqmXr7wmf6B9lOtrMQF44y7Tfw53po6+bKz08OKTEWkkjUA==", 213 | "dev": true, 214 | "dependencies": { 215 | "@aws-crypto/sha256-browser": "2.0.0", 216 | "@aws-crypto/sha256-js": "2.0.0", 217 | "@aws-sdk/config-resolver": "3.234.0", 218 | "@aws-sdk/fetch-http-handler": "3.226.0", 219 | "@aws-sdk/hash-node": "3.226.0", 220 | "@aws-sdk/invalid-dependency": "3.226.0", 221 | "@aws-sdk/middleware-content-length": "3.226.0", 222 | "@aws-sdk/middleware-endpoint": "3.226.0", 223 | "@aws-sdk/middleware-host-header": "3.226.0", 224 | "@aws-sdk/middleware-logger": "3.226.0", 225 | "@aws-sdk/middleware-recursion-detection": "3.226.0", 226 | "@aws-sdk/middleware-retry": "3.235.0", 227 | "@aws-sdk/middleware-serde": "3.226.0", 228 | "@aws-sdk/middleware-stack": "3.226.0", 229 | "@aws-sdk/middleware-user-agent": "3.226.0", 230 | "@aws-sdk/node-config-provider": "3.226.0", 231 | "@aws-sdk/node-http-handler": "3.226.0", 232 | "@aws-sdk/protocol-http": "3.226.0", 233 | "@aws-sdk/smithy-client": "3.234.0", 234 | "@aws-sdk/types": "3.226.0", 235 | "@aws-sdk/url-parser": "3.226.0", 236 | "@aws-sdk/util-base64": "3.208.0", 237 | "@aws-sdk/util-body-length-browser": "3.188.0", 238 | "@aws-sdk/util-body-length-node": "3.208.0", 239 | "@aws-sdk/util-defaults-mode-browser": "3.234.0", 240 | "@aws-sdk/util-defaults-mode-node": "3.234.0", 241 | "@aws-sdk/util-endpoints": "3.245.0", 242 | "@aws-sdk/util-retry": "3.229.0", 243 | "@aws-sdk/util-user-agent-browser": "3.226.0", 244 | "@aws-sdk/util-user-agent-node": "3.226.0", 245 | "@aws-sdk/util-utf8-browser": "3.188.0", 246 | "@aws-sdk/util-utf8-node": "3.208.0", 247 | "tslib": "^2.3.1" 248 | }, 249 | "engines": { 250 | "node": ">=14.0.0" 251 | } 252 | }, 253 | "node_modules/@aws-sdk/client-sts": { 254 | "version": "3.245.0", 255 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.245.0.tgz", 256 | "integrity": "sha512-E+7v2sy34TLni/Dmz6bTU20NWvbHYH9sVUHKQ9kHhmFopUWrs4Nt77f85PbuiKJz/irjUh9ppT5q1odJNRKRVQ==", 257 | "dev": true, 258 | "dependencies": { 259 | "@aws-crypto/sha256-browser": "2.0.0", 260 | "@aws-crypto/sha256-js": "2.0.0", 261 | "@aws-sdk/config-resolver": "3.234.0", 262 | "@aws-sdk/credential-provider-node": "3.245.0", 263 | "@aws-sdk/fetch-http-handler": "3.226.0", 264 | "@aws-sdk/hash-node": "3.226.0", 265 | "@aws-sdk/invalid-dependency": "3.226.0", 266 | "@aws-sdk/middleware-content-length": "3.226.0", 267 | "@aws-sdk/middleware-endpoint": "3.226.0", 268 | "@aws-sdk/middleware-host-header": "3.226.0", 269 | "@aws-sdk/middleware-logger": "3.226.0", 270 | "@aws-sdk/middleware-recursion-detection": "3.226.0", 271 | "@aws-sdk/middleware-retry": "3.235.0", 272 | "@aws-sdk/middleware-sdk-sts": "3.226.0", 273 | "@aws-sdk/middleware-serde": "3.226.0", 274 | "@aws-sdk/middleware-signing": "3.226.0", 275 | "@aws-sdk/middleware-stack": "3.226.0", 276 | "@aws-sdk/middleware-user-agent": "3.226.0", 277 | "@aws-sdk/node-config-provider": "3.226.0", 278 | "@aws-sdk/node-http-handler": "3.226.0", 279 | "@aws-sdk/protocol-http": "3.226.0", 280 | "@aws-sdk/smithy-client": "3.234.0", 281 | "@aws-sdk/types": "3.226.0", 282 | "@aws-sdk/url-parser": "3.226.0", 283 | "@aws-sdk/util-base64": "3.208.0", 284 | "@aws-sdk/util-body-length-browser": "3.188.0", 285 | "@aws-sdk/util-body-length-node": "3.208.0", 286 | "@aws-sdk/util-defaults-mode-browser": "3.234.0", 287 | "@aws-sdk/util-defaults-mode-node": "3.234.0", 288 | "@aws-sdk/util-endpoints": "3.245.0", 289 | "@aws-sdk/util-retry": "3.229.0", 290 | "@aws-sdk/util-user-agent-browser": "3.226.0", 291 | "@aws-sdk/util-user-agent-node": "3.226.0", 292 | "@aws-sdk/util-utf8-browser": "3.188.0", 293 | "@aws-sdk/util-utf8-node": "3.208.0", 294 | "fast-xml-parser": "4.0.11", 295 | "tslib": "^2.3.1" 296 | }, 297 | "engines": { 298 | "node": ">=14.0.0" 299 | } 300 | }, 301 | "node_modules/@aws-sdk/config-resolver": { 302 | "version": "3.234.0", 303 | "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.234.0.tgz", 304 | "integrity": "sha512-uZxy4wzllfvgCQxVc+Iqhde0NGAnfmV2hWR6ejadJaAFTuYNvQiRg9IqJy3pkyDPqXySiJ8Bom5PoJfgn55J/A==", 305 | "dev": true, 306 | "dependencies": { 307 | "@aws-sdk/signature-v4": "3.226.0", 308 | "@aws-sdk/types": "3.226.0", 309 | "@aws-sdk/util-config-provider": "3.208.0", 310 | "@aws-sdk/util-middleware": "3.226.0", 311 | "tslib": "^2.3.1" 312 | }, 313 | "engines": { 314 | "node": ">=14.0.0" 315 | } 316 | }, 317 | "node_modules/@aws-sdk/credential-provider-env": { 318 | "version": "3.226.0", 319 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.226.0.tgz", 320 | "integrity": "sha512-sd8uK1ojbXxaZXlthzw/VXZwCPUtU3PjObOfr3Evj7MPIM2IH8h29foOlggx939MdLQGboJf9gKvLlvKDWtJRA==", 321 | "dev": true, 322 | "dependencies": { 323 | "@aws-sdk/property-provider": "3.226.0", 324 | "@aws-sdk/types": "3.226.0", 325 | "tslib": "^2.3.1" 326 | }, 327 | "engines": { 328 | "node": ">=14.0.0" 329 | } 330 | }, 331 | "node_modules/@aws-sdk/credential-provider-imds": { 332 | "version": "3.226.0", 333 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.226.0.tgz", 334 | "integrity": "sha512-//z/COQm2AjYFI1Lb0wKHTQSrvLFTyuKLFQGPJsKS7DPoxGOCKB7hmYerlbl01IDoCxTdyL//TyyPxbZEOQD5Q==", 335 | "dev": true, 336 | "dependencies": { 337 | "@aws-sdk/node-config-provider": "3.226.0", 338 | "@aws-sdk/property-provider": "3.226.0", 339 | "@aws-sdk/types": "3.226.0", 340 | "@aws-sdk/url-parser": "3.226.0", 341 | "tslib": "^2.3.1" 342 | }, 343 | "engines": { 344 | "node": ">=14.0.0" 345 | } 346 | }, 347 | "node_modules/@aws-sdk/credential-provider-ini": { 348 | "version": "3.245.0", 349 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.245.0.tgz", 350 | "integrity": "sha512-1SjfVc5Wg0lLRUvwMrfjGgFkl+zfxn74gnkPr6by1QyMAoTzmeUkalPLAIqd+uHtFom9e3K633BQtX7zVPZ5XQ==", 351 | "dev": true, 352 | "dependencies": { 353 | "@aws-sdk/credential-provider-env": "3.226.0", 354 | "@aws-sdk/credential-provider-imds": "3.226.0", 355 | "@aws-sdk/credential-provider-process": "3.226.0", 356 | "@aws-sdk/credential-provider-sso": "3.245.0", 357 | "@aws-sdk/credential-provider-web-identity": "3.226.0", 358 | "@aws-sdk/property-provider": "3.226.0", 359 | "@aws-sdk/shared-ini-file-loader": "3.226.0", 360 | "@aws-sdk/types": "3.226.0", 361 | "tslib": "^2.3.1" 362 | }, 363 | "engines": { 364 | "node": ">=14.0.0" 365 | } 366 | }, 367 | "node_modules/@aws-sdk/credential-provider-node": { 368 | "version": "3.245.0", 369 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.245.0.tgz", 370 | "integrity": "sha512-Dwv8zmRLTDLeEkGrK/sLNFZSC+ahXZxr07CuID054QKACIdUEvkqYlnalRiTeXngiHGQ54u8wU7f0D32R2oL0g==", 371 | "dev": true, 372 | "dependencies": { 373 | "@aws-sdk/credential-provider-env": "3.226.0", 374 | "@aws-sdk/credential-provider-imds": "3.226.0", 375 | "@aws-sdk/credential-provider-ini": "3.245.0", 376 | "@aws-sdk/credential-provider-process": "3.226.0", 377 | "@aws-sdk/credential-provider-sso": "3.245.0", 378 | "@aws-sdk/credential-provider-web-identity": "3.226.0", 379 | "@aws-sdk/property-provider": "3.226.0", 380 | "@aws-sdk/shared-ini-file-loader": "3.226.0", 381 | "@aws-sdk/types": "3.226.0", 382 | "tslib": "^2.3.1" 383 | }, 384 | "engines": { 385 | "node": ">=14.0.0" 386 | } 387 | }, 388 | "node_modules/@aws-sdk/credential-provider-process": { 389 | "version": "3.226.0", 390 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.226.0.tgz", 391 | "integrity": "sha512-iUDMdnrTvbvaCFhWwqyXrhvQ9+ojPqPqXhwZtY1X/Qaz+73S9gXBPJHZaZb2Ke0yKE1Ql3bJbKvmmxC/qLQMng==", 392 | "dev": true, 393 | "dependencies": { 394 | "@aws-sdk/property-provider": "3.226.0", 395 | "@aws-sdk/shared-ini-file-loader": "3.226.0", 396 | "@aws-sdk/types": "3.226.0", 397 | "tslib": "^2.3.1" 398 | }, 399 | "engines": { 400 | "node": ">=14.0.0" 401 | } 402 | }, 403 | "node_modules/@aws-sdk/credential-provider-sso": { 404 | "version": "3.245.0", 405 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.245.0.tgz", 406 | "integrity": "sha512-txWrJc0WNBhXMi7q+twjx7cs/qzgTfbQ+vbag5idRmdoUeiR8rfLvihCab2NaGg50xhh+TaoUCXrgJp3E/XjYQ==", 407 | "dev": true, 408 | "dependencies": { 409 | "@aws-sdk/client-sso": "3.245.0", 410 | "@aws-sdk/property-provider": "3.226.0", 411 | "@aws-sdk/shared-ini-file-loader": "3.226.0", 412 | "@aws-sdk/token-providers": "3.245.0", 413 | "@aws-sdk/types": "3.226.0", 414 | "tslib": "^2.3.1" 415 | }, 416 | "engines": { 417 | "node": ">=14.0.0" 418 | } 419 | }, 420 | "node_modules/@aws-sdk/credential-provider-web-identity": { 421 | "version": "3.226.0", 422 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.226.0.tgz", 423 | "integrity": "sha512-CCpv847rLB0SFOHz2igvUMFAzeT2fD3YnY4C8jltuJoEkn0ITn1Hlgt13nTJ5BUuvyti2mvyXZHmNzhMIMrIlw==", 424 | "dev": true, 425 | "dependencies": { 426 | "@aws-sdk/property-provider": "3.226.0", 427 | "@aws-sdk/types": "3.226.0", 428 | "tslib": "^2.3.1" 429 | }, 430 | "engines": { 431 | "node": ">=14.0.0" 432 | } 433 | }, 434 | "node_modules/@aws-sdk/endpoint-cache": { 435 | "version": "3.208.0", 436 | "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.208.0.tgz", 437 | "integrity": "sha512-MkrCvaZhTb1qZCjcDH73t5n43h0Kr0GS+30lpXZ9PAnHJZPqv+vhWFPK0ZsFe1XktbS0WOoDR4ED+lWm0Dw7Rg==", 438 | "dev": true, 439 | "dependencies": { 440 | "mnemonist": "0.38.3", 441 | "tslib": "^2.3.1" 442 | }, 443 | "engines": { 444 | "node": ">=14.0.0" 445 | } 446 | }, 447 | "node_modules/@aws-sdk/fetch-http-handler": { 448 | "version": "3.226.0", 449 | "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.226.0.tgz", 450 | "integrity": "sha512-JewZPMNEBXfi1xVnRa7pVtK/zgZD8/lQ/YnD8pq79WuMa2cwyhDtr8oqCoqsPW+WJT5ScXoMtuHxN78l8eKWgg==", 451 | "dev": true, 452 | "dependencies": { 453 | "@aws-sdk/protocol-http": "3.226.0", 454 | "@aws-sdk/querystring-builder": "3.226.0", 455 | "@aws-sdk/types": "3.226.0", 456 | "@aws-sdk/util-base64": "3.208.0", 457 | "tslib": "^2.3.1" 458 | } 459 | }, 460 | "node_modules/@aws-sdk/hash-node": { 461 | "version": "3.226.0", 462 | "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.226.0.tgz", 463 | "integrity": "sha512-MdlJhJ9/Espwd0+gUXdZRsHuostB2WxEVAszWxobP0FTT9PnicqnfK7ExmW+DUAc0ywxtEbR3e0UND65rlSTVw==", 464 | "dev": true, 465 | "dependencies": { 466 | "@aws-sdk/types": "3.226.0", 467 | "@aws-sdk/util-buffer-from": "3.208.0", 468 | "tslib": "^2.3.1" 469 | }, 470 | "engines": { 471 | "node": ">=14.0.0" 472 | } 473 | }, 474 | "node_modules/@aws-sdk/invalid-dependency": { 475 | "version": "3.226.0", 476 | "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.226.0.tgz", 477 | "integrity": "sha512-QXOYFmap8g9QzRjumcRCIo2GEZkdCwd7ePQW0OABWPhKHzlJ74vvBxywjU3s39EEBEluWXtZ7Iufg6GxZM4ifw==", 478 | "dev": true, 479 | "dependencies": { 480 | "@aws-sdk/types": "3.226.0", 481 | "tslib": "^2.3.1" 482 | } 483 | }, 484 | "node_modules/@aws-sdk/is-array-buffer": { 485 | "version": "3.201.0", 486 | "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", 487 | "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", 488 | "dev": true, 489 | "dependencies": { 490 | "tslib": "^2.3.1" 491 | }, 492 | "engines": { 493 | "node": ">=14.0.0" 494 | } 495 | }, 496 | "node_modules/@aws-sdk/middleware-content-length": { 497 | "version": "3.226.0", 498 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.226.0.tgz", 499 | "integrity": "sha512-ksUzlHJN2JMuyavjA46a4sctvnrnITqt2tbGGWWrAuXY1mel2j+VbgnmJUiwHKUO6bTFBBeft5Vd1TSOb4JmiA==", 500 | "dev": true, 501 | "dependencies": { 502 | "@aws-sdk/protocol-http": "3.226.0", 503 | "@aws-sdk/types": "3.226.0", 504 | "tslib": "^2.3.1" 505 | }, 506 | "engines": { 507 | "node": ">=14.0.0" 508 | } 509 | }, 510 | "node_modules/@aws-sdk/middleware-endpoint": { 511 | "version": "3.226.0", 512 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.226.0.tgz", 513 | "integrity": "sha512-EvLFafjtUxTT0AC9p3aBQu1/fjhWdIeK58jIXaNFONfZ3F8QbEYUPuF/SqZvJM6cWfOO9qwYKkRDbCSTYhprIg==", 514 | "dev": true, 515 | "dependencies": { 516 | "@aws-sdk/middleware-serde": "3.226.0", 517 | "@aws-sdk/protocol-http": "3.226.0", 518 | "@aws-sdk/signature-v4": "3.226.0", 519 | "@aws-sdk/types": "3.226.0", 520 | "@aws-sdk/url-parser": "3.226.0", 521 | "@aws-sdk/util-config-provider": "3.208.0", 522 | "@aws-sdk/util-middleware": "3.226.0", 523 | "tslib": "^2.3.1" 524 | }, 525 | "engines": { 526 | "node": ">=14.0.0" 527 | } 528 | }, 529 | "node_modules/@aws-sdk/middleware-endpoint-discovery": { 530 | "version": "3.234.0", 531 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.234.0.tgz", 532 | "integrity": "sha512-HNZJbxXrSJfITJjAisqrju7T4S7U186xcmYr28CZX9XQNm6fc/bxcqj+8JRntWsekiJYyTvQLIrKxiCaa+TA9A==", 533 | "dev": true, 534 | "dependencies": { 535 | "@aws-sdk/config-resolver": "3.234.0", 536 | "@aws-sdk/endpoint-cache": "3.208.0", 537 | "@aws-sdk/protocol-http": "3.226.0", 538 | "@aws-sdk/types": "3.226.0", 539 | "tslib": "^2.3.1" 540 | }, 541 | "engines": { 542 | "node": ">=14.0.0" 543 | } 544 | }, 545 | "node_modules/@aws-sdk/middleware-host-header": { 546 | "version": "3.226.0", 547 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.226.0.tgz", 548 | "integrity": "sha512-haVkWVh6BUPwKgWwkL6sDvTkcZWvJjv8AgC8jiQuSl8GLZdzHTB8Qhi3IsfFta9HAuoLjxheWBE5Z/L0UrfhLA==", 549 | "dev": true, 550 | "dependencies": { 551 | "@aws-sdk/protocol-http": "3.226.0", 552 | "@aws-sdk/types": "3.226.0", 553 | "tslib": "^2.3.1" 554 | }, 555 | "engines": { 556 | "node": ">=14.0.0" 557 | } 558 | }, 559 | "node_modules/@aws-sdk/middleware-logger": { 560 | "version": "3.226.0", 561 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.226.0.tgz", 562 | "integrity": "sha512-m9gtLrrYnpN6yckcQ09rV7ExWOLMuq8mMPF/K3DbL/YL0TuILu9i2T1W+JuxSX+K9FMG2HrLAKivE/kMLr55xA==", 563 | "dev": true, 564 | "dependencies": { 565 | "@aws-sdk/types": "3.226.0", 566 | "tslib": "^2.3.1" 567 | }, 568 | "engines": { 569 | "node": ">=14.0.0" 570 | } 571 | }, 572 | "node_modules/@aws-sdk/middleware-recursion-detection": { 573 | "version": "3.226.0", 574 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.226.0.tgz", 575 | "integrity": "sha512-mwRbdKEUeuNH5TEkyZ5FWxp6bL2UC1WbY+LDv6YjHxmSMKpAoOueEdtU34PqDOLrpXXxIGHDFmjeGeMfktyEcA==", 576 | "dev": true, 577 | "dependencies": { 578 | "@aws-sdk/protocol-http": "3.226.0", 579 | "@aws-sdk/types": "3.226.0", 580 | "tslib": "^2.3.1" 581 | }, 582 | "engines": { 583 | "node": ">=14.0.0" 584 | } 585 | }, 586 | "node_modules/@aws-sdk/middleware-retry": { 587 | "version": "3.235.0", 588 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.235.0.tgz", 589 | "integrity": "sha512-50WHbJGpD3SNp9763MAlHqIhXil++JdQbKejNpHg7HsJne/ao3ub+fDOfx//mMBjpzBV25BGd5UlfL6blrClSg==", 590 | "dev": true, 591 | "dependencies": { 592 | "@aws-sdk/protocol-http": "3.226.0", 593 | "@aws-sdk/service-error-classification": "3.229.0", 594 | "@aws-sdk/types": "3.226.0", 595 | "@aws-sdk/util-middleware": "3.226.0", 596 | "@aws-sdk/util-retry": "3.229.0", 597 | "tslib": "^2.3.1", 598 | "uuid": "^8.3.2" 599 | }, 600 | "engines": { 601 | "node": ">=14.0.0" 602 | } 603 | }, 604 | "node_modules/@aws-sdk/middleware-sdk-sts": { 605 | "version": "3.226.0", 606 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.226.0.tgz", 607 | "integrity": "sha512-NN9T/qoSD1kZvAT+VLny3NnlqgylYQcsgV3rvi/8lYzw/G/2s8VS6sm/VTWGGZhx08wZRv20MWzYu3bftcyqUg==", 608 | "dev": true, 609 | "dependencies": { 610 | "@aws-sdk/middleware-signing": "3.226.0", 611 | "@aws-sdk/property-provider": "3.226.0", 612 | "@aws-sdk/protocol-http": "3.226.0", 613 | "@aws-sdk/signature-v4": "3.226.0", 614 | "@aws-sdk/types": "3.226.0", 615 | "tslib": "^2.3.1" 616 | }, 617 | "engines": { 618 | "node": ">=14.0.0" 619 | } 620 | }, 621 | "node_modules/@aws-sdk/middleware-serde": { 622 | "version": "3.226.0", 623 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.226.0.tgz", 624 | "integrity": "sha512-nPuOOAkSfx9TxzdKFx0X2bDlinOxGrqD7iof926K/AEflxGD1DBdcaDdjlYlPDW2CVE8LV/rAgbYuLxh/E/1VA==", 625 | "dev": true, 626 | "dependencies": { 627 | "@aws-sdk/types": "3.226.0", 628 | "tslib": "^2.3.1" 629 | }, 630 | "engines": { 631 | "node": ">=14.0.0" 632 | } 633 | }, 634 | "node_modules/@aws-sdk/middleware-signing": { 635 | "version": "3.226.0", 636 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.226.0.tgz", 637 | "integrity": "sha512-E6HmtPcl+IjYDDzi1xI2HpCbBq2avNWcjvCriMZWuTAtRVpnA6XDDGW5GY85IfS3A8G8vuWqEVPr8JcYUcjfew==", 638 | "dev": true, 639 | "dependencies": { 640 | "@aws-sdk/property-provider": "3.226.0", 641 | "@aws-sdk/protocol-http": "3.226.0", 642 | "@aws-sdk/signature-v4": "3.226.0", 643 | "@aws-sdk/types": "3.226.0", 644 | "@aws-sdk/util-middleware": "3.226.0", 645 | "tslib": "^2.3.1" 646 | }, 647 | "engines": { 648 | "node": ">=14.0.0" 649 | } 650 | }, 651 | "node_modules/@aws-sdk/middleware-stack": { 652 | "version": "3.226.0", 653 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.226.0.tgz", 654 | "integrity": "sha512-85wF29LvPvpoed60fZGDYLwv1Zpd/cM0C22WSSFPw1SSJeqO4gtFYyCg2squfT3KI6kF43IIkOCJ+L7GtryPug==", 655 | "dev": true, 656 | "dependencies": { 657 | "tslib": "^2.3.1" 658 | }, 659 | "engines": { 660 | "node": ">=14.0.0" 661 | } 662 | }, 663 | "node_modules/@aws-sdk/middleware-user-agent": { 664 | "version": "3.226.0", 665 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.226.0.tgz", 666 | "integrity": "sha512-N1WnfzCW1Y5yWhVAphf8OPGTe8Df3vmV7/LdsoQfmpkCZgLZeK2o0xITkUQhRj1mbw7yp8tVFLFV3R2lMurdAQ==", 667 | "dev": true, 668 | "dependencies": { 669 | "@aws-sdk/protocol-http": "3.226.0", 670 | "@aws-sdk/types": "3.226.0", 671 | "tslib": "^2.3.1" 672 | }, 673 | "engines": { 674 | "node": ">=14.0.0" 675 | } 676 | }, 677 | "node_modules/@aws-sdk/node-config-provider": { 678 | "version": "3.226.0", 679 | "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.226.0.tgz", 680 | "integrity": "sha512-B8lQDqiRk7X5izFEUMXmi8CZLOKCTWQJU9HQf3ako+sF0gexo4nHN3jhoRWyLtcgC5S3on/2jxpAcqtm7kuY3w==", 681 | "dev": true, 682 | "dependencies": { 683 | "@aws-sdk/property-provider": "3.226.0", 684 | "@aws-sdk/shared-ini-file-loader": "3.226.0", 685 | "@aws-sdk/types": "3.226.0", 686 | "tslib": "^2.3.1" 687 | }, 688 | "engines": { 689 | "node": ">=14.0.0" 690 | } 691 | }, 692 | "node_modules/@aws-sdk/node-http-handler": { 693 | "version": "3.226.0", 694 | "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.226.0.tgz", 695 | "integrity": "sha512-xQCddnZNMiPmjr3W7HYM+f5ir4VfxgJh37eqZwX6EZmyItFpNNeVzKUgA920ka1VPz/ZUYB+2OFGiX3LCLkkaA==", 696 | "dev": true, 697 | "dependencies": { 698 | "@aws-sdk/abort-controller": "3.226.0", 699 | "@aws-sdk/protocol-http": "3.226.0", 700 | "@aws-sdk/querystring-builder": "3.226.0", 701 | "@aws-sdk/types": "3.226.0", 702 | "tslib": "^2.3.1" 703 | }, 704 | "engines": { 705 | "node": ">=14.0.0" 706 | } 707 | }, 708 | "node_modules/@aws-sdk/property-provider": { 709 | "version": "3.226.0", 710 | "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.226.0.tgz", 711 | "integrity": "sha512-TsljjG+Sg0LmdgfiAlWohluWKnxB/k8xenjeozZfzOr5bHmNHtdbWv6BtNvD/R83hw7SFXxbJHlD5H4u9p2NFg==", 712 | "dev": true, 713 | "dependencies": { 714 | "@aws-sdk/types": "3.226.0", 715 | "tslib": "^2.3.1" 716 | }, 717 | "engines": { 718 | "node": ">=14.0.0" 719 | } 720 | }, 721 | "node_modules/@aws-sdk/protocol-http": { 722 | "version": "3.226.0", 723 | "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.226.0.tgz", 724 | "integrity": "sha512-zWkVqiTA9RXL6y0hhfZc9bcU4DX2NI6Hw9IhQmSPeM59mdbPjJlY4bLlMr5YxywqO3yQ/ylNoAfrEzrDjlOSRg==", 725 | "dev": true, 726 | "dependencies": { 727 | "@aws-sdk/types": "3.226.0", 728 | "tslib": "^2.3.1" 729 | }, 730 | "engines": { 731 | "node": ">=14.0.0" 732 | } 733 | }, 734 | "node_modules/@aws-sdk/querystring-builder": { 735 | "version": "3.226.0", 736 | "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.226.0.tgz", 737 | "integrity": "sha512-LVurypuNeotO4lmirKXRC4NYrZRAyMJXuwO0f2a5ZAUJCjauwYrifKue6yCfU7bls7gut7nfcR6B99WBYpHs3g==", 738 | "dev": true, 739 | "dependencies": { 740 | "@aws-sdk/types": "3.226.0", 741 | "@aws-sdk/util-uri-escape": "3.201.0", 742 | "tslib": "^2.3.1" 743 | }, 744 | "engines": { 745 | "node": ">=14.0.0" 746 | } 747 | }, 748 | "node_modules/@aws-sdk/querystring-parser": { 749 | "version": "3.226.0", 750 | "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.226.0.tgz", 751 | "integrity": "sha512-FzB+VrQ47KAFxiPt2YXrKZ8AOLZQqGTLCKHzx4bjxGmwgsjV8yIbtJiJhZLMcUQV4LtGeIY9ixIqQhGvnZHE4A==", 752 | "dev": true, 753 | "dependencies": { 754 | "@aws-sdk/types": "3.226.0", 755 | "tslib": "^2.3.1" 756 | }, 757 | "engines": { 758 | "node": ">=14.0.0" 759 | } 760 | }, 761 | "node_modules/@aws-sdk/service-error-classification": { 762 | "version": "3.229.0", 763 | "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.229.0.tgz", 764 | "integrity": "sha512-dnzWWQ0/NoWMUZ5C0DW3dPm0wC1O76Y/SpKbuJzWPkx1EYy6r8p32Ly4D9vUzrKDbRGf48YHIF2kOkBmu21CLg==", 765 | "dev": true, 766 | "engines": { 767 | "node": ">=14.0.0" 768 | } 769 | }, 770 | "node_modules/@aws-sdk/shared-ini-file-loader": { 771 | "version": "3.226.0", 772 | "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.226.0.tgz", 773 | "integrity": "sha512-661VQefsARxVyyV2FX9V61V+nNgImk7aN2hYlFKla6BCwZfMng+dEtD0xVGyg1PfRw0qvEv5LQyxMVgHcUSevA==", 774 | "dev": true, 775 | "dependencies": { 776 | "@aws-sdk/types": "3.226.0", 777 | "tslib": "^2.3.1" 778 | }, 779 | "engines": { 780 | "node": ">=14.0.0" 781 | } 782 | }, 783 | "node_modules/@aws-sdk/signature-v4": { 784 | "version": "3.226.0", 785 | "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.226.0.tgz", 786 | "integrity": "sha512-/R5q5agdPd7HJB68XMzpxrNPk158EHUvkFkuRu5Qf3kkkHebEzWEBlWoVpUe6ss4rP9Tqcue6xPuaftEmhjpYw==", 787 | "dev": true, 788 | "dependencies": { 789 | "@aws-sdk/is-array-buffer": "3.201.0", 790 | "@aws-sdk/types": "3.226.0", 791 | "@aws-sdk/util-hex-encoding": "3.201.0", 792 | "@aws-sdk/util-middleware": "3.226.0", 793 | "@aws-sdk/util-uri-escape": "3.201.0", 794 | "tslib": "^2.3.1" 795 | }, 796 | "engines": { 797 | "node": ">=14.0.0" 798 | } 799 | }, 800 | "node_modules/@aws-sdk/smithy-client": { 801 | "version": "3.234.0", 802 | "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz", 803 | "integrity": "sha512-8AtR/k4vsFvjXeQbIzq/Wy7Nbk48Ou0wUEeVYPHWHPSU8QamFWORkOwmKtKMfHAyZvmqiAPeQqHFkq+UJhWyyQ==", 804 | "dev": true, 805 | "dependencies": { 806 | "@aws-sdk/middleware-stack": "3.226.0", 807 | "@aws-sdk/types": "3.226.0", 808 | "tslib": "^2.3.1" 809 | }, 810 | "engines": { 811 | "node": ">=14.0.0" 812 | } 813 | }, 814 | "node_modules/@aws-sdk/token-providers": { 815 | "version": "3.245.0", 816 | "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.245.0.tgz", 817 | "integrity": "sha512-m/spXR/vEXGb+zMqRUMQYVMwFZSTdK5RkddYqamYkNhIoLm60EYeRu57JsMMs5djKi8dBRSKiXwVHx0l2rXMjg==", 818 | "dev": true, 819 | "dependencies": { 820 | "@aws-sdk/client-sso-oidc": "3.245.0", 821 | "@aws-sdk/property-provider": "3.226.0", 822 | "@aws-sdk/shared-ini-file-loader": "3.226.0", 823 | "@aws-sdk/types": "3.226.0", 824 | "tslib": "^2.3.1" 825 | }, 826 | "engines": { 827 | "node": ">=14.0.0" 828 | } 829 | }, 830 | "node_modules/@aws-sdk/types": { 831 | "version": "3.226.0", 832 | "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.226.0.tgz", 833 | "integrity": "sha512-MmmNHrWeO4man7wpOwrAhXlevqtOV9ZLcH4RhnG5LmRce0RFOApx24HoKENfFCcOyCm5LQBlsXCqi0dZWDWU0A==", 834 | "dev": true, 835 | "dependencies": { 836 | "tslib": "^2.3.1" 837 | }, 838 | "engines": { 839 | "node": ">=14.0.0" 840 | } 841 | }, 842 | "node_modules/@aws-sdk/url-parser": { 843 | "version": "3.226.0", 844 | "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.226.0.tgz", 845 | "integrity": "sha512-p5RLE0QWyP0OcTOLmFcLdVgUcUEzmEfmdrnOxyNzomcYb0p3vUagA5zfa1HVK2azsQJFBv28GfvMnba9bGhObg==", 846 | "dev": true, 847 | "dependencies": { 848 | "@aws-sdk/querystring-parser": "3.226.0", 849 | "@aws-sdk/types": "3.226.0", 850 | "tslib": "^2.3.1" 851 | } 852 | }, 853 | "node_modules/@aws-sdk/util-base64": { 854 | "version": "3.208.0", 855 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", 856 | "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", 857 | "dev": true, 858 | "dependencies": { 859 | "@aws-sdk/util-buffer-from": "3.208.0", 860 | "tslib": "^2.3.1" 861 | }, 862 | "engines": { 863 | "node": ">=14.0.0" 864 | } 865 | }, 866 | "node_modules/@aws-sdk/util-body-length-browser": { 867 | "version": "3.188.0", 868 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", 869 | "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", 870 | "dev": true, 871 | "dependencies": { 872 | "tslib": "^2.3.1" 873 | } 874 | }, 875 | "node_modules/@aws-sdk/util-body-length-node": { 876 | "version": "3.208.0", 877 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", 878 | "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", 879 | "dev": true, 880 | "dependencies": { 881 | "tslib": "^2.3.1" 882 | }, 883 | "engines": { 884 | "node": ">=14.0.0" 885 | } 886 | }, 887 | "node_modules/@aws-sdk/util-buffer-from": { 888 | "version": "3.208.0", 889 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", 890 | "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", 891 | "dev": true, 892 | "dependencies": { 893 | "@aws-sdk/is-array-buffer": "3.201.0", 894 | "tslib": "^2.3.1" 895 | }, 896 | "engines": { 897 | "node": ">=14.0.0" 898 | } 899 | }, 900 | "node_modules/@aws-sdk/util-config-provider": { 901 | "version": "3.208.0", 902 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", 903 | "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", 904 | "dev": true, 905 | "dependencies": { 906 | "tslib": "^2.3.1" 907 | }, 908 | "engines": { 909 | "node": ">=14.0.0" 910 | } 911 | }, 912 | "node_modules/@aws-sdk/util-defaults-mode-browser": { 913 | "version": "3.234.0", 914 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.234.0.tgz", 915 | "integrity": "sha512-IHMKXjTbOD8XMz5+2oCOsVP94BYb9YyjXdns0aAXr2NAo7k2+RCzXQ2DebJXppGda1F6opFutoKwyVSN0cmbMw==", 916 | "dev": true, 917 | "dependencies": { 918 | "@aws-sdk/property-provider": "3.226.0", 919 | "@aws-sdk/types": "3.226.0", 920 | "bowser": "^2.11.0", 921 | "tslib": "^2.3.1" 922 | }, 923 | "engines": { 924 | "node": ">= 10.0.0" 925 | } 926 | }, 927 | "node_modules/@aws-sdk/util-defaults-mode-node": { 928 | "version": "3.234.0", 929 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.234.0.tgz", 930 | "integrity": "sha512-UGjQ+OjBYYhxFVtUY+jtr0ZZgzZh6OHtYwRhFt8IHewJXFCfZTyfsbX20szBj5y1S4HRIUJ7cwBLIytTqMbI5w==", 931 | "dev": true, 932 | "dependencies": { 933 | "@aws-sdk/config-resolver": "3.234.0", 934 | "@aws-sdk/credential-provider-imds": "3.226.0", 935 | "@aws-sdk/node-config-provider": "3.226.0", 936 | "@aws-sdk/property-provider": "3.226.0", 937 | "@aws-sdk/types": "3.226.0", 938 | "tslib": "^2.3.1" 939 | }, 940 | "engines": { 941 | "node": ">= 10.0.0" 942 | } 943 | }, 944 | "node_modules/@aws-sdk/util-dynamodb": { 945 | "version": "3.245.0", 946 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.245.0.tgz", 947 | "integrity": "sha512-Wx06Ey92DRRSQTFfpQs1DkHSoajcwVu2TLWTg07yHXgGxdi6EveJPNqh111ot5yzHGmzPIHas/IPZe3hDttzcw==", 948 | "dev": true, 949 | "dependencies": { 950 | "tslib": "^2.3.1" 951 | }, 952 | "engines": { 953 | "node": ">=14.0.0" 954 | } 955 | }, 956 | "node_modules/@aws-sdk/util-endpoints": { 957 | "version": "3.245.0", 958 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.245.0.tgz", 959 | "integrity": "sha512-UNOFquB1tKx+8RT8n82Zb5tIwDyZHVPBg/m0LB0RsLETjr6krien5ASpqWezsXKIR1hftN9uaxN4bvf2dZrWHg==", 960 | "dev": true, 961 | "dependencies": { 962 | "@aws-sdk/types": "3.226.0", 963 | "tslib": "^2.3.1" 964 | }, 965 | "engines": { 966 | "node": ">=14.0.0" 967 | } 968 | }, 969 | "node_modules/@aws-sdk/util-hex-encoding": { 970 | "version": "3.201.0", 971 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", 972 | "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", 973 | "dev": true, 974 | "dependencies": { 975 | "tslib": "^2.3.1" 976 | }, 977 | "engines": { 978 | "node": ">=14.0.0" 979 | } 980 | }, 981 | "node_modules/@aws-sdk/util-locate-window": { 982 | "version": "3.208.0", 983 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", 984 | "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", 985 | "dev": true, 986 | "dependencies": { 987 | "tslib": "^2.3.1" 988 | }, 989 | "engines": { 990 | "node": ">=14.0.0" 991 | } 992 | }, 993 | "node_modules/@aws-sdk/util-middleware": { 994 | "version": "3.226.0", 995 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.226.0.tgz", 996 | "integrity": "sha512-B96CQnwX4gRvQdaQkdUtqvDPkrptV5+va6FVeJOocU/DbSYMAScLxtR3peMS8cnlOT6nL1Eoa42OI9AfZz1VwQ==", 997 | "dev": true, 998 | "dependencies": { 999 | "tslib": "^2.3.1" 1000 | }, 1001 | "engines": { 1002 | "node": ">=14.0.0" 1003 | } 1004 | }, 1005 | "node_modules/@aws-sdk/util-retry": { 1006 | "version": "3.229.0", 1007 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.229.0.tgz", 1008 | "integrity": "sha512-0zKTqi0P1inD0LzIMuXRIYYQ/8c1lWMg/cfiqUcIAF1TpatlpZuN7umU0ierpBFud7S+zDgg0oemh+Nj8xliJw==", 1009 | "dev": true, 1010 | "dependencies": { 1011 | "@aws-sdk/service-error-classification": "3.229.0", 1012 | "tslib": "^2.3.1" 1013 | }, 1014 | "engines": { 1015 | "node": ">= 14.0.0" 1016 | } 1017 | }, 1018 | "node_modules/@aws-sdk/util-uri-escape": { 1019 | "version": "3.201.0", 1020 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", 1021 | "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", 1022 | "dev": true, 1023 | "dependencies": { 1024 | "tslib": "^2.3.1" 1025 | }, 1026 | "engines": { 1027 | "node": ">=14.0.0" 1028 | } 1029 | }, 1030 | "node_modules/@aws-sdk/util-user-agent-browser": { 1031 | "version": "3.226.0", 1032 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.226.0.tgz", 1033 | "integrity": "sha512-PhBIu2h6sPJPcv2I7ELfFizdl5pNiL4LfxrasMCYXQkJvVnoXztHA1x+CQbXIdtZOIlpjC+6BjDcE0uhnpvfcA==", 1034 | "dev": true, 1035 | "dependencies": { 1036 | "@aws-sdk/types": "3.226.0", 1037 | "bowser": "^2.11.0", 1038 | "tslib": "^2.3.1" 1039 | } 1040 | }, 1041 | "node_modules/@aws-sdk/util-user-agent-node": { 1042 | "version": "3.226.0", 1043 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.226.0.tgz", 1044 | "integrity": "sha512-othPc5Dz/pkYkxH+nZPhc1Al0HndQT8zHD4e9h+EZ+8lkd8n+IsnLfTS/mSJWrfiC6UlNRVw55cItstmJyMe/A==", 1045 | "dev": true, 1046 | "dependencies": { 1047 | "@aws-sdk/node-config-provider": "3.226.0", 1048 | "@aws-sdk/types": "3.226.0", 1049 | "tslib": "^2.3.1" 1050 | }, 1051 | "engines": { 1052 | "node": ">=14.0.0" 1053 | }, 1054 | "peerDependencies": { 1055 | "aws-crt": ">=1.0.0" 1056 | }, 1057 | "peerDependenciesMeta": { 1058 | "aws-crt": { 1059 | "optional": true 1060 | } 1061 | } 1062 | }, 1063 | "node_modules/@aws-sdk/util-utf8-browser": { 1064 | "version": "3.188.0", 1065 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", 1066 | "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", 1067 | "dev": true, 1068 | "dependencies": { 1069 | "tslib": "^2.3.1" 1070 | } 1071 | }, 1072 | "node_modules/@aws-sdk/util-utf8-node": { 1073 | "version": "3.208.0", 1074 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", 1075 | "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==", 1076 | "dev": true, 1077 | "dependencies": { 1078 | "@aws-sdk/util-buffer-from": "3.208.0", 1079 | "tslib": "^2.3.1" 1080 | }, 1081 | "engines": { 1082 | "node": ">=14.0.0" 1083 | } 1084 | }, 1085 | "node_modules/@aws-sdk/util-waiter": { 1086 | "version": "3.226.0", 1087 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.226.0.tgz", 1088 | "integrity": "sha512-qYQMRxnu5k8qQihJXoIWMkBOj0+XkHHj/drLdbRnwL6ni6NcG8++cs9M3DSjIcxmxgF/7SLpDjn1H3sC7cYo4g==", 1089 | "dev": true, 1090 | "dependencies": { 1091 | "@aws-sdk/abort-controller": "3.226.0", 1092 | "@aws-sdk/types": "3.226.0", 1093 | "tslib": "^2.3.1" 1094 | }, 1095 | "engines": { 1096 | "node": ">=14.0.0" 1097 | } 1098 | }, 1099 | "node_modules/bowser": { 1100 | "version": "2.11.0", 1101 | "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", 1102 | "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", 1103 | "dev": true 1104 | }, 1105 | "node_modules/fast-xml-parser": { 1106 | "version": "4.0.11", 1107 | "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", 1108 | "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", 1109 | "dev": true, 1110 | "dependencies": { 1111 | "strnum": "^1.0.5" 1112 | }, 1113 | "bin": { 1114 | "fxparser": "src/cli/cli.js" 1115 | }, 1116 | "funding": { 1117 | "type": "paypal", 1118 | "url": "https://paypal.me/naturalintelligence" 1119 | } 1120 | }, 1121 | "node_modules/mnemonist": { 1122 | "version": "0.38.3", 1123 | "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", 1124 | "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==", 1125 | "dev": true, 1126 | "dependencies": { 1127 | "obliterator": "^1.6.1" 1128 | } 1129 | }, 1130 | "node_modules/obliterator": { 1131 | "version": "1.6.1", 1132 | "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", 1133 | "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==", 1134 | "dev": true 1135 | }, 1136 | "node_modules/strnum": { 1137 | "version": "1.0.5", 1138 | "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", 1139 | "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", 1140 | "dev": true 1141 | }, 1142 | "node_modules/tslib": { 1143 | "version": "2.4.1", 1144 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", 1145 | "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", 1146 | "dev": true 1147 | }, 1148 | "node_modules/uuid": { 1149 | "version": "8.3.2", 1150 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1151 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 1152 | "dev": true, 1153 | "bin": { 1154 | "uuid": "dist/bin/uuid" 1155 | } 1156 | } 1157 | }, 1158 | "dependencies": { 1159 | "@aws-crypto/ie11-detection": { 1160 | "version": "2.0.2", 1161 | "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", 1162 | "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", 1163 | "dev": true, 1164 | "requires": { 1165 | "tslib": "^1.11.1" 1166 | }, 1167 | "dependencies": { 1168 | "tslib": { 1169 | "version": "1.14.1", 1170 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1171 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 1172 | "dev": true 1173 | } 1174 | } 1175 | }, 1176 | "@aws-crypto/sha256-browser": { 1177 | "version": "2.0.0", 1178 | "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", 1179 | "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", 1180 | "dev": true, 1181 | "requires": { 1182 | "@aws-crypto/ie11-detection": "^2.0.0", 1183 | "@aws-crypto/sha256-js": "^2.0.0", 1184 | "@aws-crypto/supports-web-crypto": "^2.0.0", 1185 | "@aws-crypto/util": "^2.0.0", 1186 | "@aws-sdk/types": "^3.1.0", 1187 | "@aws-sdk/util-locate-window": "^3.0.0", 1188 | "@aws-sdk/util-utf8-browser": "^3.0.0", 1189 | "tslib": "^1.11.1" 1190 | }, 1191 | "dependencies": { 1192 | "tslib": { 1193 | "version": "1.14.1", 1194 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1195 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 1196 | "dev": true 1197 | } 1198 | } 1199 | }, 1200 | "@aws-crypto/sha256-js": { 1201 | "version": "2.0.0", 1202 | "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", 1203 | "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", 1204 | "dev": true, 1205 | "requires": { 1206 | "@aws-crypto/util": "^2.0.0", 1207 | "@aws-sdk/types": "^3.1.0", 1208 | "tslib": "^1.11.1" 1209 | }, 1210 | "dependencies": { 1211 | "tslib": { 1212 | "version": "1.14.1", 1213 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1214 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 1215 | "dev": true 1216 | } 1217 | } 1218 | }, 1219 | "@aws-crypto/supports-web-crypto": { 1220 | "version": "2.0.2", 1221 | "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", 1222 | "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", 1223 | "dev": true, 1224 | "requires": { 1225 | "tslib": "^1.11.1" 1226 | }, 1227 | "dependencies": { 1228 | "tslib": { 1229 | "version": "1.14.1", 1230 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1231 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 1232 | "dev": true 1233 | } 1234 | } 1235 | }, 1236 | "@aws-crypto/util": { 1237 | "version": "2.0.2", 1238 | "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", 1239 | "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", 1240 | "dev": true, 1241 | "requires": { 1242 | "@aws-sdk/types": "^3.110.0", 1243 | "@aws-sdk/util-utf8-browser": "^3.0.0", 1244 | "tslib": "^1.11.1" 1245 | }, 1246 | "dependencies": { 1247 | "tslib": { 1248 | "version": "1.14.1", 1249 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1250 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 1251 | "dev": true 1252 | } 1253 | } 1254 | }, 1255 | "@aws-sdk/abort-controller": { 1256 | "version": "3.226.0", 1257 | "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.226.0.tgz", 1258 | "integrity": "sha512-cJVzr1xxPBd08voknXvR0RLgtZKGKt6WyDpH/BaPCu3rfSqWCDZKzwqe940eqosjmKrxC6pUZNKASIqHOQ8xxQ==", 1259 | "dev": true, 1260 | "requires": { 1261 | "@aws-sdk/types": "3.226.0", 1262 | "tslib": "^2.3.1" 1263 | } 1264 | }, 1265 | "@aws-sdk/client-dynamodb": { 1266 | "version": "3.245.0", 1267 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.245.0.tgz", 1268 | "integrity": "sha512-k9zPoUXQ6o91iAIceaDyz1p1tXhA3gcmw4R0oB6gREDGc9bkIqBzwS6+Zu8m4B2PPhZQIl9uMpktHw9NPyMRxA==", 1269 | "dev": true, 1270 | "requires": { 1271 | "@aws-crypto/sha256-browser": "2.0.0", 1272 | "@aws-crypto/sha256-js": "2.0.0", 1273 | "@aws-sdk/client-sts": "3.245.0", 1274 | "@aws-sdk/config-resolver": "3.234.0", 1275 | "@aws-sdk/credential-provider-node": "3.245.0", 1276 | "@aws-sdk/fetch-http-handler": "3.226.0", 1277 | "@aws-sdk/hash-node": "3.226.0", 1278 | "@aws-sdk/invalid-dependency": "3.226.0", 1279 | "@aws-sdk/middleware-content-length": "3.226.0", 1280 | "@aws-sdk/middleware-endpoint": "3.226.0", 1281 | "@aws-sdk/middleware-endpoint-discovery": "3.234.0", 1282 | "@aws-sdk/middleware-host-header": "3.226.0", 1283 | "@aws-sdk/middleware-logger": "3.226.0", 1284 | "@aws-sdk/middleware-recursion-detection": "3.226.0", 1285 | "@aws-sdk/middleware-retry": "3.235.0", 1286 | "@aws-sdk/middleware-serde": "3.226.0", 1287 | "@aws-sdk/middleware-signing": "3.226.0", 1288 | "@aws-sdk/middleware-stack": "3.226.0", 1289 | "@aws-sdk/middleware-user-agent": "3.226.0", 1290 | "@aws-sdk/node-config-provider": "3.226.0", 1291 | "@aws-sdk/node-http-handler": "3.226.0", 1292 | "@aws-sdk/protocol-http": "3.226.0", 1293 | "@aws-sdk/smithy-client": "3.234.0", 1294 | "@aws-sdk/types": "3.226.0", 1295 | "@aws-sdk/url-parser": "3.226.0", 1296 | "@aws-sdk/util-base64": "3.208.0", 1297 | "@aws-sdk/util-body-length-browser": "3.188.0", 1298 | "@aws-sdk/util-body-length-node": "3.208.0", 1299 | "@aws-sdk/util-defaults-mode-browser": "3.234.0", 1300 | "@aws-sdk/util-defaults-mode-node": "3.234.0", 1301 | "@aws-sdk/util-endpoints": "3.245.0", 1302 | "@aws-sdk/util-retry": "3.229.0", 1303 | "@aws-sdk/util-user-agent-browser": "3.226.0", 1304 | "@aws-sdk/util-user-agent-node": "3.226.0", 1305 | "@aws-sdk/util-utf8-browser": "3.188.0", 1306 | "@aws-sdk/util-utf8-node": "3.208.0", 1307 | "@aws-sdk/util-waiter": "3.226.0", 1308 | "tslib": "^2.3.1", 1309 | "uuid": "^8.3.2" 1310 | } 1311 | }, 1312 | "@aws-sdk/client-sso": { 1313 | "version": "3.245.0", 1314 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.245.0.tgz", 1315 | "integrity": "sha512-dxzRwRo55ZNQ4hQigC+cishxLSWlBrbr3iszG0FLviavLDOlnVG5UUxWpOIGvwr8pYiSfM4jnfMxiwYwiCLg1g==", 1316 | "dev": true, 1317 | "requires": { 1318 | "@aws-crypto/sha256-browser": "2.0.0", 1319 | "@aws-crypto/sha256-js": "2.0.0", 1320 | "@aws-sdk/config-resolver": "3.234.0", 1321 | "@aws-sdk/fetch-http-handler": "3.226.0", 1322 | "@aws-sdk/hash-node": "3.226.0", 1323 | "@aws-sdk/invalid-dependency": "3.226.0", 1324 | "@aws-sdk/middleware-content-length": "3.226.0", 1325 | "@aws-sdk/middleware-endpoint": "3.226.0", 1326 | "@aws-sdk/middleware-host-header": "3.226.0", 1327 | "@aws-sdk/middleware-logger": "3.226.0", 1328 | "@aws-sdk/middleware-recursion-detection": "3.226.0", 1329 | "@aws-sdk/middleware-retry": "3.235.0", 1330 | "@aws-sdk/middleware-serde": "3.226.0", 1331 | "@aws-sdk/middleware-stack": "3.226.0", 1332 | "@aws-sdk/middleware-user-agent": "3.226.0", 1333 | "@aws-sdk/node-config-provider": "3.226.0", 1334 | "@aws-sdk/node-http-handler": "3.226.0", 1335 | "@aws-sdk/protocol-http": "3.226.0", 1336 | "@aws-sdk/smithy-client": "3.234.0", 1337 | "@aws-sdk/types": "3.226.0", 1338 | "@aws-sdk/url-parser": "3.226.0", 1339 | "@aws-sdk/util-base64": "3.208.0", 1340 | "@aws-sdk/util-body-length-browser": "3.188.0", 1341 | "@aws-sdk/util-body-length-node": "3.208.0", 1342 | "@aws-sdk/util-defaults-mode-browser": "3.234.0", 1343 | "@aws-sdk/util-defaults-mode-node": "3.234.0", 1344 | "@aws-sdk/util-endpoints": "3.245.0", 1345 | "@aws-sdk/util-retry": "3.229.0", 1346 | "@aws-sdk/util-user-agent-browser": "3.226.0", 1347 | "@aws-sdk/util-user-agent-node": "3.226.0", 1348 | "@aws-sdk/util-utf8-browser": "3.188.0", 1349 | "@aws-sdk/util-utf8-node": "3.208.0", 1350 | "tslib": "^2.3.1" 1351 | } 1352 | }, 1353 | "@aws-sdk/client-sso-oidc": { 1354 | "version": "3.245.0", 1355 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.245.0.tgz", 1356 | "integrity": "sha512-0pGPA00kEsu2Yq1Ul+OwftHxws5YVllm4iZrPtGnqmXr7wmf6B9lOtrMQF44y7Tfw53po6+bKz08OKTEWkkjUA==", 1357 | "dev": true, 1358 | "requires": { 1359 | "@aws-crypto/sha256-browser": "2.0.0", 1360 | "@aws-crypto/sha256-js": "2.0.0", 1361 | "@aws-sdk/config-resolver": "3.234.0", 1362 | "@aws-sdk/fetch-http-handler": "3.226.0", 1363 | "@aws-sdk/hash-node": "3.226.0", 1364 | "@aws-sdk/invalid-dependency": "3.226.0", 1365 | "@aws-sdk/middleware-content-length": "3.226.0", 1366 | "@aws-sdk/middleware-endpoint": "3.226.0", 1367 | "@aws-sdk/middleware-host-header": "3.226.0", 1368 | "@aws-sdk/middleware-logger": "3.226.0", 1369 | "@aws-sdk/middleware-recursion-detection": "3.226.0", 1370 | "@aws-sdk/middleware-retry": "3.235.0", 1371 | "@aws-sdk/middleware-serde": "3.226.0", 1372 | "@aws-sdk/middleware-stack": "3.226.0", 1373 | "@aws-sdk/middleware-user-agent": "3.226.0", 1374 | "@aws-sdk/node-config-provider": "3.226.0", 1375 | "@aws-sdk/node-http-handler": "3.226.0", 1376 | "@aws-sdk/protocol-http": "3.226.0", 1377 | "@aws-sdk/smithy-client": "3.234.0", 1378 | "@aws-sdk/types": "3.226.0", 1379 | "@aws-sdk/url-parser": "3.226.0", 1380 | "@aws-sdk/util-base64": "3.208.0", 1381 | "@aws-sdk/util-body-length-browser": "3.188.0", 1382 | "@aws-sdk/util-body-length-node": "3.208.0", 1383 | "@aws-sdk/util-defaults-mode-browser": "3.234.0", 1384 | "@aws-sdk/util-defaults-mode-node": "3.234.0", 1385 | "@aws-sdk/util-endpoints": "3.245.0", 1386 | "@aws-sdk/util-retry": "3.229.0", 1387 | "@aws-sdk/util-user-agent-browser": "3.226.0", 1388 | "@aws-sdk/util-user-agent-node": "3.226.0", 1389 | "@aws-sdk/util-utf8-browser": "3.188.0", 1390 | "@aws-sdk/util-utf8-node": "3.208.0", 1391 | "tslib": "^2.3.1" 1392 | } 1393 | }, 1394 | "@aws-sdk/client-sts": { 1395 | "version": "3.245.0", 1396 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.245.0.tgz", 1397 | "integrity": "sha512-E+7v2sy34TLni/Dmz6bTU20NWvbHYH9sVUHKQ9kHhmFopUWrs4Nt77f85PbuiKJz/irjUh9ppT5q1odJNRKRVQ==", 1398 | "dev": true, 1399 | "requires": { 1400 | "@aws-crypto/sha256-browser": "2.0.0", 1401 | "@aws-crypto/sha256-js": "2.0.0", 1402 | "@aws-sdk/config-resolver": "3.234.0", 1403 | "@aws-sdk/credential-provider-node": "3.245.0", 1404 | "@aws-sdk/fetch-http-handler": "3.226.0", 1405 | "@aws-sdk/hash-node": "3.226.0", 1406 | "@aws-sdk/invalid-dependency": "3.226.0", 1407 | "@aws-sdk/middleware-content-length": "3.226.0", 1408 | "@aws-sdk/middleware-endpoint": "3.226.0", 1409 | "@aws-sdk/middleware-host-header": "3.226.0", 1410 | "@aws-sdk/middleware-logger": "3.226.0", 1411 | "@aws-sdk/middleware-recursion-detection": "3.226.0", 1412 | "@aws-sdk/middleware-retry": "3.235.0", 1413 | "@aws-sdk/middleware-sdk-sts": "3.226.0", 1414 | "@aws-sdk/middleware-serde": "3.226.0", 1415 | "@aws-sdk/middleware-signing": "3.226.0", 1416 | "@aws-sdk/middleware-stack": "3.226.0", 1417 | "@aws-sdk/middleware-user-agent": "3.226.0", 1418 | "@aws-sdk/node-config-provider": "3.226.0", 1419 | "@aws-sdk/node-http-handler": "3.226.0", 1420 | "@aws-sdk/protocol-http": "3.226.0", 1421 | "@aws-sdk/smithy-client": "3.234.0", 1422 | "@aws-sdk/types": "3.226.0", 1423 | "@aws-sdk/url-parser": "3.226.0", 1424 | "@aws-sdk/util-base64": "3.208.0", 1425 | "@aws-sdk/util-body-length-browser": "3.188.0", 1426 | "@aws-sdk/util-body-length-node": "3.208.0", 1427 | "@aws-sdk/util-defaults-mode-browser": "3.234.0", 1428 | "@aws-sdk/util-defaults-mode-node": "3.234.0", 1429 | "@aws-sdk/util-endpoints": "3.245.0", 1430 | "@aws-sdk/util-retry": "3.229.0", 1431 | "@aws-sdk/util-user-agent-browser": "3.226.0", 1432 | "@aws-sdk/util-user-agent-node": "3.226.0", 1433 | "@aws-sdk/util-utf8-browser": "3.188.0", 1434 | "@aws-sdk/util-utf8-node": "3.208.0", 1435 | "fast-xml-parser": "4.0.11", 1436 | "tslib": "^2.3.1" 1437 | } 1438 | }, 1439 | "@aws-sdk/config-resolver": { 1440 | "version": "3.234.0", 1441 | "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.234.0.tgz", 1442 | "integrity": "sha512-uZxy4wzllfvgCQxVc+Iqhde0NGAnfmV2hWR6ejadJaAFTuYNvQiRg9IqJy3pkyDPqXySiJ8Bom5PoJfgn55J/A==", 1443 | "dev": true, 1444 | "requires": { 1445 | "@aws-sdk/signature-v4": "3.226.0", 1446 | "@aws-sdk/types": "3.226.0", 1447 | "@aws-sdk/util-config-provider": "3.208.0", 1448 | "@aws-sdk/util-middleware": "3.226.0", 1449 | "tslib": "^2.3.1" 1450 | } 1451 | }, 1452 | "@aws-sdk/credential-provider-env": { 1453 | "version": "3.226.0", 1454 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.226.0.tgz", 1455 | "integrity": "sha512-sd8uK1ojbXxaZXlthzw/VXZwCPUtU3PjObOfr3Evj7MPIM2IH8h29foOlggx939MdLQGboJf9gKvLlvKDWtJRA==", 1456 | "dev": true, 1457 | "requires": { 1458 | "@aws-sdk/property-provider": "3.226.0", 1459 | "@aws-sdk/types": "3.226.0", 1460 | "tslib": "^2.3.1" 1461 | } 1462 | }, 1463 | "@aws-sdk/credential-provider-imds": { 1464 | "version": "3.226.0", 1465 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.226.0.tgz", 1466 | "integrity": "sha512-//z/COQm2AjYFI1Lb0wKHTQSrvLFTyuKLFQGPJsKS7DPoxGOCKB7hmYerlbl01IDoCxTdyL//TyyPxbZEOQD5Q==", 1467 | "dev": true, 1468 | "requires": { 1469 | "@aws-sdk/node-config-provider": "3.226.0", 1470 | "@aws-sdk/property-provider": "3.226.0", 1471 | "@aws-sdk/types": "3.226.0", 1472 | "@aws-sdk/url-parser": "3.226.0", 1473 | "tslib": "^2.3.1" 1474 | } 1475 | }, 1476 | "@aws-sdk/credential-provider-ini": { 1477 | "version": "3.245.0", 1478 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.245.0.tgz", 1479 | "integrity": "sha512-1SjfVc5Wg0lLRUvwMrfjGgFkl+zfxn74gnkPr6by1QyMAoTzmeUkalPLAIqd+uHtFom9e3K633BQtX7zVPZ5XQ==", 1480 | "dev": true, 1481 | "requires": { 1482 | "@aws-sdk/credential-provider-env": "3.226.0", 1483 | "@aws-sdk/credential-provider-imds": "3.226.0", 1484 | "@aws-sdk/credential-provider-process": "3.226.0", 1485 | "@aws-sdk/credential-provider-sso": "3.245.0", 1486 | "@aws-sdk/credential-provider-web-identity": "3.226.0", 1487 | "@aws-sdk/property-provider": "3.226.0", 1488 | "@aws-sdk/shared-ini-file-loader": "3.226.0", 1489 | "@aws-sdk/types": "3.226.0", 1490 | "tslib": "^2.3.1" 1491 | } 1492 | }, 1493 | "@aws-sdk/credential-provider-node": { 1494 | "version": "3.245.0", 1495 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.245.0.tgz", 1496 | "integrity": "sha512-Dwv8zmRLTDLeEkGrK/sLNFZSC+ahXZxr07CuID054QKACIdUEvkqYlnalRiTeXngiHGQ54u8wU7f0D32R2oL0g==", 1497 | "dev": true, 1498 | "requires": { 1499 | "@aws-sdk/credential-provider-env": "3.226.0", 1500 | "@aws-sdk/credential-provider-imds": "3.226.0", 1501 | "@aws-sdk/credential-provider-ini": "3.245.0", 1502 | "@aws-sdk/credential-provider-process": "3.226.0", 1503 | "@aws-sdk/credential-provider-sso": "3.245.0", 1504 | "@aws-sdk/credential-provider-web-identity": "3.226.0", 1505 | "@aws-sdk/property-provider": "3.226.0", 1506 | "@aws-sdk/shared-ini-file-loader": "3.226.0", 1507 | "@aws-sdk/types": "3.226.0", 1508 | "tslib": "^2.3.1" 1509 | } 1510 | }, 1511 | "@aws-sdk/credential-provider-process": { 1512 | "version": "3.226.0", 1513 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.226.0.tgz", 1514 | "integrity": "sha512-iUDMdnrTvbvaCFhWwqyXrhvQ9+ojPqPqXhwZtY1X/Qaz+73S9gXBPJHZaZb2Ke0yKE1Ql3bJbKvmmxC/qLQMng==", 1515 | "dev": true, 1516 | "requires": { 1517 | "@aws-sdk/property-provider": "3.226.0", 1518 | "@aws-sdk/shared-ini-file-loader": "3.226.0", 1519 | "@aws-sdk/types": "3.226.0", 1520 | "tslib": "^2.3.1" 1521 | } 1522 | }, 1523 | "@aws-sdk/credential-provider-sso": { 1524 | "version": "3.245.0", 1525 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.245.0.tgz", 1526 | "integrity": "sha512-txWrJc0WNBhXMi7q+twjx7cs/qzgTfbQ+vbag5idRmdoUeiR8rfLvihCab2NaGg50xhh+TaoUCXrgJp3E/XjYQ==", 1527 | "dev": true, 1528 | "requires": { 1529 | "@aws-sdk/client-sso": "3.245.0", 1530 | "@aws-sdk/property-provider": "3.226.0", 1531 | "@aws-sdk/shared-ini-file-loader": "3.226.0", 1532 | "@aws-sdk/token-providers": "3.245.0", 1533 | "@aws-sdk/types": "3.226.0", 1534 | "tslib": "^2.3.1" 1535 | } 1536 | }, 1537 | "@aws-sdk/credential-provider-web-identity": { 1538 | "version": "3.226.0", 1539 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.226.0.tgz", 1540 | "integrity": "sha512-CCpv847rLB0SFOHz2igvUMFAzeT2fD3YnY4C8jltuJoEkn0ITn1Hlgt13nTJ5BUuvyti2mvyXZHmNzhMIMrIlw==", 1541 | "dev": true, 1542 | "requires": { 1543 | "@aws-sdk/property-provider": "3.226.0", 1544 | "@aws-sdk/types": "3.226.0", 1545 | "tslib": "^2.3.1" 1546 | } 1547 | }, 1548 | "@aws-sdk/endpoint-cache": { 1549 | "version": "3.208.0", 1550 | "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.208.0.tgz", 1551 | "integrity": "sha512-MkrCvaZhTb1qZCjcDH73t5n43h0Kr0GS+30lpXZ9PAnHJZPqv+vhWFPK0ZsFe1XktbS0WOoDR4ED+lWm0Dw7Rg==", 1552 | "dev": true, 1553 | "requires": { 1554 | "mnemonist": "0.38.3", 1555 | "tslib": "^2.3.1" 1556 | } 1557 | }, 1558 | "@aws-sdk/fetch-http-handler": { 1559 | "version": "3.226.0", 1560 | "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.226.0.tgz", 1561 | "integrity": "sha512-JewZPMNEBXfi1xVnRa7pVtK/zgZD8/lQ/YnD8pq79WuMa2cwyhDtr8oqCoqsPW+WJT5ScXoMtuHxN78l8eKWgg==", 1562 | "dev": true, 1563 | "requires": { 1564 | "@aws-sdk/protocol-http": "3.226.0", 1565 | "@aws-sdk/querystring-builder": "3.226.0", 1566 | "@aws-sdk/types": "3.226.0", 1567 | "@aws-sdk/util-base64": "3.208.0", 1568 | "tslib": "^2.3.1" 1569 | } 1570 | }, 1571 | "@aws-sdk/hash-node": { 1572 | "version": "3.226.0", 1573 | "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.226.0.tgz", 1574 | "integrity": "sha512-MdlJhJ9/Espwd0+gUXdZRsHuostB2WxEVAszWxobP0FTT9PnicqnfK7ExmW+DUAc0ywxtEbR3e0UND65rlSTVw==", 1575 | "dev": true, 1576 | "requires": { 1577 | "@aws-sdk/types": "3.226.0", 1578 | "@aws-sdk/util-buffer-from": "3.208.0", 1579 | "tslib": "^2.3.1" 1580 | } 1581 | }, 1582 | "@aws-sdk/invalid-dependency": { 1583 | "version": "3.226.0", 1584 | "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.226.0.tgz", 1585 | "integrity": "sha512-QXOYFmap8g9QzRjumcRCIo2GEZkdCwd7ePQW0OABWPhKHzlJ74vvBxywjU3s39EEBEluWXtZ7Iufg6GxZM4ifw==", 1586 | "dev": true, 1587 | "requires": { 1588 | "@aws-sdk/types": "3.226.0", 1589 | "tslib": "^2.3.1" 1590 | } 1591 | }, 1592 | "@aws-sdk/is-array-buffer": { 1593 | "version": "3.201.0", 1594 | "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", 1595 | "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", 1596 | "dev": true, 1597 | "requires": { 1598 | "tslib": "^2.3.1" 1599 | } 1600 | }, 1601 | "@aws-sdk/middleware-content-length": { 1602 | "version": "3.226.0", 1603 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.226.0.tgz", 1604 | "integrity": "sha512-ksUzlHJN2JMuyavjA46a4sctvnrnITqt2tbGGWWrAuXY1mel2j+VbgnmJUiwHKUO6bTFBBeft5Vd1TSOb4JmiA==", 1605 | "dev": true, 1606 | "requires": { 1607 | "@aws-sdk/protocol-http": "3.226.0", 1608 | "@aws-sdk/types": "3.226.0", 1609 | "tslib": "^2.3.1" 1610 | } 1611 | }, 1612 | "@aws-sdk/middleware-endpoint": { 1613 | "version": "3.226.0", 1614 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.226.0.tgz", 1615 | "integrity": "sha512-EvLFafjtUxTT0AC9p3aBQu1/fjhWdIeK58jIXaNFONfZ3F8QbEYUPuF/SqZvJM6cWfOO9qwYKkRDbCSTYhprIg==", 1616 | "dev": true, 1617 | "requires": { 1618 | "@aws-sdk/middleware-serde": "3.226.0", 1619 | "@aws-sdk/protocol-http": "3.226.0", 1620 | "@aws-sdk/signature-v4": "3.226.0", 1621 | "@aws-sdk/types": "3.226.0", 1622 | "@aws-sdk/url-parser": "3.226.0", 1623 | "@aws-sdk/util-config-provider": "3.208.0", 1624 | "@aws-sdk/util-middleware": "3.226.0", 1625 | "tslib": "^2.3.1" 1626 | } 1627 | }, 1628 | "@aws-sdk/middleware-endpoint-discovery": { 1629 | "version": "3.234.0", 1630 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.234.0.tgz", 1631 | "integrity": "sha512-HNZJbxXrSJfITJjAisqrju7T4S7U186xcmYr28CZX9XQNm6fc/bxcqj+8JRntWsekiJYyTvQLIrKxiCaa+TA9A==", 1632 | "dev": true, 1633 | "requires": { 1634 | "@aws-sdk/config-resolver": "3.234.0", 1635 | "@aws-sdk/endpoint-cache": "3.208.0", 1636 | "@aws-sdk/protocol-http": "3.226.0", 1637 | "@aws-sdk/types": "3.226.0", 1638 | "tslib": "^2.3.1" 1639 | } 1640 | }, 1641 | "@aws-sdk/middleware-host-header": { 1642 | "version": "3.226.0", 1643 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.226.0.tgz", 1644 | "integrity": "sha512-haVkWVh6BUPwKgWwkL6sDvTkcZWvJjv8AgC8jiQuSl8GLZdzHTB8Qhi3IsfFta9HAuoLjxheWBE5Z/L0UrfhLA==", 1645 | "dev": true, 1646 | "requires": { 1647 | "@aws-sdk/protocol-http": "3.226.0", 1648 | "@aws-sdk/types": "3.226.0", 1649 | "tslib": "^2.3.1" 1650 | } 1651 | }, 1652 | "@aws-sdk/middleware-logger": { 1653 | "version": "3.226.0", 1654 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.226.0.tgz", 1655 | "integrity": "sha512-m9gtLrrYnpN6yckcQ09rV7ExWOLMuq8mMPF/K3DbL/YL0TuILu9i2T1W+JuxSX+K9FMG2HrLAKivE/kMLr55xA==", 1656 | "dev": true, 1657 | "requires": { 1658 | "@aws-sdk/types": "3.226.0", 1659 | "tslib": "^2.3.1" 1660 | } 1661 | }, 1662 | "@aws-sdk/middleware-recursion-detection": { 1663 | "version": "3.226.0", 1664 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.226.0.tgz", 1665 | "integrity": "sha512-mwRbdKEUeuNH5TEkyZ5FWxp6bL2UC1WbY+LDv6YjHxmSMKpAoOueEdtU34PqDOLrpXXxIGHDFmjeGeMfktyEcA==", 1666 | "dev": true, 1667 | "requires": { 1668 | "@aws-sdk/protocol-http": "3.226.0", 1669 | "@aws-sdk/types": "3.226.0", 1670 | "tslib": "^2.3.1" 1671 | } 1672 | }, 1673 | "@aws-sdk/middleware-retry": { 1674 | "version": "3.235.0", 1675 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.235.0.tgz", 1676 | "integrity": "sha512-50WHbJGpD3SNp9763MAlHqIhXil++JdQbKejNpHg7HsJne/ao3ub+fDOfx//mMBjpzBV25BGd5UlfL6blrClSg==", 1677 | "dev": true, 1678 | "requires": { 1679 | "@aws-sdk/protocol-http": "3.226.0", 1680 | "@aws-sdk/service-error-classification": "3.229.0", 1681 | "@aws-sdk/types": "3.226.0", 1682 | "@aws-sdk/util-middleware": "3.226.0", 1683 | "@aws-sdk/util-retry": "3.229.0", 1684 | "tslib": "^2.3.1", 1685 | "uuid": "^8.3.2" 1686 | } 1687 | }, 1688 | "@aws-sdk/middleware-sdk-sts": { 1689 | "version": "3.226.0", 1690 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.226.0.tgz", 1691 | "integrity": "sha512-NN9T/qoSD1kZvAT+VLny3NnlqgylYQcsgV3rvi/8lYzw/G/2s8VS6sm/VTWGGZhx08wZRv20MWzYu3bftcyqUg==", 1692 | "dev": true, 1693 | "requires": { 1694 | "@aws-sdk/middleware-signing": "3.226.0", 1695 | "@aws-sdk/property-provider": "3.226.0", 1696 | "@aws-sdk/protocol-http": "3.226.0", 1697 | "@aws-sdk/signature-v4": "3.226.0", 1698 | "@aws-sdk/types": "3.226.0", 1699 | "tslib": "^2.3.1" 1700 | } 1701 | }, 1702 | "@aws-sdk/middleware-serde": { 1703 | "version": "3.226.0", 1704 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.226.0.tgz", 1705 | "integrity": "sha512-nPuOOAkSfx9TxzdKFx0X2bDlinOxGrqD7iof926K/AEflxGD1DBdcaDdjlYlPDW2CVE8LV/rAgbYuLxh/E/1VA==", 1706 | "dev": true, 1707 | "requires": { 1708 | "@aws-sdk/types": "3.226.0", 1709 | "tslib": "^2.3.1" 1710 | } 1711 | }, 1712 | "@aws-sdk/middleware-signing": { 1713 | "version": "3.226.0", 1714 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.226.0.tgz", 1715 | "integrity": "sha512-E6HmtPcl+IjYDDzi1xI2HpCbBq2avNWcjvCriMZWuTAtRVpnA6XDDGW5GY85IfS3A8G8vuWqEVPr8JcYUcjfew==", 1716 | "dev": true, 1717 | "requires": { 1718 | "@aws-sdk/property-provider": "3.226.0", 1719 | "@aws-sdk/protocol-http": "3.226.0", 1720 | "@aws-sdk/signature-v4": "3.226.0", 1721 | "@aws-sdk/types": "3.226.0", 1722 | "@aws-sdk/util-middleware": "3.226.0", 1723 | "tslib": "^2.3.1" 1724 | } 1725 | }, 1726 | "@aws-sdk/middleware-stack": { 1727 | "version": "3.226.0", 1728 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.226.0.tgz", 1729 | "integrity": "sha512-85wF29LvPvpoed60fZGDYLwv1Zpd/cM0C22WSSFPw1SSJeqO4gtFYyCg2squfT3KI6kF43IIkOCJ+L7GtryPug==", 1730 | "dev": true, 1731 | "requires": { 1732 | "tslib": "^2.3.1" 1733 | } 1734 | }, 1735 | "@aws-sdk/middleware-user-agent": { 1736 | "version": "3.226.0", 1737 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.226.0.tgz", 1738 | "integrity": "sha512-N1WnfzCW1Y5yWhVAphf8OPGTe8Df3vmV7/LdsoQfmpkCZgLZeK2o0xITkUQhRj1mbw7yp8tVFLFV3R2lMurdAQ==", 1739 | "dev": true, 1740 | "requires": { 1741 | "@aws-sdk/protocol-http": "3.226.0", 1742 | "@aws-sdk/types": "3.226.0", 1743 | "tslib": "^2.3.1" 1744 | } 1745 | }, 1746 | "@aws-sdk/node-config-provider": { 1747 | "version": "3.226.0", 1748 | "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.226.0.tgz", 1749 | "integrity": "sha512-B8lQDqiRk7X5izFEUMXmi8CZLOKCTWQJU9HQf3ako+sF0gexo4nHN3jhoRWyLtcgC5S3on/2jxpAcqtm7kuY3w==", 1750 | "dev": true, 1751 | "requires": { 1752 | "@aws-sdk/property-provider": "3.226.0", 1753 | "@aws-sdk/shared-ini-file-loader": "3.226.0", 1754 | "@aws-sdk/types": "3.226.0", 1755 | "tslib": "^2.3.1" 1756 | } 1757 | }, 1758 | "@aws-sdk/node-http-handler": { 1759 | "version": "3.226.0", 1760 | "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.226.0.tgz", 1761 | "integrity": "sha512-xQCddnZNMiPmjr3W7HYM+f5ir4VfxgJh37eqZwX6EZmyItFpNNeVzKUgA920ka1VPz/ZUYB+2OFGiX3LCLkkaA==", 1762 | "dev": true, 1763 | "requires": { 1764 | "@aws-sdk/abort-controller": "3.226.0", 1765 | "@aws-sdk/protocol-http": "3.226.0", 1766 | "@aws-sdk/querystring-builder": "3.226.0", 1767 | "@aws-sdk/types": "3.226.0", 1768 | "tslib": "^2.3.1" 1769 | } 1770 | }, 1771 | "@aws-sdk/property-provider": { 1772 | "version": "3.226.0", 1773 | "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.226.0.tgz", 1774 | "integrity": "sha512-TsljjG+Sg0LmdgfiAlWohluWKnxB/k8xenjeozZfzOr5bHmNHtdbWv6BtNvD/R83hw7SFXxbJHlD5H4u9p2NFg==", 1775 | "dev": true, 1776 | "requires": { 1777 | "@aws-sdk/types": "3.226.0", 1778 | "tslib": "^2.3.1" 1779 | } 1780 | }, 1781 | "@aws-sdk/protocol-http": { 1782 | "version": "3.226.0", 1783 | "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.226.0.tgz", 1784 | "integrity": "sha512-zWkVqiTA9RXL6y0hhfZc9bcU4DX2NI6Hw9IhQmSPeM59mdbPjJlY4bLlMr5YxywqO3yQ/ylNoAfrEzrDjlOSRg==", 1785 | "dev": true, 1786 | "requires": { 1787 | "@aws-sdk/types": "3.226.0", 1788 | "tslib": "^2.3.1" 1789 | } 1790 | }, 1791 | "@aws-sdk/querystring-builder": { 1792 | "version": "3.226.0", 1793 | "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.226.0.tgz", 1794 | "integrity": "sha512-LVurypuNeotO4lmirKXRC4NYrZRAyMJXuwO0f2a5ZAUJCjauwYrifKue6yCfU7bls7gut7nfcR6B99WBYpHs3g==", 1795 | "dev": true, 1796 | "requires": { 1797 | "@aws-sdk/types": "3.226.0", 1798 | "@aws-sdk/util-uri-escape": "3.201.0", 1799 | "tslib": "^2.3.1" 1800 | } 1801 | }, 1802 | "@aws-sdk/querystring-parser": { 1803 | "version": "3.226.0", 1804 | "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.226.0.tgz", 1805 | "integrity": "sha512-FzB+VrQ47KAFxiPt2YXrKZ8AOLZQqGTLCKHzx4bjxGmwgsjV8yIbtJiJhZLMcUQV4LtGeIY9ixIqQhGvnZHE4A==", 1806 | "dev": true, 1807 | "requires": { 1808 | "@aws-sdk/types": "3.226.0", 1809 | "tslib": "^2.3.1" 1810 | } 1811 | }, 1812 | "@aws-sdk/service-error-classification": { 1813 | "version": "3.229.0", 1814 | "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.229.0.tgz", 1815 | "integrity": "sha512-dnzWWQ0/NoWMUZ5C0DW3dPm0wC1O76Y/SpKbuJzWPkx1EYy6r8p32Ly4D9vUzrKDbRGf48YHIF2kOkBmu21CLg==", 1816 | "dev": true 1817 | }, 1818 | "@aws-sdk/shared-ini-file-loader": { 1819 | "version": "3.226.0", 1820 | "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.226.0.tgz", 1821 | "integrity": "sha512-661VQefsARxVyyV2FX9V61V+nNgImk7aN2hYlFKla6BCwZfMng+dEtD0xVGyg1PfRw0qvEv5LQyxMVgHcUSevA==", 1822 | "dev": true, 1823 | "requires": { 1824 | "@aws-sdk/types": "3.226.0", 1825 | "tslib": "^2.3.1" 1826 | } 1827 | }, 1828 | "@aws-sdk/signature-v4": { 1829 | "version": "3.226.0", 1830 | "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.226.0.tgz", 1831 | "integrity": "sha512-/R5q5agdPd7HJB68XMzpxrNPk158EHUvkFkuRu5Qf3kkkHebEzWEBlWoVpUe6ss4rP9Tqcue6xPuaftEmhjpYw==", 1832 | "dev": true, 1833 | "requires": { 1834 | "@aws-sdk/is-array-buffer": "3.201.0", 1835 | "@aws-sdk/types": "3.226.0", 1836 | "@aws-sdk/util-hex-encoding": "3.201.0", 1837 | "@aws-sdk/util-middleware": "3.226.0", 1838 | "@aws-sdk/util-uri-escape": "3.201.0", 1839 | "tslib": "^2.3.1" 1840 | } 1841 | }, 1842 | "@aws-sdk/smithy-client": { 1843 | "version": "3.234.0", 1844 | "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz", 1845 | "integrity": "sha512-8AtR/k4vsFvjXeQbIzq/Wy7Nbk48Ou0wUEeVYPHWHPSU8QamFWORkOwmKtKMfHAyZvmqiAPeQqHFkq+UJhWyyQ==", 1846 | "dev": true, 1847 | "requires": { 1848 | "@aws-sdk/middleware-stack": "3.226.0", 1849 | "@aws-sdk/types": "3.226.0", 1850 | "tslib": "^2.3.1" 1851 | } 1852 | }, 1853 | "@aws-sdk/token-providers": { 1854 | "version": "3.245.0", 1855 | "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.245.0.tgz", 1856 | "integrity": "sha512-m/spXR/vEXGb+zMqRUMQYVMwFZSTdK5RkddYqamYkNhIoLm60EYeRu57JsMMs5djKi8dBRSKiXwVHx0l2rXMjg==", 1857 | "dev": true, 1858 | "requires": { 1859 | "@aws-sdk/client-sso-oidc": "3.245.0", 1860 | "@aws-sdk/property-provider": "3.226.0", 1861 | "@aws-sdk/shared-ini-file-loader": "3.226.0", 1862 | "@aws-sdk/types": "3.226.0", 1863 | "tslib": "^2.3.1" 1864 | } 1865 | }, 1866 | "@aws-sdk/types": { 1867 | "version": "3.226.0", 1868 | "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.226.0.tgz", 1869 | "integrity": "sha512-MmmNHrWeO4man7wpOwrAhXlevqtOV9ZLcH4RhnG5LmRce0RFOApx24HoKENfFCcOyCm5LQBlsXCqi0dZWDWU0A==", 1870 | "dev": true, 1871 | "requires": { 1872 | "tslib": "^2.3.1" 1873 | } 1874 | }, 1875 | "@aws-sdk/url-parser": { 1876 | "version": "3.226.0", 1877 | "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.226.0.tgz", 1878 | "integrity": "sha512-p5RLE0QWyP0OcTOLmFcLdVgUcUEzmEfmdrnOxyNzomcYb0p3vUagA5zfa1HVK2azsQJFBv28GfvMnba9bGhObg==", 1879 | "dev": true, 1880 | "requires": { 1881 | "@aws-sdk/querystring-parser": "3.226.0", 1882 | "@aws-sdk/types": "3.226.0", 1883 | "tslib": "^2.3.1" 1884 | } 1885 | }, 1886 | "@aws-sdk/util-base64": { 1887 | "version": "3.208.0", 1888 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", 1889 | "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", 1890 | "dev": true, 1891 | "requires": { 1892 | "@aws-sdk/util-buffer-from": "3.208.0", 1893 | "tslib": "^2.3.1" 1894 | } 1895 | }, 1896 | "@aws-sdk/util-body-length-browser": { 1897 | "version": "3.188.0", 1898 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", 1899 | "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", 1900 | "dev": true, 1901 | "requires": { 1902 | "tslib": "^2.3.1" 1903 | } 1904 | }, 1905 | "@aws-sdk/util-body-length-node": { 1906 | "version": "3.208.0", 1907 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", 1908 | "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", 1909 | "dev": true, 1910 | "requires": { 1911 | "tslib": "^2.3.1" 1912 | } 1913 | }, 1914 | "@aws-sdk/util-buffer-from": { 1915 | "version": "3.208.0", 1916 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", 1917 | "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", 1918 | "dev": true, 1919 | "requires": { 1920 | "@aws-sdk/is-array-buffer": "3.201.0", 1921 | "tslib": "^2.3.1" 1922 | } 1923 | }, 1924 | "@aws-sdk/util-config-provider": { 1925 | "version": "3.208.0", 1926 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", 1927 | "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", 1928 | "dev": true, 1929 | "requires": { 1930 | "tslib": "^2.3.1" 1931 | } 1932 | }, 1933 | "@aws-sdk/util-defaults-mode-browser": { 1934 | "version": "3.234.0", 1935 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.234.0.tgz", 1936 | "integrity": "sha512-IHMKXjTbOD8XMz5+2oCOsVP94BYb9YyjXdns0aAXr2NAo7k2+RCzXQ2DebJXppGda1F6opFutoKwyVSN0cmbMw==", 1937 | "dev": true, 1938 | "requires": { 1939 | "@aws-sdk/property-provider": "3.226.0", 1940 | "@aws-sdk/types": "3.226.0", 1941 | "bowser": "^2.11.0", 1942 | "tslib": "^2.3.1" 1943 | } 1944 | }, 1945 | "@aws-sdk/util-defaults-mode-node": { 1946 | "version": "3.234.0", 1947 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.234.0.tgz", 1948 | "integrity": "sha512-UGjQ+OjBYYhxFVtUY+jtr0ZZgzZh6OHtYwRhFt8IHewJXFCfZTyfsbX20szBj5y1S4HRIUJ7cwBLIytTqMbI5w==", 1949 | "dev": true, 1950 | "requires": { 1951 | "@aws-sdk/config-resolver": "3.234.0", 1952 | "@aws-sdk/credential-provider-imds": "3.226.0", 1953 | "@aws-sdk/node-config-provider": "3.226.0", 1954 | "@aws-sdk/property-provider": "3.226.0", 1955 | "@aws-sdk/types": "3.226.0", 1956 | "tslib": "^2.3.1" 1957 | } 1958 | }, 1959 | "@aws-sdk/util-dynamodb": { 1960 | "version": "3.245.0", 1961 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.245.0.tgz", 1962 | "integrity": "sha512-Wx06Ey92DRRSQTFfpQs1DkHSoajcwVu2TLWTg07yHXgGxdi6EveJPNqh111ot5yzHGmzPIHas/IPZe3hDttzcw==", 1963 | "dev": true, 1964 | "requires": { 1965 | "tslib": "^2.3.1" 1966 | } 1967 | }, 1968 | "@aws-sdk/util-endpoints": { 1969 | "version": "3.245.0", 1970 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.245.0.tgz", 1971 | "integrity": "sha512-UNOFquB1tKx+8RT8n82Zb5tIwDyZHVPBg/m0LB0RsLETjr6krien5ASpqWezsXKIR1hftN9uaxN4bvf2dZrWHg==", 1972 | "dev": true, 1973 | "requires": { 1974 | "@aws-sdk/types": "3.226.0", 1975 | "tslib": "^2.3.1" 1976 | } 1977 | }, 1978 | "@aws-sdk/util-hex-encoding": { 1979 | "version": "3.201.0", 1980 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", 1981 | "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", 1982 | "dev": true, 1983 | "requires": { 1984 | "tslib": "^2.3.1" 1985 | } 1986 | }, 1987 | "@aws-sdk/util-locate-window": { 1988 | "version": "3.208.0", 1989 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", 1990 | "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", 1991 | "dev": true, 1992 | "requires": { 1993 | "tslib": "^2.3.1" 1994 | } 1995 | }, 1996 | "@aws-sdk/util-middleware": { 1997 | "version": "3.226.0", 1998 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.226.0.tgz", 1999 | "integrity": "sha512-B96CQnwX4gRvQdaQkdUtqvDPkrptV5+va6FVeJOocU/DbSYMAScLxtR3peMS8cnlOT6nL1Eoa42OI9AfZz1VwQ==", 2000 | "dev": true, 2001 | "requires": { 2002 | "tslib": "^2.3.1" 2003 | } 2004 | }, 2005 | "@aws-sdk/util-retry": { 2006 | "version": "3.229.0", 2007 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.229.0.tgz", 2008 | "integrity": "sha512-0zKTqi0P1inD0LzIMuXRIYYQ/8c1lWMg/cfiqUcIAF1TpatlpZuN7umU0ierpBFud7S+zDgg0oemh+Nj8xliJw==", 2009 | "dev": true, 2010 | "requires": { 2011 | "@aws-sdk/service-error-classification": "3.229.0", 2012 | "tslib": "^2.3.1" 2013 | } 2014 | }, 2015 | "@aws-sdk/util-uri-escape": { 2016 | "version": "3.201.0", 2017 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", 2018 | "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", 2019 | "dev": true, 2020 | "requires": { 2021 | "tslib": "^2.3.1" 2022 | } 2023 | }, 2024 | "@aws-sdk/util-user-agent-browser": { 2025 | "version": "3.226.0", 2026 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.226.0.tgz", 2027 | "integrity": "sha512-PhBIu2h6sPJPcv2I7ELfFizdl5pNiL4LfxrasMCYXQkJvVnoXztHA1x+CQbXIdtZOIlpjC+6BjDcE0uhnpvfcA==", 2028 | "dev": true, 2029 | "requires": { 2030 | "@aws-sdk/types": "3.226.0", 2031 | "bowser": "^2.11.0", 2032 | "tslib": "^2.3.1" 2033 | } 2034 | }, 2035 | "@aws-sdk/util-user-agent-node": { 2036 | "version": "3.226.0", 2037 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.226.0.tgz", 2038 | "integrity": "sha512-othPc5Dz/pkYkxH+nZPhc1Al0HndQT8zHD4e9h+EZ+8lkd8n+IsnLfTS/mSJWrfiC6UlNRVw55cItstmJyMe/A==", 2039 | "dev": true, 2040 | "requires": { 2041 | "@aws-sdk/node-config-provider": "3.226.0", 2042 | "@aws-sdk/types": "3.226.0", 2043 | "tslib": "^2.3.1" 2044 | } 2045 | }, 2046 | "@aws-sdk/util-utf8-browser": { 2047 | "version": "3.188.0", 2048 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", 2049 | "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", 2050 | "dev": true, 2051 | "requires": { 2052 | "tslib": "^2.3.1" 2053 | } 2054 | }, 2055 | "@aws-sdk/util-utf8-node": { 2056 | "version": "3.208.0", 2057 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", 2058 | "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==", 2059 | "dev": true, 2060 | "requires": { 2061 | "@aws-sdk/util-buffer-from": "3.208.0", 2062 | "tslib": "^2.3.1" 2063 | } 2064 | }, 2065 | "@aws-sdk/util-waiter": { 2066 | "version": "3.226.0", 2067 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.226.0.tgz", 2068 | "integrity": "sha512-qYQMRxnu5k8qQihJXoIWMkBOj0+XkHHj/drLdbRnwL6ni6NcG8++cs9M3DSjIcxmxgF/7SLpDjn1H3sC7cYo4g==", 2069 | "dev": true, 2070 | "requires": { 2071 | "@aws-sdk/abort-controller": "3.226.0", 2072 | "@aws-sdk/types": "3.226.0", 2073 | "tslib": "^2.3.1" 2074 | } 2075 | }, 2076 | "bowser": { 2077 | "version": "2.11.0", 2078 | "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", 2079 | "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", 2080 | "dev": true 2081 | }, 2082 | "fast-xml-parser": { 2083 | "version": "4.0.11", 2084 | "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", 2085 | "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", 2086 | "dev": true, 2087 | "requires": { 2088 | "strnum": "^1.0.5" 2089 | } 2090 | }, 2091 | "mnemonist": { 2092 | "version": "0.38.3", 2093 | "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", 2094 | "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==", 2095 | "dev": true, 2096 | "requires": { 2097 | "obliterator": "^1.6.1" 2098 | } 2099 | }, 2100 | "obliterator": { 2101 | "version": "1.6.1", 2102 | "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", 2103 | "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==", 2104 | "dev": true 2105 | }, 2106 | "strnum": { 2107 | "version": "1.0.5", 2108 | "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", 2109 | "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", 2110 | "dev": true 2111 | }, 2112 | "tslib": { 2113 | "version": "2.4.1", 2114 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", 2115 | "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", 2116 | "dev": true 2117 | }, 2118 | "uuid": { 2119 | "version": "8.3.2", 2120 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 2121 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 2122 | "dev": true 2123 | } 2124 | } 2125 | } 2126 | --------------------------------------------------------------------------------