From 449e467f0a8c5e0bddf9d1e01dc351e5a20665ff Mon Sep 17 00:00:00 2001 From: Zane Rockenbaugh Date: Sun, 17 Mar 2024 10:15:08 -0500 Subject: [PATCH 1/3] Improve user descriptions on delete and actually remove from DB --- src/cli/lib/handle-destroy.mjs | 7 +++++- src/lib/actions/destroy.mjs | 37 ++++++++++++++++++++++++++++---- src/lib/shared/site-template.mjs | 9 ++++++-- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/cli/lib/handle-destroy.mjs b/src/cli/lib/handle-destroy.mjs index 2216fde7..e5b1cb88 100644 --- a/src/cli/lib/handle-destroy.mjs +++ b/src/cli/lib/handle-destroy.mjs @@ -17,7 +17,12 @@ const handleDestroy = async ({ argv, globalOptions, sitesInfo }) => { process.exit(3) // eslint-disable-line no-process-exit } - await destroy({ globalOptions, siteInfo, verbose : true }) + const deleted = await destroy({ globalOptions, siteInfo, verbose : true }) + + if (deleted === true) { + process.stdout.write(`Removing ${apexDomain} from local DB.\n`) + delete sitesInfo[apexDomain] + } } export { handleDestroy } diff --git a/src/lib/actions/destroy.mjs b/src/lib/actions/destroy.mjs index 0d3d530d..cb5bd4e2 100644 --- a/src/lib/actions/destroy.mjs +++ b/src/lib/actions/destroy.mjs @@ -15,18 +15,47 @@ const destroy = async ({ globalOptions, siteInfo, verbose }) => { const s3Client = new S3Client({ credentials }) // this method provides user udptaes - await emptyBucket({ bucketName, s3Client, verbose }) + try { + progressLogger?.write('Deleting site bucket...\n') + await emptyBucket({ bucketName, s3Client, verbose }) + } catch (e) { + if (e.name === 'NoSuchBucket') { + progressLogger?.write('Bucket already deleted.\n') + } else { + throw e + } + } const siteTemplate = new SiteTemplate({ credentials, siteInfo }) await siteTemplate.destroyPlugins() - progressLogger.write('Deleting stack...\n') + progressLogger.write('Deleting stack...') const cloudFormationClient = new CloudFormationClient({ credentials }) const deleteStackCommand = new DeleteStackCommand({ StackName : stackName }) await cloudFormationClient.send(deleteStackCommand) - const finalStatus = await trackStackStatus({ cloudFormationClient, noDeleteOnFailure : true, stackName }) - progressLogger?.write('Final status: ' + finalStatus + '\n') + // the delete command is doesn't mind if the bucket doesn't exist, but trackStackStatus does + try { + const finalStatus = await trackStackStatus({ cloudFormationClient, noDeleteOnFailure : true, stackName }) + progressLogger?.write('Final status: ' + finalStatus + '\n') + + if (finalStatus === 'DELETE_FAILED' && progressLogger !== undefined) { + progressLogger.write('\nThe delete is expected to fail at first because the \'replicated Lambda functions\' take a while to clear and the stack cannot be fully deleted until AWS clears the replicated functions. Give it at least 30 min and up to a few hours and try again.') + return false + } else if (finalStatus === 'DELETE_COMPLETE') { + return true + } + } catch (e) { + // oddly, if the stack does not exist we get a ValidationError; which means it's already deleted + if (e.name === 'ValidationError') { + progressLogger.write(' already deleted.\n') + return true + } else { + throw e + } + } finally { + progressLogger?.write('\n') + } } export { destroy } diff --git a/src/lib/shared/site-template.mjs b/src/lib/shared/site-template.mjs index ff3a9164..c0917c9b 100644 --- a/src/lib/shared/site-template.mjs +++ b/src/lib/shared/site-template.mjs @@ -2,9 +2,10 @@ import yaml from 'js-yaml' import { S3Client, DeleteBucketCommand } from '@aws-sdk/client-s3' -import * as plugins from '../plugins' import { determineBucketName } from './determine-bucket-name' import { determineOACName } from './determine-oac-name' +import * as plugins from '../plugins' +import { progressLogger } from './progress-logger' /** * Class encapsulating site stack configuration. Any enabled plugins are loaded and processed by this class. @@ -153,6 +154,7 @@ const SiteTemplate = class { const { siteInfo } = this const { sharedLoggingBucket } = siteInfo + progressLogger.write('Deleting shared logging bucket...\n') const s3Client = new S3Client({ credentials : this.credentials }) const deleteBucketCommand = new DeleteBucketCommand({ Bucket : sharedLoggingBucket }) await s3Client.send(deleteBucketCommand) @@ -197,7 +199,10 @@ const SiteTemplate = class { throw new Error(`Unknown plugin found in '${apexDomain}' plugin settings.`) } - await plugin.preStackDestroyHandler({ siteTemplate : this, settings }) + const { preStackDestroyHandler } = plugin + if (preStackDestroyHandler !== undefined) { + await preStackDestroyHandler({ siteTemplate : this, settings }) + } } } From 80b431f531a9c7d21bd790ae56555051e43f093a Mon Sep 17 00:00:00 2001 From: Zane Rockenbaugh Date: Sun, 17 Mar 2024 10:15:38 -0500 Subject: [PATCH 2/3] Save QA files. --- qa/coverage/base.css | 224 ++++ qa/coverage/block-navigation.js | 87 ++ qa/coverage/cli/cloudsite.mjs.html | 400 ++++++ qa/coverage/cli/constants.mjs.html | 832 ++++++++++++ qa/coverage/cli/index.html | 131 ++ .../handle-configuration-initialize.mjs.html | 181 +++ .../handle-configuration-show.mjs.html | 118 ++ qa/coverage/cli/lib/configuration/index.html | 131 ++ qa/coverage/cli/lib/error-out.mjs.html | 103 ++ qa/coverage/cli/lib/format-output.mjs.html | 136 ++ qa/coverage/cli/lib/get-site-info.mjs.html | 133 ++ .../lib/get-value-container-and-key.mjs.html | 205 +++ .../cli/lib/handle-configuration.mjs.html | 154 +++ qa/coverage/cli/lib/handle-create.mjs.html | 295 +++++ qa/coverage/cli/lib/handle-destroy.mjs.html | 169 +++ qa/coverage/cli/lib/handle-detail.mjs.html | 154 +++ .../cli/lib/handle-get-iam-policy.mjs.html | 415 ++++++ qa/coverage/cli/lib/handle-list.mjs.html | 160 +++ .../cli/lib/handle-plugin-settings.mjs.html | 253 ++++ qa/coverage/cli/lib/handle-update.mjs.html | 151 +++ qa/coverage/cli/lib/handle-verify.mjs.html | 172 +++ qa/coverage/cli/lib/index.html | 326 +++++ qa/coverage/cli/lib/options.mjs.html | 199 +++ qa/coverage/cli/lib/smart-convert.mjs.html | 151 +++ qa/coverage/clover.xml | 1137 +++++++++++++++++ qa/coverage/coverage-final.json | 45 + qa/coverage/favicon.png | Bin 0 -> 445 bytes qa/coverage/index.html | 221 ++++ qa/coverage/lib/actions/create.mjs.html | 559 ++++++++ qa/coverage/lib/actions/destroy.mjs.html | 268 ++++ qa/coverage/lib/actions/index.html | 161 +++ .../lib/create-or-update-dns-records.mjs.html | 250 ++++ .../lib/actions/lib/get-credentials.mjs.html | 169 +++ qa/coverage/lib/actions/lib/index.html | 191 +++ .../actions/lib/sync-site-content.mjs.html | 187 +++ .../actions/lib/track-stack-status.mjs.html | 211 +++ .../lib/actions/lib/update-site-info.mjs.html | 130 ++ .../lib/actions/lib/update-stack.mjs.html | 268 ++++ qa/coverage/lib/actions/update.mjs.html | 244 ++++ qa/coverage/lib/actions/verify.mjs.html | 628 +++++++++ qa/coverage/lib/plugins/access-logs.mjs.html | 118 ++ .../lib/plugins/cloudfront-logs.mjs.html | 160 +++ .../contact-handler/lib/constants.mjs.html | 94 ++ .../determine-lambda-function-name.mjs.html | 187 +++ .../plugins/contact-handler/lib/index.html | 221 ++++ .../lib/setup-contact-emailer.mjs.html | 439 +++++++ .../lib/setup-contact-form-table.mjs.html | 160 +++ .../lib/setup-contact-handler.mjs.html | 454 +++++++ .../lib/setup-request-signer.mjs.html | 352 +++++ .../stage-lambda-function-zip-files.mjs.html | 325 +++++ .../update-cloud-front-distribution.mjs.html | 217 ++++ qa/coverage/lib/plugins/index.html | 131 ++ .../convert-domain-to-bucket-name.js.html | 94 ++ .../lib/shared/determine-bucket-name.mjs.html | 247 ++++ .../lib/shared/determine-oac-name.mjs.html | 235 ++++ qa/coverage/lib/shared/index.html | 176 +++ .../lib/shared/progress-logger.mjs.html | 94 ++ qa/coverage/lib/shared/site-template.mjs.html | 802 ++++++++++++ qa/coverage/prettify.css | 1 + qa/coverage/prettify.js | 2 + qa/coverage/sort-arrow-sprite.png | Bin 0 -> 138 bytes qa/coverage/sorter.js | 196 +++ qa/lint.txt | 1 + qa/unit-test.txt | 67 + 64 files changed, 14722 insertions(+) create mode 100644 qa/coverage/base.css create mode 100644 qa/coverage/block-navigation.js create mode 100644 qa/coverage/cli/cloudsite.mjs.html create mode 100644 qa/coverage/cli/constants.mjs.html create mode 100644 qa/coverage/cli/index.html create mode 100644 qa/coverage/cli/lib/configuration/handle-configuration-initialize.mjs.html create mode 100644 qa/coverage/cli/lib/configuration/handle-configuration-show.mjs.html create mode 100644 qa/coverage/cli/lib/configuration/index.html create mode 100644 qa/coverage/cli/lib/error-out.mjs.html create mode 100644 qa/coverage/cli/lib/format-output.mjs.html create mode 100644 qa/coverage/cli/lib/get-site-info.mjs.html create mode 100644 qa/coverage/cli/lib/get-value-container-and-key.mjs.html create mode 100644 qa/coverage/cli/lib/handle-configuration.mjs.html create mode 100644 qa/coverage/cli/lib/handle-create.mjs.html create mode 100644 qa/coverage/cli/lib/handle-destroy.mjs.html create mode 100644 qa/coverage/cli/lib/handle-detail.mjs.html create mode 100644 qa/coverage/cli/lib/handle-get-iam-policy.mjs.html create mode 100644 qa/coverage/cli/lib/handle-list.mjs.html create mode 100644 qa/coverage/cli/lib/handle-plugin-settings.mjs.html create mode 100644 qa/coverage/cli/lib/handle-update.mjs.html create mode 100644 qa/coverage/cli/lib/handle-verify.mjs.html create mode 100644 qa/coverage/cli/lib/index.html create mode 100644 qa/coverage/cli/lib/options.mjs.html create mode 100644 qa/coverage/cli/lib/smart-convert.mjs.html create mode 100644 qa/coverage/clover.xml create mode 100644 qa/coverage/coverage-final.json create mode 100644 qa/coverage/favicon.png create mode 100644 qa/coverage/index.html create mode 100644 qa/coverage/lib/actions/create.mjs.html create mode 100644 qa/coverage/lib/actions/destroy.mjs.html create mode 100644 qa/coverage/lib/actions/index.html create mode 100644 qa/coverage/lib/actions/lib/create-or-update-dns-records.mjs.html create mode 100644 qa/coverage/lib/actions/lib/get-credentials.mjs.html create mode 100644 qa/coverage/lib/actions/lib/index.html create mode 100644 qa/coverage/lib/actions/lib/sync-site-content.mjs.html create mode 100644 qa/coverage/lib/actions/lib/track-stack-status.mjs.html create mode 100644 qa/coverage/lib/actions/lib/update-site-info.mjs.html create mode 100644 qa/coverage/lib/actions/lib/update-stack.mjs.html create mode 100644 qa/coverage/lib/actions/update.mjs.html create mode 100644 qa/coverage/lib/actions/verify.mjs.html create mode 100644 qa/coverage/lib/plugins/access-logs.mjs.html create mode 100644 qa/coverage/lib/plugins/cloudfront-logs.mjs.html create mode 100644 qa/coverage/lib/plugins/contact-handler/lib/constants.mjs.html create mode 100644 qa/coverage/lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs.html create mode 100644 qa/coverage/lib/plugins/contact-handler/lib/index.html create mode 100644 qa/coverage/lib/plugins/contact-handler/lib/setup-contact-emailer.mjs.html create mode 100644 qa/coverage/lib/plugins/contact-handler/lib/setup-contact-form-table.mjs.html create mode 100644 qa/coverage/lib/plugins/contact-handler/lib/setup-contact-handler.mjs.html create mode 100644 qa/coverage/lib/plugins/contact-handler/lib/setup-request-signer.mjs.html create mode 100644 qa/coverage/lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs.html create mode 100644 qa/coverage/lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs.html create mode 100644 qa/coverage/lib/plugins/index.html create mode 100644 qa/coverage/lib/shared/convert-domain-to-bucket-name.js.html create mode 100644 qa/coverage/lib/shared/determine-bucket-name.mjs.html create mode 100644 qa/coverage/lib/shared/determine-oac-name.mjs.html create mode 100644 qa/coverage/lib/shared/index.html create mode 100644 qa/coverage/lib/shared/progress-logger.mjs.html create mode 100644 qa/coverage/lib/shared/site-template.mjs.html create mode 100644 qa/coverage/prettify.css create mode 100644 qa/coverage/prettify.js create mode 100644 qa/coverage/sort-arrow-sprite.png create mode 100644 qa/coverage/sorter.js create mode 100644 qa/lint.txt create mode 100644 qa/unit-test.txt diff --git a/qa/coverage/base.css b/qa/coverage/base.css new file mode 100644 index 00000000..f418035b --- /dev/null +++ b/qa/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/qa/coverage/block-navigation.js b/qa/coverage/block-navigation.js new file mode 100644 index 00000000..cc121302 --- /dev/null +++ b/qa/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/qa/coverage/cli/cloudsite.mjs.html b/qa/coverage/cli/cloudsite.mjs.html new file mode 100644 index 00000000..b0f0eec8 --- /dev/null +++ b/qa/coverage/cli/cloudsite.mjs.html @@ -0,0 +1,400 @@ + + + + + + Code coverage report for cli/cloudsite.mjs + + + + + + + + + +
+
+

All files / cli cloudsite.mjs

+
+ +
+ 0% + Statements + 0/75 +
+ + +
+ 0% + Branches + 0/28 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as fs from 'node:fs/promises'
+ 
+import commandLineArgs from 'command-line-args'
+import { commandLineDocumentation } from 'command-line-documentation'
+import isEqual from 'lodash/isEqual'
+ 
+import { cliSpec, GLOBAL_OPTIONS_PATH, SITES_INFO_PATH } from './constants'
+import { handleConfiguration } from './lib/handle-configuration'
+import { handleCreate } from './lib/handle-create'
+import { handleDestroy } from './lib/handle-destroy'
+import { handleDetail } from './lib/handle-detail'
+import { handleGetIAMPolicy } from './lib/handle-get-iam-policy'
+import { handleList } from './lib/handle-list'
+import { handlePluginSettings } from './lib/handle-plugin-settings'
+import { handleUpdate } from './lib/handle-update'
+import { handleVerify } from './lib/handle-verify'I
+ 
+const cloudsite = async () => {
+  const mainOptions = commandLineArgs(cliSpec.mainOptions, { stopAtFirstUnknown : true })
+  const argv = mainOptions._unknown || []
+ 
+  const { command/*, quiet */ } = mainOptions
+  const throwError = mainOptions['throw-error']
+ 
+  let globalOptions
+  try {
+    const globalOptionsContent = await fs.readFile(GLOBAL_OPTIONS_PATH, { encoding : 'utf8' })
+    globalOptions = JSON.parse(globalOptionsContent)
+  } catch (e) {
+    Iif (e.code !== 'ENOENT') {
+      throw e
+    }
+    // otherwise, it's fine, there just are no options
+    globalOptions = {}
+  }
+  let sitesInfo
+  Iif (command !== 'configuration') {
+    try {
+      const sitesInfoContent = await fs.readFile(SITES_INFO_PATH, { encoding : 'utf8' })
+      sitesInfo = JSON.parse(sitesInfoContent)
+    } catch (e) {
+      Iif (e.code !== 'ENOENT') {
+        throw e
+      }
+      // otherwise it's fine, there's just no sites info file yet
+      sitesInfo = {}
+    }
+  }
+  const origSitesInfo = structuredClone(sitesInfo)
+ 
+  try {
+    switch (command) {
+      case 'configuration':
+        await handleConfiguration({ argv, cliSpec, globalOptions }); break
+      case 'create':
+        await handleCreate({ argv, globalOptions, sitesInfo }); break
+      case 'destroy':
+        await handleDestroy({ argv, globalOptions, sitesInfo }); break
+      case 'detail':
+        await handleDetail({ argv, globalOptions, sitesInfo }); break
+      case 'document':
+        console.log(commandLineDocumentation(cliSpec, { sectionDepth : 2, title : 'Command reference' }))
+        break
+      case 'get-iam-policy':
+        await handleGetIAMPolicy({ argv }); break
+      case 'list':
+        await handleList({ argv, globalOptions, sitesInfo }); break
+      case 'plugin-settings':
+        await handlePluginSettings({ argv, globalOptions, sitesInfo }); break
+      case 'update':
+        await handleUpdate({ argv, globalOptions, sitesInfo }); break
+      case 'verify':
+        await handleVerify({ argv, globalOptions, sitesInfo }); break
+      default:
+        process.stderr.write('Uknown command: ' + command + '\n\n')
+      // TODO: handleHelp() (abstriact from cloudcraft)
+    }
+  } catch (e) {
+    await checkAndUpdateSitesInfo({ origSitesInfo, sitesInfo })
+    if (throwError === true) {
+      throw e
+    } else if (e.name === 'CredentialsProviderError') {
+      let message = 'Your AWS login credentials may have expired. Update your credentials or try refreshing with:\n\naws sso login'
+      Iif (globalOptions.ssoProfile !== undefined) {
+        message += ' --profile ' + globalOptions.ssoProfile
+      }
+      message += '\n'
+      process.stderr.write(message)
+      process.exit(2) // eslint-disable-line no-process-exit
+    } else {
+      process.stderr.write(e.message + '\n')
+      process.exit(3) // eslint-disable-line no-process-exit
+    }
+  }
+  await checkAndUpdateSitesInfo({ origSitesInfo, sitesInfo })
+}
+ 
+const checkAndUpdateSitesInfo = async ({ origSitesInfo, sitesInfo }) => {
+  Iif (!isEqual(origSitesInfo, sitesInfo)) {
+    const sitesInfoContent = JSON.stringify(sitesInfo, null, '  ')
+    await fs.writeFile(SITES_INFO_PATH, sitesInfoContent, { encoding : 'utf8' })
+  }
+}
+ 
+export { cloudsite }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/constants.mjs.html b/qa/coverage/cli/constants.mjs.html new file mode 100644 index 00000000..78ff2722 --- /dev/null +++ b/qa/coverage/cli/constants.mjs.html @@ -0,0 +1,832 @@ + + + + + + Code coverage report for cli/constants.mjs + + + + + + + + + +
+
+

All files / cli constants.mjs

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 6/6 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +25061x +  +1x +  +1x +  +1x +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as fsPath from 'node:path'
+ 
+const SOURCE_TYPES = ['docusaurus', 'vanilla']
+ 
+const GLOBAL_OPTIONS_PATH = fsPath.join(process.env.HOME, '.config', 'cloudsite', 'global-options.json')
+ 
+const SITES_INFO_PATH = fsPath.join(process.env.HOME, '.config', 'cloudsite', 'sites.json')
+ 
+const optionSpec = {
+  name        : 'option',
+  description : "A combined name-value paid, separated by ':'. Can be used multiple times.",
+  multiple    : true
+}
+ 
+const cliSpec = {
+  mainCommand : 'cloudsite',
+  mainOptions : [
+    { name : 'command', defaultOption : true, description : 'The command to run or a sub-command group.' },
+    { name : 'quiet', alias : 'q', type : Boolean, description : 'Makes informational output less chatty.' },
+    {
+      name        : 'throw-error',
+      type        : Boolean,
+      description : 'In the case of an exception, the default is to print the message. When --throw-error is set, the exception is left uncaught.'
+    }
+  ],
+  commands : [
+    {
+      name        : 'configuration',
+      description : 'Command group for managing the Cloudsite CLI configuration.',
+      arguments   : [
+        {
+          name          : 'subcommand',
+          defaultOption : true,
+          required      : true,
+          description   : 'The configuration action to perform.'
+        }
+      ],
+      commands : [
+        {
+          name        : 'initialize',
+          description : 'Runs the initialization wizard and updates all options.'
+        },
+        {
+          name        : 'show',
+          description : 'Displays the current configuration.'
+        }
+      ]
+    },
+    {
+      name        : 'create',
+      description : 'Creates a new website, setting up infrastructure and copying content.',
+      arguments   : [
+        {
+          name          : 'apex-domain',
+          description   : 'The site apex domain.',
+          defaultOption : true,
+          required      : true
+        },
+        {
+          name        : 'bucket-name',
+          description : 'The name of the bucket to be used. If no option is given, cloudsite will generate a bucket name based on the apex domain.'
+        },
+        {
+          name        : 'no-build',
+          description : 'Supresses the default behavior of building before uploading the site content.',
+          type        : Boolean
+        },
+        {
+          name        : 'no-delete-on-failure',
+          description : 'When true, does not delete the site stack after setup failure.',
+          type        : Boolean
+        },
+        optionSpec,
+        {
+          name        : 'region',
+          description : "The region where to create the site resources. Defaults to 'us-east-1'.",
+          default     : 'us-east-1'
+        },
+        {
+          name        : 'source-path',
+          description : 'Local path to the static site root.',
+          required    : true
+        },
+        {
+          name        : 'source-type',
+          description : "May be either 'vanilla' or 'docusaurus', otherwise process will attempt to guess."
+        },
+        {
+          name        : 'stack-name',
+          description : 'Specify the name of the stack to be created and override the default name.'
+        }
+      ]
+    },
+    {
+      name        : 'destroy',
+      description : 'Destroys the named site. I.e., deletes all cloud resources associated with the site.',
+      arguments   : [
+        {
+          name          : 'apex-domain',
+          description   : 'The domain of the site to delete.',
+          defaultOption : true,
+          required      : true
+        },
+        {
+          name        : 'confirmed',
+          description : 'Skips the interactive confirmation and destroys the resources without further confirmation.',
+          type        : Boolean
+        }
+      ]
+    },
+    {
+      name        : 'detail',
+      description : 'Prints details for the indicated site.',
+      arguments   : [
+        {
+          name          : 'apex-domain',
+          description   : 'The domain of the site to detail.',
+          defaultOption : true,
+          required      : true
+        },
+        {
+          name        : 'format',
+          description : "Sets the format for the output. May be 'terminal' (default), 'text', 'json', or 'yaml'."
+        }
+      ]
+    },
+    {
+      name        : 'get-iam-policy',
+      description : 'Prints an IAM policy suitable for operating cloudsite.',
+      arguments   : [
+        {
+          name        : 'with-instructions',
+          description : 'When set, will print instructions for creating the policy along with the policy.',
+          type        : Boolean
+        }
+      ]
+    },
+    {
+      name        : 'list',
+      description : 'Lists the sites registered in the local database.',
+      arguments   : [
+        {
+          name        : 'all-fields',
+          description : 'Includes all fields in the output.',
+          type        : Boolean
+        },
+        {
+          name        : 'format',
+          description : "Sets the format for the output. May be 'terminal' (default), 'text', 'json', or 'yaml'."
+        }
+      ]
+    },
+    {
+      name        : 'plugin-settings',
+      description : 'Sets (or deletes) a site option.',
+      arguments   : [
+        {
+          name          : 'apex-domain',
+          description   : 'The apex domain identifying the site.',
+          defaultOption : true,
+          required      : true
+        },
+        {
+          name        : 'delete',
+          description : "When set, then deletes the setting. Incompatible with the '--value' option.",
+          type        : Boolean
+        },
+        {
+          name        : 'name',
+          description : 'The option name.'
+        },
+        optionSpec,
+        {
+          name        : 'value',
+          description : "The setting value. Incompatible with the '--delete' option."
+        }
+      ]
+    },
+    {
+      name      : 'update',
+      summary   : 'Updates a website content and/or infrastructure.',
+      arguments : [
+        {
+          name          : 'apex-domain',
+          description   : 'The apex domain identifying the site.',
+          defaultOption : true,
+          required      : true
+        },
+        {
+          name        : 'do-content',
+          description : 'Limits update to site content and any other specified updates.',
+          type        : Boolean
+        },
+        {
+          name        : 'do-dns',
+          description : 'Limits update to DNS entries and any other specified updates.',
+          type        : Boolean
+        },
+        {
+          name        : 'do-stack',
+          description : 'Limits update to stack infrastructure and any other specified updates.',
+          type        : Boolean
+        },
+        {
+          name        : 'no-build',
+          description : 'Supresses the default behavior of building before updating the site.',
+          type        : Boolean
+        },
+        {
+          name        : 'no-cache-invalidation',
+          description : 'Suppresses the default behavior of invalidating the CloudFront cache after the files are updated. Note that invalidation events are chargeable thought at the time of this writing, each account gets 1,000 free requests per year.'
+        }
+      ]
+    },
+    {
+      name      : 'verify',
+      summary   : 'Verifies the site is up and running and that the stack and content are up-to-date.',
+      arguments : [
+        {
+          name          : 'apex-domain',
+          description   : 'The domain of the site to verify.',
+          defaultOption : true,
+          required      : true
+        },
+        {
+          name        : 'check-content',
+          description : 'If set, then checks content and skips other checks unless also specifically specified.',
+          type        : Boolean
+        },
+        {
+          name        : 'check-site-up',
+          description : 'If set, then checks that the site is up and skips other checks unless also specifically specified.',
+          type        : Boolean
+        },
+        {
+          name        : 'check-stack',
+          description : 'If set, then checks for stack drift and skips other checks unless also specifically specified.',
+          type        : Boolean
+        },
+        {
+          name        : 'format',
+          description : "Sets the format for the output. May be 'terminal' (default), 'text', 'json', or 'yaml'."
+        }
+      ]
+    }
+  ]
+}
+ 
+export { cliSpec, GLOBAL_OPTIONS_PATH, SITES_INFO_PATH, SOURCE_TYPES }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/index.html b/qa/coverage/cli/index.html new file mode 100644 index 00000000..c1f61ce9 --- /dev/null +++ b/qa/coverage/cli/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for cli + + + + + + + + + +
+
+

All files cli

+
+ +
+ 8.53% + Statements + 7/82 +
+ + +
+ 17.64% + Branches + 6/34 +
+ + +
+ 25% + Functions + 1/4 +
+ + +
+ 8.45% + Lines + 6/71 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cloudsite.mjs +
+
0%0/750%0/280%0/30%0/65
constants.mjs +
+
100%7/7100%6/6100%1/1100%6/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/configuration/handle-configuration-initialize.mjs.html b/qa/coverage/cli/lib/configuration/handle-configuration-initialize.mjs.html new file mode 100644 index 00000000..4c40c25b --- /dev/null +++ b/qa/coverage/cli/lib/configuration/handle-configuration-initialize.mjs.html @@ -0,0 +1,181 @@ + + + + + + Code coverage report for cli/lib/configuration/handle-configuration-initialize.mjs + + + + + + + + + +
+
+

All files / cli/lib/configuration handle-configuration-initialize.mjs

+
+ +
+ 0% + Statements + 0/17 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as fs from 'node:fs/promises'
+import * as fsPath from 'node:path'
+ 
+import { Questioner } from 'question-and-answer'
+ 
+import { GLOBAL_OPTIONS_PATH } from '../../constants'I
+ 
+const handleConfigurationInitialize = async () => {
+  const interrogationBundle = {
+    actions : [
+      {
+        prompt    : 'Set the SSO profile:',
+        parameter : 'ssoProfile'
+      },
+      { review : 'questions' }
+    ]
+  }
+ 
+  const questioner = new Questioner({ interrogationBundle })
+  await questioner.question()
+ 
+  const results = questioner.results
+    .reduce((acc, { parameter, value }) => { acc[parameter] = value; return acc }, {})
+ 
+  const globalOptionsPath = GLOBAL_OPTIONS_PATH
+  const globalOptionsContents = JSON.stringify(results, null, '  ')
+ 
+  await fs.mkdir(fsPath.dirname(globalOptionsPath), { recursive : true })
+  await fs.writeFile(globalOptionsPath, globalOptionsContents, { encoding : 'utf8' })
+}
+ 
+export { handleConfigurationInitialize }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/configuration/handle-configuration-show.mjs.html b/qa/coverage/cli/lib/configuration/handle-configuration-show.mjs.html new file mode 100644 index 00000000..4f19dfe4 --- /dev/null +++ b/qa/coverage/cli/lib/configuration/handle-configuration-show.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for cli/lib/configuration/handle-configuration-show.mjs + + + + + + + + + +
+
+

All files / cli/lib/configuration handle-configuration-show.mjs

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 6/6 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +  +16x +  +1x +1x +1x +1x +1x +  +  + 
import * as fs from 'node:fs/promises'
+ 
+import { GLOBAL_OPTIONS_PATH } from '../../constants'
+ 
+const handleConfigurationShow = async () => {
+  const globalOptionsPath = GLOBAL_OPTIONS_PATH
+  const globalOptionsContents = await fs.readFile(globalOptionsPath, { encoding : 'utf8' })
+  process.stdout.write(globalOptionsContents)
+}
+ 
+export { handleConfigurationShow }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/configuration/index.html b/qa/coverage/cli/lib/configuration/index.html new file mode 100644 index 00000000..0e1429cd --- /dev/null +++ b/qa/coverage/cli/lib/configuration/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for cli/lib/configuration + + + + + + + + + +
+
+

All files cli/lib/configuration

+
+ +
+ 32% + Statements + 8/25 +
+ + +
+ 50% + Branches + 6/12 +
+ + +
+ 40% + Functions + 2/5 +
+ + +
+ 31.81% + Lines + 7/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
handle-configuration-initialize.mjs +
+
0%0/170%0/60%0/30%0/15
handle-configuration-show.mjs +
+
100%8/8100%6/6100%2/2100%7/7
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/error-out.mjs.html b/qa/coverage/cli/lib/error-out.mjs.html new file mode 100644 index 00000000..0d411787 --- /dev/null +++ b/qa/coverage/cli/lib/error-out.mjs.html @@ -0,0 +1,103 @@ + + + + + + Code coverage report for cli/lib/error-out.mjs + + + + + + + + + +
+
+

All files / cli/lib error-out.mjs

+
+ +
+ 0% + Statements + 0/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7  +  +  +  +  +  + 
const errorOut = (msg, code) => {
+  process.stderr.write(msg)
+  process.exit(code) // eslint-disable-line no-process-exit
+}
+ 
+export { errorOut }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/format-output.mjs.html b/qa/coverage/cli/lib/format-output.mjs.html new file mode 100644 index 00000000..c46b9ad2 --- /dev/null +++ b/qa/coverage/cli/lib/format-output.mjs.html @@ -0,0 +1,136 @@ + + + + + + Code coverage report for cli/lib/format-output.mjs + + + + + + + + + +
+
+

All files / cli/lib format-output.mjs

+
+ +
+ 0% + Statements + 0/11 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import yaml from 'js-yaml'
+import { jsonToPlainText } from 'json-to-plain-text'
+ 
+const formatOutput = ({ output, format }) => {
+  if (format === 'json') {
+    process.stdout.write(JSON.stringify(output, null, '  ') + '\n')
+  } else if (format === 'yaml') {
+    process.stdout.write(yaml.dump(output))
+  } else {
+    const options = { color : format !== 'text' }
+    const text = jsonToPlainText(output, options)
+ 
+    process.stdout.write(text + '\n')
+  }
+}
+ 
+export { formatOutput }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/get-site-info.mjs.html b/qa/coverage/cli/lib/get-site-info.mjs.html new file mode 100644 index 00000000..9b27cfa2 --- /dev/null +++ b/qa/coverage/cli/lib/get-site-info.mjs.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for cli/lib/get-site-info.mjs + + + + + + + + + +
+
+

All files / cli/lib get-site-info.mjs

+
+ +
+ 0% + Statements + 0/9 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { errorOut } from './error-out'
+ 
+const getSiteInfo = ({ apexDomain, sitesInfo }) => {
+  Iif (apexDomain === undefined) {
+    errorOut('Must specify site domain.\n')
+  }
+ 
+  const siteInfo = sitesInfo[apexDomain]
+  Iif (siteInfo === undefined) {
+    errorOut(`No such site '${apexDomain}' found.\n`)
+  }
+ 
+  return siteInfo
+}
+ 
+export { getSiteInfo }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/get-value-container-and-key.mjs.html b/qa/coverage/cli/lib/get-value-container-and-key.mjs.html new file mode 100644 index 00000000..7c7dfe07 --- /dev/null +++ b/qa/coverage/cli/lib/get-value-container-and-key.mjs.html @@ -0,0 +1,205 @@ + + + + + + Code coverage report for cli/lib/get-value-container-and-key.mjs + + + + + + + + + +
+
+

All files / cli/lib get-value-container-and-key.mjs

+
+ +
+ 0% + Statements + 0/23 +
+ + +
+ 0% + Branches + 0/20 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { errorOut } from './error-out'
+ 
+const getValueContainerAndKey = ({ path, rootContainer, spec, value }) => {
+  const pathBits = path.split('.')
+ 
+  // walks the path, creating new containers along the way as necessary
+  return pathBits.reduce(([currContainer, spec], bit, i) => {
+    // then we're at the terminal path bit; let's analyze whether it's valid and if value passes validation
+    if (i === pathBits.length - 1) {
+      spec = spec?.[bit]
+      Iif (spec !== undefined) {
+        const { matches, validation } = spec
+        Iif (validation === undefined && matches === undefined) {
+          throw new Error(`'${path}' does not appear to be a terminal path.`)
+        }
+        Iif (matches !== undefined && value.match(matches) === null) {
+          throw new Error(`Invalid value '${value}' for '${path}'; must match ${matches.toString()}.`)
+        }
+ 
+        Iif (validation !== undefined && !validation(value)) {
+          throw new Error(`Value '${value}' for '${path}' failed validation.`)
+        }
+      }
+ 
+      return { valueKey : pathBits[i], valueContainer : currContainer }
+    } else {
+      const currSpec = spec[bit]
+      Iif (currSpec === undefined && i > 0) {
+        errorOut(`Invalid option path '${path}'; no such element '${bit}'.\n`)
+      }
+      const container = currContainer[bit]
+      Iif (container === undefined) {
+        currContainer[bit] = {}
+      }
+      return [currContainer[bit], currSpec]
+    }
+  }, [rootContainer, spec])
+}
+ 
+export { getValueContainerAndKey }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-configuration.mjs.html b/qa/coverage/cli/lib/handle-configuration.mjs.html new file mode 100644 index 00000000..a4117ac0 --- /dev/null +++ b/qa/coverage/cli/lib/handle-configuration.mjs.html @@ -0,0 +1,154 @@ + + + + + + Code coverage report for cli/lib/handle-configuration.mjs + + + + + + + + + +
+
+

All files / cli/lib handle-configuration.mjs

+
+ +
+ 0% + Statements + 0/17 +
+ + +
+ 0% + Branches + 0/5 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import commandLineArgs from 'command-line-args'
+ 
+import { handleConfigurationInitialize } from './configuration/handle-configuration-initialize'
+import { handleConfigurationShow } from './configuration/handle-configuration-show'
+ 
+const handleConfiguration = async ({ argv, cliSpec, globalOptions }) => {
+  const configurationCLISpec = cliSpec.commands.find(({ name }) => name === 'configuration')
+  const configurationOptionsSpec = configurationCLISpec.arguments
+  const configurationOptions = commandLineArgs(configurationOptionsSpec, { argv, stopAtFirstUnknown : true })
+  const { subcommand } = configurationOptions
+  argv = configurationOptions._unknown || []
+ 
+  switch (subcommand) {
+    case 'initialize':
+      await handleConfigurationInitialize({ argv, configurationCLISpec, globalOptions }); break
+    case 'show':
+      await handleConfigurationShow({ argv, configurationCLISpec, globalOptions }); break
+    default:
+      throw new Error('Unknown configuration command: ' + subcommand)
+  }
+}
+ 
+export { handleConfiguration }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-create.mjs.html b/qa/coverage/cli/lib/handle-create.mjs.html new file mode 100644 index 00000000..a76589cf --- /dev/null +++ b/qa/coverage/cli/lib/handle-create.mjs.html @@ -0,0 +1,295 @@ + + + + + + Code coverage report for cli/lib/handle-create.mjs + + + + + + + + + +
+
+

All files / cli/lib handle-create.mjs

+
+ +
+ 0% + Statements + 0/45 +
+ + +
+ 0% + Branches + 0/22 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/43 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { existsSync as fileExists } from 'node:fs'
+import * as fsPath from 'node:path'
+ 
+import commandLineArgs from 'command-line-args'
+import { awsS3TABucketNameRE, awsS3TABucketNameREString } from 'regex-repo'
+ 
+import { cliSpec, SOURCE_TYPES } from '../constants'
+import { create } from '../../lib/actions/create'
+import * as optionsLib from './options'I
+ 
+const handleCreate = async ({ argv, globalOptions, sitesInfo }) => {
+  const createOptionsSpec = cliSpec.commands.find(({ name }) => name === 'create').arguments
+  const createOptions = commandLineArgs(createOptionsSpec, { argv })
+  // action behavior options
+  const noDeleteOnFailure = createOptions['no-delete-on-failure']
+  // siteInfo options
+  const apexDomain = createOptions['apex-domain']
+  const bucketName = createOptions['bucket-name']
+  const noBuild = createOptions['no-build']
+  // switch any relative sourcePath to absolute
+  const sourcePath = fsPath.resolve(createOptions['source-path'])
+  let sourceType = createOptions['source-type']
+  const stackName = createOptions['stack-name']
+  const options = optionsLib.mapRawOptions(createOptions.option)
+  console.log('options A:', options) // DEBUG
+ 
+  const siteInfo = sitesInfo[apexDomain] || { apexDomain, bucketName, sourcePath, sourceType }
+  siteInfo.region = createOptions.region || siteInfo.region || 'us-east-1'
+  Iif (stackName !== undefined) {
+    siteInfo.stackName = stackName
+  }
+ 
+  sitesInfo[apexDomain] = siteInfo
+ 
+  // verify the parameters/options
+  for (const option of ['apex-domain', 'source-path']) {
+    Iif (createOptions[option] === undefined) {
+      process.stderr.write(`Missing required '${option}' option.\n`)
+      // TODO: handleHelp({ argv : ['create'] })
+      process.exit(2) // eslint-disable-line no-process-exit
+    }
+  }
+  // TODO: verify apex domain matches apex domain RE
+ 
+  if (sourceType === undefined) {
+    const docusaurusConfigPath = fsPath.resolve(sourcePath, '..', 'docusaurus.config.js')
+    sourceType = fileExists(docusaurusConfigPath) ? 'docusaurus' : 'vanilla'
+  } else Iif (!SOURCE_TYPES.includes(sourceType)) {
+    process.stderr(`Invalid site source type '${sourceType}'; must be one of ${SOURCE_TYPES.join(', ')}.\n`)
+    process.exit(2) // eslint-disable-line no-process-exit
+  }
+ 
+  Iif (bucketName !== undefined && !awsS3TABucketNameRE.test(bucketName)) {
+    process.stderr(`Invalid bucket name. Must be valid AWS S3 Transfer Accelerated bucket name matching: ${awsS3TABucketNameREString}`)
+    process.exit(2) // eslint-disable-line no-process-exit
+  }
+ 
+  optionsLib.updatePluginSettings({ options, siteInfo })
+ 
+  // update siteInfo in case these were manually specified
+  for (const [value, field] of [[bucketName, 'bucketName'], [sourcePath, 'sourcePath'], [sourceType, 'sourceType']]) {
+    Iif (value !== undefined) {
+      siteInfo[field] = value
+    }
+  }
+ 
+  await create({ noBuild, noDeleteOnFailure, siteInfo, ...globalOptions })
+}
+ 
+export { handleCreate }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-destroy.mjs.html b/qa/coverage/cli/lib/handle-destroy.mjs.html new file mode 100644 index 00000000..a0d83c02 --- /dev/null +++ b/qa/coverage/cli/lib/handle-destroy.mjs.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for cli/lib/handle-destroy.mjs + + + + + + + + + +
+
+

All files / cli/lib handle-destroy.mjs

+
+ +
+ 0% + Statements + 0/19 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import commandLineArgs from 'command-line-args'
+ 
+import { cliSpec } from '../constants'
+import { destroy } from '../../lib/actions/destroy'
+import { getSiteInfo } from './get-site-info'
+ 
+const handleDestroy = async ({ argv, globalOptions, sitesInfo }) => {
+  const destroyOptionsSpec = cliSpec.commands.find(({ name }) => name === 'destroy').arguments
+  const destroyOptions = commandLineArgs(destroyOptionsSpec, { argv })
+  const apexDomain = destroyOptions['apex-domain']
+  const { confirmed } = destroyOptions
+ 
+  const siteInfo = getSiteInfo({ apexDomain, sitesInfo })
+ 
+  Iif (confirmed !== true) {
+    process.stderr.write("Interactive mode not yet implement. You must include the '--confirmed' option.\n")
+    process.exit(3) // eslint-disable-line no-process-exit
+  }
+ 
+  const deleted = await destroy({ globalOptions, siteInfo, verbose : true })
+ 
+  Iif (deleted === true) {
+    process.stdout.write(`Removing ${apexDomain} from local DB.\n`)
+    delete sitesInfo[apexDomain]
+  }
+}
+ 
+export { handleDestroy }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-detail.mjs.html b/qa/coverage/cli/lib/handle-detail.mjs.html new file mode 100644 index 00000000..e43335ec --- /dev/null +++ b/qa/coverage/cli/lib/handle-detail.mjs.html @@ -0,0 +1,154 @@ + + + + + + Code coverage report for cli/lib/handle-detail.mjs + + + + + + + + + +
+
+

All files / cli/lib handle-detail.mjs

+
+ +
+ 0% + Statements + 0/16 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import commandLineArgs from 'command-line-args'
+ 
+import { cliSpec } from '../constants'
+import { errorOut } from './error-out'
+import { formatOutput } from './format-output'
+import { getSiteInfo } from './get-site-info'
+ 
+const handleDetail = ({ argv, sitesInfo }) => {
+  const detailOptionsSpec = cliSpec.commands.find(({ name }) => name === 'detail').arguments
+  const detailOptions = commandLineArgs(detailOptionsSpec, { argv })
+  const apexDomain = detailOptions['apex-domain']
+  const { format } = detailOptions
+ 
+  Iif (apexDomain === undefined) {
+    errorOut('Apex domain must be specified.')
+  }
+ 
+  const output = getSiteInfo({ apexDomain, sitesInfo })
+ 
+  formatOutput({ output, format })
+}
+ 
+export { handleDetail }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-get-iam-policy.mjs.html b/qa/coverage/cli/lib/handle-get-iam-policy.mjs.html new file mode 100644 index 00000000..db78a2cb --- /dev/null +++ b/qa/coverage/cli/lib/handle-get-iam-policy.mjs.html @@ -0,0 +1,415 @@ + + + + + + Code coverage report for cli/lib/handle-get-iam-policy.mjs + + + + + + + + + +
+
+

All files / cli/lib handle-get-iam-policy.mjs

+
+ +
+ 0% + Statements + 0/13 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import commandLineArgs from 'command-line-args'
+ 
+import { cliSpec } from '../constants'
+ 
+const iamPolicy = {
+  Version   : '2012-10-17',
+  Statement : [
+    {
+      Sid    : 'VisualEditor0',
+      Effect : 'Allow',
+      Action : [
+        'acm:ListCertificates',
+        'acm:RequestCertificate',
+        'cloudformation:DescribeStackDriftDetectionStatus',
+        'cloudformation:DescribeStackEvents',
+        'cloudformation:DescribeStacks',
+        'cloudformation:ListChangeSets',
+        'cloudformation:DetectStackDrift',
+        'cloudformation:GetTemplate',
+        'cloudformation:CreateStack',
+        'cloudformation:DeleteStack',
+        'cloudformation:UpdateStack',
+        'cloudfront:CreateDistribution',
+        'cloudfront:CreateInvalidation',
+        'cloudfront:CreateOriginAccessControl',
+        'cloudfront:DeleteDistribution',
+        'cloudfront:DeleteOriginAccessControl',
+        'cloudfront:GetDistribution',
+        'cloudfront:GetOriginAccessControl',
+        'cloudfront:ListDistributions',
+        'cloudfront:ListOriginAccessControls',
+        'cloudfront:TagResource',
+        'cloudfront:UpdateDistribution',
+        'cloudfront:UpdateOriginAccessControl',
+        'dynamodb:CreateTable',
+        'dynamodb:DeleteTable',
+        'dynamodb:DescribeTable',
+        'dynamodb:UpdateTable',
+        'iam:AttachRolePolicy',
+        'iam:CreateRole',
+        'iam:DeleteRole',
+        'iam:DetachRolePolicy',
+        'iam:DeleteRolePolicy',
+        'iam:GetRole',
+        'iam:PutRolePolicy',
+        'iam:UpdateRole',
+        'lambda:AddPermission',
+        'lambda:CreateFunction',
+        'lambda:CreateEventSourceMapping',
+        'lambda:CreateFunctionUrlConfig',
+        'lambda:DeleteEventSourceMapping',
+        'lambda:DeleteFunction',
+        'lambda:DeleteFunctionUrlConfig',
+        'lambda:EnableReplication',
+        'lambda:GetEventSourceMapping',
+        'lambda:GetFunction',
+        'lambda:GetFunctionConfiguration',
+        'lambda:GetFunctionUrlConfig',
+        'lambda:ListFunctions',
+        'lambda:ListFunctionUrlConfigs',
+        'lambda:ListVersionsByFunction',
+        'iam:PassRole',
+        'lambda:PublishVersion',
+        'lambda:RemovePermission',
+        'lambda:UpdateFunctionUrlConfig',
+        'logs:CreateLogGroup',
+        'logs:DeleteLogGroup',
+        'logs:DeleteRetentionPolicy',
+        'logs:PutRetentionPolicy',
+        'route53:ListHostedZones',
+        'route53:ChangeResourceRecordSets',
+        'route53:ListResourceRecordSets',
+        's3:CreateBucket',
+        's3:PutObject',
+        's3:DeleteObject',
+        's3:DeleteBucket',
+        's3:DeleteBucketPolicy',
+        's3:GetObject',
+        's3:ListBucket',
+        's3:PutBucketAcl',
+        's3:PutBucketPolicy',
+        's3:*'
+      ],
+      Resource : [
+        '*'
+      ]
+    }
+  ]
+}
+ 
+const instructions =
+`1. Log into the AWS console.
+2. Select/navigate to the IAM service.
+3. Select 'Policies' from the left hand menu options.
+4. Select 'Create policy'.
+5. Select the 'JSON' option.
+6. Replace the JSON with the text below.`
+ 
+const handleGetIAMPolicy = ({ argv }) => {
+  const getIAMPolicyOptionsSpec = cliSpec.commands.find(({ name }) => name === 'get-iam-policy').arguments
+  const getIAMPolicyOptions = commandLineArgs(getIAMPolicyOptionsSpec, { argv })
+  const withInstructions = getIAMPolicyOptions['with-instructions']
+ 
+  Iif (withInstructions === true) {
+    process.stdout.write(instructions + '\n\n')
+  }
+  process.stdout.write(JSON.stringify(iamPolicy, null, '  ') + '\n')
+}
+ 
+export { handleGetIAMPolicy }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-list.mjs.html b/qa/coverage/cli/lib/handle-list.mjs.html new file mode 100644 index 00000000..02a85481 --- /dev/null +++ b/qa/coverage/cli/lib/handle-list.mjs.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for cli/lib/handle-list.mjs + + + + + + + + + +
+
+

All files / cli/lib handle-list.mjs

+
+ +
+ 0% + Statements + 0/17 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import commandLineArgs from 'command-line-args'
+import pick from 'lodash/pick'
+ 
+import { cliSpec } from '../constants'
+import { formatOutput } from './format-output'
+ 
+const handleList = ({ argv, sitesInfo }) => {
+  const listOptionsSpec = cliSpec.commands.find(({ name }) => name === 'list').arguments
+  const listOptions = commandLineArgs(listOptionsSpec, { argv })
+  const allFields = listOptions['all-fields']
+  const { format } = listOptions
+ 
+  const sitesInfoArray = Object.values(sitesInfo)
+  const output = allFields === true
+    ? sitesInfoArray
+    : sitesInfoArray.map((siteInfo) => {
+      const trimmed = pick(siteInfo, ['apexDomain', 'region', 'sourcePath'])
+      trimmed.plugins = Object.keys(siteInfo.pluginSettings)
+      return trimmed
+    })
+ 
+  formatOutput({ output, format })
+}
+ 
+export { handleList }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-plugin-settings.mjs.html b/qa/coverage/cli/lib/handle-plugin-settings.mjs.html new file mode 100644 index 00000000..66cfc5bd --- /dev/null +++ b/qa/coverage/cli/lib/handle-plugin-settings.mjs.html @@ -0,0 +1,253 @@ + + + + + + Code coverage report for cli/lib/handle-plugin-settings.mjs + + + + + + + + + +
+
+

All files / cli/lib handle-plugin-settings.mjs

+
+ +
+ 0% + Statements + 0/38 +
+ + +
+ 0% + Branches + 0/34 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import commandLineArgs from 'command-line-args'
+ 
+import { cliSpec } from '../constants'
+import { errorOut } from './error-out'
+import { getSiteInfo } from './get-site-info'
+import { getValueContainerAndKey } from './get-value-container-and-key'
+import * as optionsLib from './options'
+import { smartConvert } from './smart-convert'I
+ 
+const handlePluginSettings = async ({ argv, sitesInfo }) => {
+  const setOptionOptionsSpec = cliSpec.commands.find(({ name }) => name === 'plugin-settings').arguments
+  const setOptionOptions = commandLineArgs(setOptionOptionsSpec, { argv })
+  const apexDomain = setOptionOptions['apex-domain']
+  const options = optionsLib.mapRawOptions(setOptionOptions.option)
+ 
+  const { delete: doDelete, name, value } = setOptionOptions
+ 
+  // validate options
+  const siteInfo = getSiteInfo({ apexDomain, sitesInfo })
+ 
+  if (doDelete === true && (value !== undefined || options.length > 0)) {
+    errorOut("The '--delete' option is incompatible with the '--value' and --name-value options.\n")
+  } else if (doDelete === true && name === undefined) {
+    errorOut("You must specify a '--name' when '--delete' is set.\n")
+  } else Iif (doDelete !== true) {
+    if (name !== undefined && value !== undefined) {
+      options.push({ name, value : smartConvert(value) }) // the 'option' values are already converted
+    } else if (name !== undefined && value === undefined) {
+      errorOut("You must specify a '--value' or '--delete' when '--name' is set.\n")
+    } else Iif (name === undefined && value !== undefined) {
+      errorOut("You must specify a '--name' when '--value' is set.\n")
+    }
+  }
+ 
+  Iif (doDelete !== true && options.length === 0) {
+    errorOut("Invalid options; specify '--name'+'--value', '--delete'/'--name', or one or more '--option' options.\n")
+  }
+ 
+  // take actions and update the options
+  const { pluginSettings = {} } = siteInfo
+ 
+  if (doDelete === true) {
+    const { valueContainer, valueKey } = getValueContainerAndKey({ path : name, rootContainer : pluginSettings })
+    delete valueContainer[valueKey]
+ 
+    Iif (Object.keys(pluginSettings).length === 0) {
+      delete siteInfo.options
+    }
+  } else {
+    optionsLib.updatePluginSettings({ options, siteInfo })
+  }
+ 
+  siteInfo.pluginSettings = pluginSettings
+}
+ 
+export { handlePluginSettings }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-update.mjs.html b/qa/coverage/cli/lib/handle-update.mjs.html new file mode 100644 index 00000000..c9d15f0e --- /dev/null +++ b/qa/coverage/cli/lib/handle-update.mjs.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for cli/lib/handle-update.mjs + + + + + + + + + +
+
+

All files / cli/lib handle-update.mjs

+
+ +
+ 0% + Statements + 0/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import commandLineArgs from 'command-line-args'
+ 
+import { cliSpec } from '../constants'
+import { getSiteInfo } from './get-site-info'
+import { update } from '../../lib/actions/update'
+ 
+const handleUpdate = async ({ argv, globalOptions, sitesInfo }) => {
+  const updateOptionsSpec = cliSpec.commands.find(({ name }) => name === 'update').arguments
+  const updateOptions = commandLineArgs(updateOptionsSpec, { argv })
+  const apexDomain = updateOptions['apex-domain']
+  const doContent = updateOptions['do-content']
+  const doDNS = updateOptions['do-dns']
+  const doStack = updateOptions['do-stack']
+  const noBuild = updateOptions['no-build']
+  const noCacheInvalidation = updateOptions['no-cache-invalidation']
+ 
+  const siteInfo = getSiteInfo({ apexDomain, sitesInfo })
+ 
+  await update({ doContent, doDNS, doStack, noBuild, noCacheInvalidation, siteInfo, globalOptions })
+}
+ 
+export { handleUpdate }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-verify.mjs.html b/qa/coverage/cli/lib/handle-verify.mjs.html new file mode 100644 index 00000000..3ddcdcdc --- /dev/null +++ b/qa/coverage/cli/lib/handle-verify.mjs.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for cli/lib/handle-verify.mjs + + + + + + + + + +
+
+

All files / cli/lib handle-verify.mjs

+
+ +
+ 0% + Statements + 0/25 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import commandLineArgs from 'command-line-args'
+ 
+import { cliSpec } from '../constants'
+import { formatOutput } from './format-output'
+import { getSiteInfo } from './get-site-info'
+import { verify } from '../../lib/actions/verify'
+ 
+const handleVerify = async ({ argv, sitesInfo, globalOptions }) => {
+  const verifyOptionsSpec = cliSpec.commands.find(({ name }) => name === 'verify').arguments
+  const verifyOptions = commandLineArgs(verifyOptionsSpec, { argv })
+  const { format } = verifyOptions
+  const apexDomain = verifyOptions['apex-domain']
+  const checkContent = verifyOptions['check-content']
+  const checkSiteUp = verifyOptions['check-site-up']
+  const checkStack = verifyOptions['check-stack']
+ 
+  const siteInfo = getSiteInfo({ apexDomain, sitesInfo })
+ 
+  const results =
+    await verify({ checkContent, checkSiteUp, checkStack, globalOptions, progressLogger : process.stdout, siteInfo })
+  const summaryStatus = results.reduce((acc, { status : s }) => {
+    if (s === 'error') { return 'error' } else if (s === 'failed') { return 'failed' } else { return acc }
+  }, 'success')
+ 
+  const output = { 'overall status' : summaryStatus, checks : results }
+  formatOutput({ output, format })
+}
+ 
+export { handleVerify }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/index.html b/qa/coverage/cli/lib/index.html new file mode 100644 index 00000000..ba413785 --- /dev/null +++ b/qa/coverage/cli/lib/index.html @@ -0,0 +1,326 @@ + + + + + + Code coverage report for cli/lib + + + + + + + + + +
+
+

All files cli/lib

+
+ +
+ 0% + Statements + 0/296 +
+ + +
+ 0% + Branches + 0/132 +
+ + +
+ 0% + Functions + 0/32 +
+ + +
+ 0% + Lines + 0/278 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
error-out.mjs +
+
0%0/4100%0/00%0/10%0/4
format-output.mjs +
+
0%0/110%0/40%0/10%0/11
get-site-info.mjs +
+
0%0/90%0/20%0/10%0/9
get-value-container-and-key.mjs +
+
0%0/230%0/200%0/20%0/23
handle-configuration.mjs +
+
0%0/170%0/50%0/20%0/14
handle-create.mjs +
+
0%0/450%0/220%0/30%0/43
handle-destroy.mjs +
+
0%0/190%0/20%0/20%0/18
handle-detail.mjs +
+
0%0/160%0/10%0/20%0/15
handle-get-iam-policy.mjs +
+
0%0/130%0/10%0/20%0/12
handle-list.mjs +
+
0%0/170%0/20%0/30%0/16
handle-plugin-settings.mjs +
+
0%0/380%0/340%0/30%0/36
handle-update.mjs +
+
0%0/17100%0/00%0/20%0/16
handle-verify.mjs +
+
0%0/250%0/40%0/30%0/20
options.mjs +
+
0%0/260%0/190%0/40%0/25
smart-convert.mjs +
+
0%0/160%0/160%0/10%0/16
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/options.mjs.html b/qa/coverage/cli/lib/options.mjs.html new file mode 100644 index 00000000..bd563c5a --- /dev/null +++ b/qa/coverage/cli/lib/options.mjs.html @@ -0,0 +1,199 @@ + + + + + + Code coverage report for cli/lib/options.mjs + + + + + + + + + +
+
+

All files / cli/lib options.mjs

+
+ +
+ 0% + Statements + 0/26 +
+ + +
+ 0% + Branches + 0/19 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { errorOut } from './error-out'
+import { getValueContainerAndKey } from './get-value-container-and-key'
+import * as plugins from '../../lib/plugins'
+import { smartConvert } from './smart-convert'I
+ 
+const mapRawOptions = (rawOptions = []) =>
+  rawOptions.map((spec) => {
+    let [name, value] = spec.split(/(?!\\):/)
+    value = value?.replaceAll(/\\:/g, ':') || 'true'
+    value = smartConvert(value)
+ 
+    return { name, value }
+  })
+ 
+const updatePluginSettings = ({ options, siteInfo }) => {
+  const { pluginSettings = {} } = siteInfo
+ 
+  for (const { name, value } of options) {
+    console.log('processing option:', name, '/', value) // DEBUG
+    const [option] = name.split('.')
+ 
+    Iif (!(option in plugins)) {
+      errorOut(`No such plugin '${option}'; use one of: ${Object.keys(plugins).join(', ')}.\n`)
+    }
+ 
+    const optionsSpec = plugins[option].config?.options
+ 
+    const wrappedSpec = { [option] : optionsSpec } // so our option spec matches our path
+    const { valueContainer, valueKey } =
+      getValueContainerAndKey({ path : name, rootContainer : pluginSettings, spec : wrappedSpec, value })
+    valueContainer[valueKey] = value
+  }
+ 
+  console.log('pluginSettings:', pluginSettings) // DEBUG
+  siteInfo.pluginSettings = pluginSettings
+}
+ 
+export { mapRawOptions, updatePluginSettings }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/cli/lib/smart-convert.mjs.html b/qa/coverage/cli/lib/smart-convert.mjs.html new file mode 100644 index 00000000..656d468b --- /dev/null +++ b/qa/coverage/cli/lib/smart-convert.mjs.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for cli/lib/smart-convert.mjs + + + + + + + + + +
+
+

All files / cli/lib smart-convert.mjs

+
+ +
+ 0% + Statements + 0/16 +
+ + +
+ 0% + Branches + 0/16 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
const smartConvert = (value) => {
+  if (value === undefined) {
+    return ''
+  } else if (value === 'true' || value === 'TRUE') {
+    return true
+  } else if (value === 'false' || value === 'FALSE') {
+    return false
+  } else if (value.match(/^\s*\d+\s*$/)) {
+    return parseInt(value)
+  } else if (value.match(/^\s*(?:\d+(?:\.\d+)|\.\d+)\s*$/)) {
+    return parseFloat(value)
+  } else {
+    value = value.trim()
+    if (value.startsWith('\\')) {
+      return value.slice(1)
+    } else {
+      return value
+    }
+  }
+}
+ 
+export { smartConvert }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/clover.xml b/qa/coverage/clover.xml new file mode 100644 index 00000000..147420af --- /dev/null +++ b/qa/coverage/clover.xml @@ -0,0 +1,1137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/qa/coverage/coverage-final.json b/qa/coverage/coverage-final.json new file mode 100644 index 00000000..2eca5aae --- /dev/null +++ b/qa/coverage/coverage-final.json @@ -0,0 +1,45 @@ +{"/Users/zane/playground/cloudsite/src/cli/cloudsite.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/cloudsite.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"7":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"8":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"9":{"start":{"line":12,"column":0},"end":{"line":12,"column":null}},"10":{"start":{"line":13,"column":0},"end":{"line":13,"column":null}},"11":{"start":{"line":14,"column":0},"end":{"line":14,"column":null}},"12":{"start":{"line":15,"column":0},"end":{"line":15,"column":null}},"13":{"start":{"line":16,"column":0},"end":{"line":16,"column":50}},"14":{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},"15":{"start":{"line":18,"column":18},"end":{"line":96,"column":1}},"16":{"start":{"line":19,"column":22},"end":{"line":19,"column":89}},"17":{"start":{"line":20,"column":15},"end":{"line":20,"column":41}},"18":{"start":{"line":22,"column":34},"end":{"line":22,"column":45}},"19":{"start":{"line":23,"column":21},"end":{"line":23,"column":47}},"20":{"start":{"line":26,"column":2},"end":{"line":35,"column":null}},"21":{"start":{"line":27,"column":33},"end":{"line":27,"column":94}},"22":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"23":{"start":{"line":30,"column":4},"end":{"line":32,"column":null}},"24":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"25":{"start":{"line":34,"column":4},"end":{"line":34,"column":null}},"26":{"start":{"line":37,"column":2},"end":{"line":48,"column":null}},"27":{"start":{"line":38,"column":4},"end":{"line":47,"column":null}},"28":{"start":{"line":39,"column":31},"end":{"line":39,"column":88}},"29":{"start":{"line":40,"column":6},"end":{"line":40,"column":null}},"30":{"start":{"line":42,"column":6},"end":{"line":44,"column":null}},"31":{"start":{"line":43,"column":8},"end":{"line":43,"column":null}},"32":{"start":{"line":46,"column":6},"end":{"line":46,"column":null}},"33":{"start":{"line":49,"column":24},"end":{"line":49,"column":50}},"34":{"start":{"line":51,"column":2},"end":{"line":94,"column":null}},"35":{"start":{"line":52,"column":4},"end":{"line":77,"column":null}},"36":{"start":{"line":54,"column":8},"end":{"line":54,"column":69}},"37":{"start":{"line":54,"column":69},"end":{"line":54,"column":null}},"38":{"start":{"line":56,"column":8},"end":{"line":56,"column":64}},"39":{"start":{"line":56,"column":64},"end":{"line":56,"column":null}},"40":{"start":{"line":58,"column":8},"end":{"line":58,"column":65}},"41":{"start":{"line":58,"column":65},"end":{"line":58,"column":null}},"42":{"start":{"line":60,"column":8},"end":{"line":60,"column":64}},"43":{"start":{"line":60,"column":64},"end":{"line":60,"column":null}},"44":{"start":{"line":62,"column":8},"end":{"line":62,"column":null}},"45":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"46":{"start":{"line":65,"column":8},"end":{"line":65,"column":44}},"47":{"start":{"line":65,"column":44},"end":{"line":65,"column":null}},"48":{"start":{"line":67,"column":8},"end":{"line":67,"column":62}},"49":{"start":{"line":67,"column":62},"end":{"line":67,"column":null}},"50":{"start":{"line":69,"column":8},"end":{"line":69,"column":72}},"51":{"start":{"line":69,"column":72},"end":{"line":69,"column":null}},"52":{"start":{"line":71,"column":8},"end":{"line":71,"column":64}},"53":{"start":{"line":71,"column":64},"end":{"line":71,"column":null}},"54":{"start":{"line":73,"column":8},"end":{"line":73,"column":64}},"55":{"start":{"line":73,"column":64},"end":{"line":73,"column":null}},"56":{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},"57":{"start":{"line":79,"column":4},"end":{"line":79,"column":null}},"58":{"start":{"line":80,"column":4},"end":{"line":93,"column":null}},"59":{"start":{"line":81,"column":6},"end":{"line":81,"column":null}},"60":{"start":{"line":82,"column":11},"end":{"line":93,"column":null}},"61":{"start":{"line":83,"column":20},"end":{"line":83,"column":131}},"62":{"start":{"line":84,"column":6},"end":{"line":86,"column":null}},"63":{"start":{"line":85,"column":8},"end":{"line":85,"column":null}},"64":{"start":{"line":87,"column":6},"end":{"line":87,"column":null}},"65":{"start":{"line":88,"column":6},"end":{"line":88,"column":null}},"66":{"start":{"line":89,"column":6},"end":{"line":89,"column":22}},"67":{"start":{"line":91,"column":6},"end":{"line":91,"column":null}},"68":{"start":{"line":92,"column":6},"end":{"line":92,"column":22}},"69":{"start":{"line":95,"column":2},"end":{"line":95,"column":null}},"70":{"start":{"line":96,"column":1},"end":{"line":96,"column":null}},"71":{"start":{"line":98,"column":32},"end":{"line":103,"column":1}},"72":{"start":{"line":99,"column":2},"end":{"line":102,"column":null}},"73":{"start":{"line":100,"column":29},"end":{"line":100,"column":66}},"74":{"start":{"line":101,"column":4},"end":{"line":101,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},"loc":{"start":{"line":16,"column":50},"end":{"line":16,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":18,"column":18},"end":{"line":18,"column":30}},"loc":{"start":{"line":18,"column":30},"end":{"line":96,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":98,"column":32},"end":{"line":98,"column":39}},"loc":{"start":{"line":98,"column":72},"end":{"line":103,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":50},"end":{"line":16,"column":null}}]},"1":{"loc":{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},"type":"cond-expr","locations":[{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},{"start":{"line":16,"column":50},"end":{"line":16,"column":null}}]},"2":{"loc":{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},"type":"binary-expr","locations":[{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},{"start":{"line":16,"column":50},"end":{"line":16,"column":null}}]},"3":{"loc":{"start":{"line":20,"column":15},"end":{"line":20,"column":41}},"type":"binary-expr","locations":[{"start":{"line":20,"column":15},"end":{"line":20,"column":35}},{"start":{"line":20,"column":39},"end":{"line":20,"column":41}}]},"4":{"loc":{"start":{"line":30,"column":4},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":30,"column":4},"end":{"line":32,"column":null}}]},"5":{"loc":{"start":{"line":37,"column":2},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":48,"column":null}}]},"6":{"loc":{"start":{"line":42,"column":6},"end":{"line":44,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":6},"end":{"line":44,"column":null}}]},"7":{"loc":{"start":{"line":52,"column":4},"end":{"line":77,"column":null}},"type":"switch","locations":[{"start":{"line":53,"column":6},"end":{"line":54,"column":null}},{"start":{"line":55,"column":6},"end":{"line":56,"column":null}},{"start":{"line":57,"column":6},"end":{"line":58,"column":null}},{"start":{"line":59,"column":6},"end":{"line":60,"column":null}},{"start":{"line":61,"column":6},"end":{"line":63,"column":null}},{"start":{"line":64,"column":6},"end":{"line":65,"column":null}},{"start":{"line":66,"column":6},"end":{"line":67,"column":null}},{"start":{"line":68,"column":6},"end":{"line":69,"column":null}},{"start":{"line":70,"column":6},"end":{"line":71,"column":null}},{"start":{"line":72,"column":6},"end":{"line":73,"column":null}},{"start":{"line":74,"column":6},"end":{"line":75,"column":null}}]},"8":{"loc":{"start":{"line":80,"column":4},"end":{"line":93,"column":null}},"type":"if","locations":[{"start":{"line":80,"column":4},"end":{"line":93,"column":null}},{"start":{"line":82,"column":11},"end":{"line":93,"column":null}}]},"9":{"loc":{"start":{"line":82,"column":11},"end":{"line":93,"column":null}},"type":"if","locations":[{"start":{"line":82,"column":11},"end":{"line":93,"column":null}},{"start":{"line":90,"column":11},"end":{"line":93,"column":null}}]},"10":{"loc":{"start":{"line":84,"column":6},"end":{"line":86,"column":null}},"type":"if","locations":[{"start":{"line":84,"column":6},"end":{"line":86,"column":null}}]},"11":{"loc":{"start":{"line":99,"column":2},"end":{"line":102,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":2},"end":{"line":102,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0,0],"4":[0],"5":[0],"6":[0],"7":[0,0,0,0,0,0,0,0,0,0,0],"8":[0,0],"9":[0,0],"10":[0],"11":[0]}} +,"/Users/zane/playground/cloudsite/src/cli/constants.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/constants.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}},"1":{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},"2":{"start":{"line":3,"column":18},"end":{"line":3,"column":46}},"3":{"start":{"line":5,"column":25},"end":{"line":5,"column":104}},"4":{"start":{"line":7,"column":21},"end":{"line":7,"column":91}},"5":{"start":{"line":9,"column":19},"end":{"line":13,"column":1}},"6":{"start":{"line":15,"column":13},"end":{"line":247,"column":1}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},"loc":{"start":{"line":1,"column":35},"end":{"line":1,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},"type":"if","locations":[{"start":{"line":1,"column":35},"end":{"line":1,"column":null}}]},"1":{"loc":{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},{"start":{"line":1,"column":35},"end":{"line":1,"column":null}}]},"2":{"loc":{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},{"start":{"line":1,"column":35},"end":{"line":1,"column":null}}]}},"s":{"0":1,"1":61,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{"0":3},"b":{"0":[16],"1":[35,36],"2":[18,18,17]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/error-out.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/error-out.mjs","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":4,"column":1}},"1":{"start":{"line":2,"column":2},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":2},"end":{"line":3,"column":21}},"3":{"start":{"line":4,"column":1},"end":{"line":4,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":17},"end":{"line":1,"column":18}},"loc":{"start":{"line":1,"column":32},"end":{"line":4,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0},"f":{"0":0},"b":{}} +,"/Users/zane/playground/cloudsite/src/cli/lib/format-output.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/format-output.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":21},"end":{"line":15,"column":1}},"3":{"start":{"line":5,"column":2},"end":{"line":14,"column":null}},"4":{"start":{"line":6,"column":4},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":9},"end":{"line":14,"column":null}},"6":{"start":{"line":8,"column":4},"end":{"line":8,"column":null}},"7":{"start":{"line":10,"column":20},"end":{"line":10,"column":49}},"8":{"start":{"line":11,"column":17},"end":{"line":11,"column":49}},"9":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"10":{"start":{"line":15,"column":1},"end":{"line":15,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":21},"end":{"line":4,"column":22}},"loc":{"start":{"line":4,"column":45},"end":{"line":15,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":2},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":5,"column":2},"end":{"line":14,"column":null}},{"start":{"line":7,"column":9},"end":{"line":14,"column":null}}]},"1":{"loc":{"start":{"line":7,"column":9},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":7,"column":9},"end":{"line":14,"column":null}},{"start":{"line":9,"column":9},"end":{"line":14,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/get-site-info.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/get-site-info.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":20},"end":{"line":14,"column":1}},"2":{"start":{"line":4,"column":2},"end":{"line":6,"column":null}},"3":{"start":{"line":5,"column":4},"end":{"line":5,"column":null}},"4":{"start":{"line":8,"column":19},"end":{"line":8,"column":40}},"5":{"start":{"line":9,"column":2},"end":{"line":11,"column":null}},"6":{"start":{"line":10,"column":4},"end":{"line":10,"column":null}},"7":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"8":{"start":{"line":14,"column":1},"end":{"line":14,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":20},"end":{"line":3,"column":21}},"loc":{"start":{"line":3,"column":51},"end":{"line":14,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":2},"end":{"line":6,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":2},"end":{"line":6,"column":null}}]},"1":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"f":{"0":0},"b":{"0":[0],"1":[0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/get-value-container-and-key.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/get-value-container-and-key.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":32},"end":{"line":38,"column":1}},"2":{"start":{"line":4,"column":19},"end":{"line":4,"column":34}},"3":{"start":{"line":7,"column":2},"end":{"line":37,"column":null}},"4":{"start":{"line":9,"column":4},"end":{"line":36,"column":null}},"5":{"start":{"line":10,"column":6},"end":{"line":10,"column":null}},"6":{"start":{"line":11,"column":6},"end":{"line":23,"column":null}},"7":{"start":{"line":12,"column":40},"end":{"line":12,"column":44}},"8":{"start":{"line":13,"column":8},"end":{"line":15,"column":null}},"9":{"start":{"line":14,"column":10},"end":{"line":14,"column":null}},"10":{"start":{"line":16,"column":8},"end":{"line":18,"column":null}},"11":{"start":{"line":17,"column":10},"end":{"line":17,"column":null}},"12":{"start":{"line":20,"column":8},"end":{"line":22,"column":null}},"13":{"start":{"line":21,"column":10},"end":{"line":21,"column":null}},"14":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"15":{"start":{"line":27,"column":23},"end":{"line":27,"column":32}},"16":{"start":{"line":28,"column":6},"end":{"line":30,"column":null}},"17":{"start":{"line":29,"column":8},"end":{"line":29,"column":null}},"18":{"start":{"line":31,"column":24},"end":{"line":31,"column":42}},"19":{"start":{"line":32,"column":6},"end":{"line":34,"column":null}},"20":{"start":{"line":33,"column":8},"end":{"line":33,"column":null}},"21":{"start":{"line":35,"column":6},"end":{"line":35,"column":null}},"22":{"start":{"line":38,"column":1},"end":{"line":38,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":32},"end":{"line":3,"column":33}},"loc":{"start":{"line":3,"column":74},"end":{"line":38,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":25},"end":{"line":7,"column":26}},"loc":{"start":{"line":7,"column":60},"end":{"line":37,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":4},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":9,"column":4},"end":{"line":36,"column":null}},{"start":{"line":26,"column":11},"end":{"line":36,"column":null}}]},"1":{"loc":{"start":{"line":10,"column":10},"end":{"line":10,"column":24}},"type":"cond-expr","locations":[{"start":{"line":10,"column":17},"end":{"line":10,"column":20}},{"start":{"line":10,"column":13},"end":{"line":10,"column":24}}]},"2":{"loc":{"start":{"line":10,"column":10},"end":{"line":10,"column":20}},"type":"binary-expr","locations":[{"start":{"line":10,"column":10},"end":{"line":10,"column":20}},{"start":{"line":10,"column":17},"end":{"line":10,"column":20}}]},"3":{"loc":{"start":{"line":11,"column":6},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":11,"column":6},"end":{"line":23,"column":null}}]},"4":{"loc":{"start":{"line":13,"column":8},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":13,"column":8},"end":{"line":15,"column":null}}]},"5":{"loc":{"start":{"line":13,"column":12},"end":{"line":13,"column":61}},"type":"binary-expr","locations":[{"start":{"line":13,"column":12},"end":{"line":13,"column":36}},{"start":{"line":13,"column":40},"end":{"line":13,"column":61}}]},"6":{"loc":{"start":{"line":16,"column":8},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":8},"end":{"line":18,"column":null}}]},"7":{"loc":{"start":{"line":16,"column":12},"end":{"line":16,"column":66}},"type":"binary-expr","locations":[{"start":{"line":16,"column":12},"end":{"line":16,"column":33}},{"start":{"line":16,"column":37},"end":{"line":16,"column":66}}]},"8":{"loc":{"start":{"line":20,"column":8},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":8},"end":{"line":22,"column":null}}]},"9":{"loc":{"start":{"line":20,"column":12},"end":{"line":20,"column":58}},"type":"binary-expr","locations":[{"start":{"line":20,"column":12},"end":{"line":20,"column":36}},{"start":{"line":20,"column":40},"end":{"line":20,"column":58}}]},"10":{"loc":{"start":{"line":28,"column":6},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":6},"end":{"line":30,"column":null}}]},"11":{"loc":{"start":{"line":28,"column":10},"end":{"line":28,"column":41}},"type":"binary-expr","locations":[{"start":{"line":28,"column":10},"end":{"line":28,"column":32}},{"start":{"line":28,"column":36},"end":{"line":28,"column":41}}]},"12":{"loc":{"start":{"line":32,"column":6},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":32,"column":6},"end":{"line":34,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0],"4":[0],"5":[0,0],"6":[0],"7":[0,0],"8":[0],"9":[0,0],"10":[0],"11":[0,0],"12":[0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/handle-configuration.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-configuration.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":28},"end":{"line":21,"column":1}},"4":{"start":{"line":7,"column":31},"end":{"line":7,"column":92}},"5":{"start":{"line":7,"column":67},"end":{"line":7,"column":91}},"6":{"start":{"line":8,"column":35},"end":{"line":8,"column":65}},"7":{"start":{"line":9,"column":31},"end":{"line":9,"column":109}},"8":{"start":{"line":10,"column":25},"end":{"line":10,"column":45}},"9":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"10":{"start":{"line":13,"column":2},"end":{"line":20,"column":null}},"11":{"start":{"line":15,"column":6},"end":{"line":15,"column":90}},"12":{"start":{"line":15,"column":90},"end":{"line":15,"column":null}},"13":{"start":{"line":17,"column":6},"end":{"line":17,"column":84}},"14":{"start":{"line":17,"column":84},"end":{"line":17,"column":null}},"15":{"start":{"line":19,"column":6},"end":{"line":19,"column":null}},"16":{"start":{"line":21,"column":1},"end":{"line":21,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":28},"end":{"line":6,"column":35}},"loc":{"start":{"line":6,"column":72},"end":{"line":21,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":53},"end":{"line":7,"column":54}},"loc":{"start":{"line":7,"column":67},"end":{"line":7,"column":91}}}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":9},"end":{"line":11,"column":44}},"type":"binary-expr","locations":[{"start":{"line":11,"column":9},"end":{"line":11,"column":38}},{"start":{"line":11,"column":42},"end":{"line":11,"column":44}}]},"1":{"loc":{"start":{"line":13,"column":2},"end":{"line":20,"column":null}},"type":"switch","locations":[{"start":{"line":14,"column":4},"end":{"line":15,"column":null}},{"start":{"line":16,"column":4},"end":{"line":17,"column":null}},{"start":{"line":18,"column":4},"end":{"line":19,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0,0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/handle-create.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-create.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":9,"column":0},"end":{"line":9,"column":39}},"7":{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},"8":{"start":{"line":11,"column":21},"end":{"line":68,"column":1}},"9":{"start":{"line":12,"column":28},"end":{"line":12,"column":92}},"10":{"start":{"line":12,"column":64},"end":{"line":12,"column":81}},"11":{"start":{"line":13,"column":24},"end":{"line":13,"column":68}},"12":{"start":{"line":15,"column":28},"end":{"line":15,"column":65}},"13":{"start":{"line":17,"column":21},"end":{"line":17,"column":49}},"14":{"start":{"line":18,"column":21},"end":{"line":18,"column":49}},"15":{"start":{"line":19,"column":18},"end":{"line":19,"column":43}},"16":{"start":{"line":21,"column":21},"end":{"line":21,"column":65}},"17":{"start":{"line":22,"column":19},"end":{"line":22,"column":47}},"18":{"start":{"line":23,"column":20},"end":{"line":23,"column":47}},"19":{"start":{"line":24,"column":18},"end":{"line":24,"column":64}},"20":{"start":{"line":25,"column":2},"end":{"line":25,"column":37}},"21":{"start":{"line":27,"column":19},"end":{"line":27,"column":94}},"22":{"start":{"line":28,"column":2},"end":{"line":28,"column":null}},"23":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"24":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"25":{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},"26":{"start":{"line":36,"column":2},"end":{"line":42,"column":null}},"27":{"start":{"line":37,"column":4},"end":{"line":41,"column":null}},"28":{"start":{"line":38,"column":6},"end":{"line":38,"column":null}},"29":{"start":{"line":40,"column":6},"end":{"line":40,"column":22}},"30":{"start":{"line":45,"column":2},"end":{"line":51,"column":null}},"31":{"start":{"line":46,"column":33},"end":{"line":46,"column":89}},"32":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"33":{"start":{"line":48,"column":9},"end":{"line":51,"column":null}},"34":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"35":{"start":{"line":50,"column":4},"end":{"line":50,"column":20}},"36":{"start":{"line":53,"column":2},"end":{"line":56,"column":null}},"37":{"start":{"line":54,"column":4},"end":{"line":54,"column":null}},"38":{"start":{"line":55,"column":4},"end":{"line":55,"column":20}},"39":{"start":{"line":58,"column":2},"end":{"line":58,"column":null}},"40":{"start":{"line":61,"column":2},"end":{"line":65,"column":null}},"41":{"start":{"line":62,"column":4},"end":{"line":64,"column":null}},"42":{"start":{"line":63,"column":6},"end":{"line":63,"column":null}},"43":{"start":{"line":67,"column":2},"end":{"line":67,"column":null}},"44":{"start":{"line":68,"column":1},"end":{"line":68,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},"loc":{"start":{"line":9,"column":39},"end":{"line":9,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":11,"column":21},"end":{"line":11,"column":28}},"loc":{"start":{"line":11,"column":67},"end":{"line":68,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":12,"column":50},"end":{"line":12,"column":51}},"loc":{"start":{"line":12,"column":64},"end":{"line":12,"column":81}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},"type":"if","locations":[{"start":{"line":9,"column":39},"end":{"line":9,"column":null}}]},"1":{"loc":{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},"type":"cond-expr","locations":[{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},{"start":{"line":9,"column":39},"end":{"line":9,"column":null}}]},"2":{"loc":{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},"type":"binary-expr","locations":[{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},{"start":{"line":9,"column":39},"end":{"line":9,"column":null}}]},"3":{"loc":{"start":{"line":27,"column":19},"end":{"line":27,"column":94}},"type":"binary-expr","locations":[{"start":{"line":27,"column":19},"end":{"line":27,"column":40}},{"start":{"line":27,"column":44},"end":{"line":27,"column":94}}]},"4":{"loc":{"start":{"line":28,"column":20},"end":{"line":28,"column":74}},"type":"binary-expr","locations":[{"start":{"line":28,"column":20},"end":{"line":28,"column":40}},{"start":{"line":28,"column":44},"end":{"line":28,"column":59}},{"start":{"line":28,"column":63},"end":{"line":28,"column":74}}]},"5":{"loc":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":31,"column":null}}]},"6":{"loc":{"start":{"line":37,"column":4},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":41,"column":null}}]},"7":{"loc":{"start":{"line":45,"column":2},"end":{"line":51,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":2},"end":{"line":51,"column":null}},{"start":{"line":48,"column":9},"end":{"line":51,"column":null}}]},"8":{"loc":{"start":{"line":47,"column":17},"end":{"line":47,"column":76}},"type":"cond-expr","locations":[{"start":{"line":47,"column":52},"end":{"line":47,"column":64}},{"start":{"line":47,"column":67},"end":{"line":47,"column":76}}]},"9":{"loc":{"start":{"line":48,"column":9},"end":{"line":51,"column":null}},"type":"if","locations":[{"start":{"line":48,"column":9},"end":{"line":51,"column":null}}]},"10":{"loc":{"start":{"line":53,"column":2},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":56,"column":null}}]},"11":{"loc":{"start":{"line":53,"column":6},"end":{"line":53,"column":71}},"type":"binary-expr","locations":[{"start":{"line":53,"column":6},"end":{"line":53,"column":30}},{"start":{"line":53,"column":34},"end":{"line":53,"column":71}}]},"12":{"loc":{"start":{"line":62,"column":4},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":4},"end":{"line":64,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0,0],"4":[0,0,0],"5":[0],"6":[0],"7":[0,0],"8":[0,0],"9":[0],"10":[0],"11":[0,0],"12":[0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/handle-destroy.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-destroy.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":22},"end":{"line":26,"column":1}},"5":{"start":{"line":8,"column":29},"end":{"line":8,"column":94}},"6":{"start":{"line":8,"column":65},"end":{"line":8,"column":83}},"7":{"start":{"line":9,"column":25},"end":{"line":9,"column":70}},"8":{"start":{"line":10,"column":21},"end":{"line":10,"column":50}},"9":{"start":{"line":11,"column":24},"end":{"line":11,"column":38}},"10":{"start":{"line":13,"column":19},"end":{"line":13,"column":57}},"11":{"start":{"line":15,"column":2},"end":{"line":18,"column":null}},"12":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"13":{"start":{"line":17,"column":4},"end":{"line":17,"column":20}},"14":{"start":{"line":20,"column":18},"end":{"line":20,"column":76}},"15":{"start":{"line":22,"column":2},"end":{"line":25,"column":null}},"16":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"17":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"18":{"start":{"line":26,"column":1},"end":{"line":26,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":22},"end":{"line":7,"column":29}},"loc":{"start":{"line":7,"column":68},"end":{"line":26,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":51},"end":{"line":8,"column":52}},"loc":{"start":{"line":8,"column":65},"end":{"line":8,"column":83}}}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":2},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":2},"end":{"line":18,"column":null}}]},"1":{"loc":{"start":{"line":22,"column":2},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":25,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"f":{"0":0,"1":0},"b":{"0":[0],"1":[0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/handle-detail.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-detail.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":8,"column":21},"end":{"line":21,"column":1}},"6":{"start":{"line":9,"column":28},"end":{"line":9,"column":92}},"7":{"start":{"line":9,"column":64},"end":{"line":9,"column":81}},"8":{"start":{"line":10,"column":24},"end":{"line":10,"column":68}},"9":{"start":{"line":11,"column":21},"end":{"line":11,"column":49}},"10":{"start":{"line":12,"column":21},"end":{"line":12,"column":34}},"11":{"start":{"line":14,"column":2},"end":{"line":16,"column":null}},"12":{"start":{"line":15,"column":4},"end":{"line":15,"column":null}},"13":{"start":{"line":18,"column":17},"end":{"line":18,"column":55}},"14":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"15":{"start":{"line":21,"column":1},"end":{"line":21,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":21},"end":{"line":8,"column":22}},"loc":{"start":{"line":8,"column":46},"end":{"line":21,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":50},"end":{"line":9,"column":51}},"loc":{"start":{"line":9,"column":64},"end":{"line":9,"column":81}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":2},"end":{"line":16,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":16,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0},"f":{"0":0,"1":0},"b":{"0":[0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/handle-get-iam-policy.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-get-iam-policy.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":18},"end":{"line":89,"column":1}},"3":{"start":{"line":92,"column":1},"end":{"line":97,"column":41}},"4":{"start":{"line":99,"column":27},"end":{"line":108,"column":1}},"5":{"start":{"line":100,"column":34},"end":{"line":100,"column":106}},"6":{"start":{"line":100,"column":70},"end":{"line":100,"column":95}},"7":{"start":{"line":101,"column":30},"end":{"line":101,"column":80}},"8":{"start":{"line":102,"column":27},"end":{"line":102,"column":67}},"9":{"start":{"line":104,"column":2},"end":{"line":106,"column":null}},"10":{"start":{"line":105,"column":4},"end":{"line":105,"column":null}},"11":{"start":{"line":107,"column":2},"end":{"line":107,"column":null}},"12":{"start":{"line":108,"column":1},"end":{"line":108,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":99,"column":27},"end":{"line":99,"column":28}},"loc":{"start":{"line":99,"column":41},"end":{"line":108,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":100,"column":56},"end":{"line":100,"column":57}},"loc":{"start":{"line":100,"column":70},"end":{"line":100,"column":95}}}},"branchMap":{"0":{"loc":{"start":{"line":104,"column":2},"end":{"line":106,"column":null}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":106,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"f":{"0":0,"1":0},"b":{"0":[0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/handle-list.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-list.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":19},"end":{"line":23,"column":1}},"5":{"start":{"line":8,"column":26},"end":{"line":8,"column":88}},"6":{"start":{"line":8,"column":62},"end":{"line":8,"column":77}},"7":{"start":{"line":9,"column":22},"end":{"line":9,"column":64}},"8":{"start":{"line":10,"column":20},"end":{"line":10,"column":45}},"9":{"start":{"line":11,"column":21},"end":{"line":11,"column":32}},"10":{"start":{"line":13,"column":25},"end":{"line":13,"column":49}},"11":{"start":{"line":14,"column":17},"end":{"line":20,"column":6}},"12":{"start":{"line":17,"column":22},"end":{"line":17,"column":76}},"13":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"14":{"start":{"line":19,"column":6},"end":{"line":19,"column":null}},"15":{"start":{"line":22,"column":2},"end":{"line":22,"column":null}},"16":{"start":{"line":23,"column":1},"end":{"line":23,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":19},"end":{"line":7,"column":20}},"loc":{"start":{"line":7,"column":44},"end":{"line":23,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":48},"end":{"line":8,"column":49}},"loc":{"start":{"line":8,"column":62},"end":{"line":8,"column":77}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":16,"column":26},"end":{"line":16,"column":34}},"loc":{"start":{"line":16,"column":39},"end":{"line":20,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":17},"end":{"line":20,"column":6}},"type":"cond-expr","locations":[{"start":{"line":15,"column":6},"end":{"line":15,"column":20}},{"start":{"line":16,"column":6},"end":{"line":20,"column":6}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/handle-plugin-settings.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-plugin-settings.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":46}},"7":{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},"8":{"start":{"line":10,"column":29},"end":{"line":54,"column":1}},"9":{"start":{"line":11,"column":31},"end":{"line":11,"column":104}},"10":{"start":{"line":11,"column":67},"end":{"line":11,"column":93}},"11":{"start":{"line":12,"column":27},"end":{"line":12,"column":74}},"12":{"start":{"line":13,"column":21},"end":{"line":13,"column":52}},"13":{"start":{"line":14,"column":18},"end":{"line":14,"column":67}},"14":{"start":{"line":16,"column":44},"end":{"line":16,"column":60}},"15":{"start":{"line":19,"column":19},"end":{"line":19,"column":57}},"16":{"start":{"line":21,"column":2},"end":{"line":33,"column":null}},"17":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"18":{"start":{"line":23,"column":9},"end":{"line":33,"column":null}},"19":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"20":{"start":{"line":25,"column":9},"end":{"line":33,"column":null}},"21":{"start":{"line":26,"column":4},"end":{"line":32,"column":null}},"22":{"start":{"line":27,"column":6},"end":{"line":27,"column":58}},"23":{"start":{"line":28,"column":11},"end":{"line":32,"column":null}},"24":{"start":{"line":29,"column":6},"end":{"line":29,"column":null}},"25":{"start":{"line":30,"column":11},"end":{"line":32,"column":null}},"26":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"27":{"start":{"line":35,"column":2},"end":{"line":37,"column":null}},"28":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"29":{"start":{"line":40,"column":34},"end":{"line":40,"column":42}},"30":{"start":{"line":42,"column":2},"end":{"line":51,"column":null}},"31":{"start":{"line":43,"column":41},"end":{"line":43,"column":113}},"32":{"start":{"line":44,"column":4},"end":{"line":44,"column":null}},"33":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"34":{"start":{"line":47,"column":6},"end":{"line":47,"column":null}},"35":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"36":{"start":{"line":53,"column":2},"end":{"line":53,"column":null}},"37":{"start":{"line":54,"column":1},"end":{"line":54,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},"loc":{"start":{"line":8,"column":46},"end":{"line":8,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":10,"column":29},"end":{"line":10,"column":36}},"loc":{"start":{"line":10,"column":60},"end":{"line":54,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":11,"column":53},"end":{"line":11,"column":54}},"loc":{"start":{"line":11,"column":67},"end":{"line":11,"column":93}}}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":46},"end":{"line":8,"column":null}}]},"1":{"loc":{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},"type":"cond-expr","locations":[{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},{"start":{"line":8,"column":46},"end":{"line":8,"column":null}}]},"2":{"loc":{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},"type":"binary-expr","locations":[{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},{"start":{"line":8,"column":46},"end":{"line":8,"column":null}}]},"3":{"loc":{"start":{"line":21,"column":2},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":33,"column":null}},{"start":{"line":23,"column":9},"end":{"line":33,"column":null}}]},"4":{"loc":{"start":{"line":21,"column":6},"end":{"line":21,"column":70}},"type":"binary-expr","locations":[{"start":{"line":21,"column":6},"end":{"line":21,"column":23}},{"start":{"line":21,"column":28},"end":{"line":21,"column":47}},{"start":{"line":21,"column":51},"end":{"line":21,"column":69}}]},"5":{"loc":{"start":{"line":23,"column":9},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":9},"end":{"line":33,"column":null}},{"start":{"line":25,"column":9},"end":{"line":33,"column":null}}]},"6":{"loc":{"start":{"line":23,"column":13},"end":{"line":23,"column":52}},"type":"binary-expr","locations":[{"start":{"line":23,"column":13},"end":{"line":23,"column":30}},{"start":{"line":23,"column":34},"end":{"line":23,"column":52}}]},"7":{"loc":{"start":{"line":25,"column":9},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":9},"end":{"line":33,"column":null}}]},"8":{"loc":{"start":{"line":26,"column":4},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":32,"column":null}},{"start":{"line":28,"column":11},"end":{"line":32,"column":null}}]},"9":{"loc":{"start":{"line":26,"column":8},"end":{"line":26,"column":49}},"type":"binary-expr","locations":[{"start":{"line":26,"column":8},"end":{"line":26,"column":26}},{"start":{"line":26,"column":30},"end":{"line":26,"column":49}}]},"10":{"loc":{"start":{"line":28,"column":11},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":11},"end":{"line":32,"column":null}},{"start":{"line":30,"column":11},"end":{"line":32,"column":null}}]},"11":{"loc":{"start":{"line":28,"column":15},"end":{"line":28,"column":56}},"type":"binary-expr","locations":[{"start":{"line":28,"column":15},"end":{"line":28,"column":33}},{"start":{"line":28,"column":37},"end":{"line":28,"column":56}}]},"12":{"loc":{"start":{"line":30,"column":11},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":30,"column":11},"end":{"line":32,"column":null}}]},"13":{"loc":{"start":{"line":30,"column":15},"end":{"line":30,"column":56}},"type":"binary-expr","locations":[{"start":{"line":30,"column":15},"end":{"line":30,"column":33}},{"start":{"line":30,"column":37},"end":{"line":30,"column":56}}]},"14":{"loc":{"start":{"line":35,"column":2},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":2},"end":{"line":37,"column":null}}]},"15":{"loc":{"start":{"line":35,"column":6},"end":{"line":35,"column":47}},"type":"binary-expr","locations":[{"start":{"line":35,"column":6},"end":{"line":35,"column":23}},{"start":{"line":35,"column":27},"end":{"line":35,"column":47}}]},"16":{"loc":{"start":{"line":40,"column":10},"end":{"line":40,"column":30}},"type":"default-arg","locations":[{"start":{"line":40,"column":27},"end":{"line":40,"column":30}}]},"17":{"loc":{"start":{"line":42,"column":2},"end":{"line":51,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":51,"column":null}},{"start":{"line":49,"column":9},"end":{"line":51,"column":null}}]},"18":{"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":48,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0,0],"4":[0,0,0],"5":[0,0],"6":[0,0],"7":[0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0],"13":[0,0],"14":[0],"15":[0,0],"16":[0],"17":[0,0],"18":[0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/handle-update.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-update.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":21},"end":{"line":20,"column":1}},"5":{"start":{"line":8,"column":28},"end":{"line":8,"column":92}},"6":{"start":{"line":8,"column":64},"end":{"line":8,"column":81}},"7":{"start":{"line":9,"column":24},"end":{"line":9,"column":68}},"8":{"start":{"line":10,"column":21},"end":{"line":10,"column":49}},"9":{"start":{"line":11,"column":20},"end":{"line":11,"column":47}},"10":{"start":{"line":12,"column":16},"end":{"line":12,"column":39}},"11":{"start":{"line":13,"column":18},"end":{"line":13,"column":43}},"12":{"start":{"line":14,"column":18},"end":{"line":14,"column":43}},"13":{"start":{"line":15,"column":30},"end":{"line":15,"column":68}},"14":{"start":{"line":17,"column":19},"end":{"line":17,"column":57}},"15":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"16":{"start":{"line":20,"column":1},"end":{"line":20,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":21},"end":{"line":7,"column":28}},"loc":{"start":{"line":7,"column":67},"end":{"line":20,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":50},"end":{"line":8,"column":51}},"loc":{"start":{"line":8,"column":64},"end":{"line":8,"column":81}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{"0":0,"1":0},"b":{}} +,"/Users/zane/playground/cloudsite/src/cli/lib/handle-verify.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-verify.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":8,"column":21},"end":{"line":27,"column":1}},"6":{"start":{"line":9,"column":28},"end":{"line":9,"column":92}},"7":{"start":{"line":9,"column":64},"end":{"line":9,"column":81}},"8":{"start":{"line":10,"column":24},"end":{"line":10,"column":68}},"9":{"start":{"line":11,"column":21},"end":{"line":11,"column":34}},"10":{"start":{"line":12,"column":21},"end":{"line":12,"column":49}},"11":{"start":{"line":13,"column":23},"end":{"line":13,"column":53}},"12":{"start":{"line":14,"column":22},"end":{"line":14,"column":52}},"13":{"start":{"line":15,"column":21},"end":{"line":15,"column":49}},"14":{"start":{"line":17,"column":19},"end":{"line":17,"column":57}},"15":{"start":{"line":20,"column":4},"end":{"line":20,"column":117}},"16":{"start":{"line":21,"column":24},"end":{"line":23,"column":15}},"17":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"18":{"start":{"line":22,"column":25},"end":{"line":22,"column":40}},"19":{"start":{"line":22,"column":47},"end":{"line":22,"column":null}},"20":{"start":{"line":22,"column":69},"end":{"line":22,"column":85}},"21":{"start":{"line":22,"column":94},"end":{"line":22,"column":105}},"22":{"start":{"line":25,"column":17},"end":{"line":25,"column":71}},"23":{"start":{"line":26,"column":2},"end":{"line":26,"column":null}},"24":{"start":{"line":27,"column":1},"end":{"line":27,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":21},"end":{"line":8,"column":28}},"loc":{"start":{"line":8,"column":67},"end":{"line":27,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":50},"end":{"line":9,"column":51}},"loc":{"start":{"line":9,"column":64},"end":{"line":9,"column":81}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":21,"column":39},"end":{"line":21,"column":40}},"loc":{"start":{"line":21,"column":64},"end":{"line":23,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},{"start":{"line":22,"column":47},"end":{"line":22,"column":null}}]},"1":{"loc":{"start":{"line":22,"column":47},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":47},"end":{"line":22,"column":null}},{"start":{"line":22,"column":92},"end":{"line":22,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/options.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/options.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":46}},"4":{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},"5":{"start":{"line":6,"column":22},"end":{"line":13,"column":4}},"6":{"start":{"line":7,"column":2},"end":{"line":13,"column":4}},"7":{"start":{"line":8,"column":24},"end":{"line":8,"column":45}},"8":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"9":{"start":{"line":10,"column":4},"end":{"line":10,"column":null}},"10":{"start":{"line":12,"column":4},"end":{"line":12,"column":null}},"11":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"12":{"start":{"line":15,"column":29},"end":{"line":36,"column":1}},"13":{"start":{"line":16,"column":34},"end":{"line":16,"column":42}},"14":{"start":{"line":18,"column":2},"end":{"line":32,"column":null}},"15":{"start":{"line":19,"column":4},"end":{"line":19,"column":56}},"16":{"start":{"line":20,"column":21},"end":{"line":20,"column":36}},"17":{"start":{"line":22,"column":4},"end":{"line":24,"column":null}},"18":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"19":{"start":{"line":26,"column":21},"end":{"line":26,"column":55}},"20":{"start":{"line":28,"column":24},"end":{"line":28,"column":50}},"21":{"start":{"line":30,"column":6},"end":{"line":30,"column":105}},"22":{"start":{"line":31,"column":4},"end":{"line":31,"column":null}},"23":{"start":{"line":34,"column":2},"end":{"line":34,"column":49}},"24":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"25":{"start":{"line":36,"column":1},"end":{"line":36,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},"loc":{"start":{"line":4,"column":46},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":6,"column":22},"end":{"line":6,"column":23}},"loc":{"start":{"line":7,"column":2},"end":{"line":13,"column":4}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":7,"column":18},"end":{"line":7,"column":22}},"loc":{"start":{"line":7,"column":27},"end":{"line":13,"column":3}}},"3":{"name":"(anonymous_5)","decl":{"start":{"line":15,"column":29},"end":{"line":15,"column":30}},"loc":{"start":{"line":15,"column":56},"end":{"line":36,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":46},"end":{"line":4,"column":null}}]},"1":{"loc":{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},"type":"cond-expr","locations":[{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},{"start":{"line":4,"column":46},"end":{"line":4,"column":null}}]},"2":{"loc":{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},"type":"binary-expr","locations":[{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},{"start":{"line":4,"column":46},"end":{"line":4,"column":null}}]},"3":{"loc":{"start":{"line":6,"column":23},"end":{"line":6,"column":38}},"type":"default-arg","locations":[{"start":{"line":6,"column":36},"end":{"line":6,"column":38}}]},"4":{"loc":{"start":{"line":9,"column":12},"end":{"line":9,"column":52}},"type":"binary-expr","locations":[{"start":{"line":9,"column":12},"end":{"line":9,"column":42}},{"start":{"line":9,"column":46},"end":{"line":9,"column":52}}]},"5":{"loc":{"start":{"line":9,"column":12},"end":{"line":9,"column":42}},"type":"cond-expr","locations":[{"start":{"line":9,"column":17},"end":{"line":9,"column":19}},{"start":{"line":9,"column":12},"end":{"line":9,"column":42}}]},"6":{"loc":{"start":{"line":9,"column":12},"end":{"line":9,"column":19}},"type":"binary-expr","locations":[{"start":{"line":9,"column":12},"end":{"line":9,"column":19}},{"start":{"line":9,"column":17},"end":{"line":9,"column":19}}]},"7":{"loc":{"start":{"line":16,"column":10},"end":{"line":16,"column":30}},"type":"default-arg","locations":[{"start":{"line":16,"column":27},"end":{"line":16,"column":30}}]},"8":{"loc":{"start":{"line":22,"column":4},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":24,"column":null}}]},"9":{"loc":{"start":{"line":26,"column":21},"end":{"line":26,"column":55}},"type":"cond-expr","locations":[{"start":{"line":26,"column":46},"end":{"line":26,"column":48}},{"start":{"line":26,"column":24},"end":{"line":26,"column":55}}]},"10":{"loc":{"start":{"line":26,"column":21},"end":{"line":26,"column":48}},"type":"binary-expr","locations":[{"start":{"line":26,"column":21},"end":{"line":26,"column":48}},{"start":{"line":26,"column":46},"end":{"line":26,"column":48}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0],"8":[0],"9":[0,0],"10":[0,0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/smart-convert.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/smart-convert.mjs","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":20,"column":1}},"1":{"start":{"line":2,"column":2},"end":{"line":19,"column":null}},"2":{"start":{"line":3,"column":4},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":9},"end":{"line":19,"column":null}},"4":{"start":{"line":5,"column":4},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":9},"end":{"line":19,"column":null}},"6":{"start":{"line":7,"column":4},"end":{"line":7,"column":null}},"7":{"start":{"line":8,"column":9},"end":{"line":19,"column":null}},"8":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"9":{"start":{"line":10,"column":9},"end":{"line":19,"column":null}},"10":{"start":{"line":11,"column":4},"end":{"line":11,"column":null}},"11":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"12":{"start":{"line":14,"column":4},"end":{"line":18,"column":null}},"13":{"start":{"line":15,"column":6},"end":{"line":15,"column":null}},"14":{"start":{"line":17,"column":6},"end":{"line":17,"column":null}},"15":{"start":{"line":20,"column":1},"end":{"line":20,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":22},"end":{"line":1,"column":27}},"loc":{"start":{"line":1,"column":32},"end":{"line":20,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":2},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":2,"column":2},"end":{"line":19,"column":null}},{"start":{"line":4,"column":9},"end":{"line":19,"column":null}}]},"1":{"loc":{"start":{"line":4,"column":9},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":9},"end":{"line":19,"column":null}},{"start":{"line":6,"column":9},"end":{"line":19,"column":null}}]},"2":{"loc":{"start":{"line":4,"column":13},"end":{"line":4,"column":49}},"type":"binary-expr","locations":[{"start":{"line":4,"column":13},"end":{"line":4,"column":29}},{"start":{"line":4,"column":33},"end":{"line":4,"column":49}}]},"3":{"loc":{"start":{"line":6,"column":9},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":6,"column":9},"end":{"line":19,"column":null}},{"start":{"line":8,"column":9},"end":{"line":19,"column":null}}]},"4":{"loc":{"start":{"line":6,"column":13},"end":{"line":6,"column":51}},"type":"binary-expr","locations":[{"start":{"line":6,"column":13},"end":{"line":6,"column":30}},{"start":{"line":6,"column":34},"end":{"line":6,"column":51}}]},"5":{"loc":{"start":{"line":8,"column":9},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":9},"end":{"line":19,"column":null}},{"start":{"line":10,"column":9},"end":{"line":19,"column":null}}]},"6":{"loc":{"start":{"line":10,"column":9},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":9},"end":{"line":19,"column":null}},{"start":{"line":12,"column":9},"end":{"line":19,"column":null}}]},"7":{"loc":{"start":{"line":14,"column":4},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":4},"end":{"line":18,"column":null}},{"start":{"line":16,"column":11},"end":{"line":18,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/configuration/handle-configuration-initialize.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/configuration/handle-configuration-initialize.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":53}},"4":{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},"5":{"start":{"line":8,"column":38},"end":{"line":30,"column":1}},"6":{"start":{"line":9,"column":30},"end":{"line":17,"column":3}},"7":{"start":{"line":19,"column":21},"end":{"line":19,"column":60}},"8":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"9":{"start":{"line":22,"column":18},"end":{"line":23,"column":86}},"10":{"start":{"line":23,"column":45},"end":{"line":23,"column":69}},"11":{"start":{"line":23,"column":69},"end":{"line":23,"column":80}},"12":{"start":{"line":25,"column":28},"end":{"line":25,"column":47}},"13":{"start":{"line":26,"column":32},"end":{"line":26,"column":67}},"14":{"start":{"line":28,"column":2},"end":{"line":28,"column":null}},"15":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}},"16":{"start":{"line":30,"column":1},"end":{"line":30,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},"loc":{"start":{"line":6,"column":53},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":8,"column":38},"end":{"line":8,"column":50}},"loc":{"start":{"line":8,"column":50},"end":{"line":30,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":23,"column":12},"end":{"line":23,"column":13}},"loc":{"start":{"line":23,"column":43},"end":{"line":23,"column":81}}}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},"type":"if","locations":[{"start":{"line":6,"column":53},"end":{"line":6,"column":null}}]},"1":{"loc":{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},"type":"cond-expr","locations":[{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},{"start":{"line":6,"column":53},"end":{"line":6,"column":null}}]},"2":{"loc":{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},"type":"binary-expr","locations":[{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},{"start":{"line":6,"column":53},"end":{"line":6,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0]}} +,"/Users/zane/playground/cloudsite/src/cli/lib/configuration/handle-configuration-show.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/configuration/handle-configuration-show.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":53}},"2":{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":32},"end":{"line":9,"column":1}},"4":{"start":{"line":6,"column":28},"end":{"line":6,"column":47}},"5":{"start":{"line":7,"column":32},"end":{"line":7,"column":91}},"6":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"7":{"start":{"line":9,"column":1},"end":{"line":9,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},"loc":{"start":{"line":3,"column":53},"end":{"line":3,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":5,"column":32},"end":{"line":5,"column":44}},"loc":{"start":{"line":5,"column":44},"end":{"line":9,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},"type":"if","locations":[{"start":{"line":3,"column":53},"end":{"line":3,"column":null}}]},"1":{"loc":{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},"type":"cond-expr","locations":[{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},{"start":{"line":3,"column":53},"end":{"line":3,"column":null}}]},"2":{"loc":{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},"type":"binary-expr","locations":[{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},{"start":{"line":3,"column":53},"end":{"line":3,"column":null}}]}},"s":{"0":1,"1":1,"2":16,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{"0":3,"1":1},"b":{"0":[1],"1":[5,6],"2":[3,3,2]}} +,"/Users/zane/playground/cloudsite/src/lib/actions/create.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/create.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"7":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"8":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"9":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"10":{"start":{"line":12,"column":0},"end":{"line":12,"column":null}},"11":{"start":{"line":13,"column":0},"end":{"line":13,"column":55}},"12":{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},"13":{"start":{"line":15,"column":29},"end":{"line":15,"column":31}},"14":{"start":{"line":17,"column":15},"end":{"line":70,"column":1}},"15":{"start":{"line":23,"column":25},"end":{"line":23,"column":33}},"16":{"start":{"line":24,"column":23},"end":{"line":24,"column":31}},"17":{"start":{"line":26,"column":22},"end":{"line":26,"column":55}},"18":{"start":{"line":28,"column":20},"end":{"line":31,"column":4}},"19":{"start":{"line":33,"column":35},"end":{"line":33,"column":83}},"20":{"start":{"line":34,"column":2},"end":{"line":38,"column":null}},"21":{"start":{"line":35,"column":4},"end":{"line":35,"column":null}},"22":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"23":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"24":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"25":{"start":{"line":41,"column":2},"end":{"line":46,"column":null}},"26":{"start":{"line":42,"column":31},"end":{"line":42,"column":74}},"27":{"start":{"line":44,"column":7},"end":{"line":44,"column":110}},"28":{"start":{"line":45,"column":4},"end":{"line":45,"column":null}},"29":{"start":{"line":48,"column":2},"end":{"line":48,"column":null}},"30":{"start":{"line":49,"column":2},"end":{"line":49,"column":null}},"31":{"start":{"line":50,"column":23},"end":{"line":50,"column":90}},"32":{"start":{"line":52,"column":2},"end":{"line":69,"column":null}},"33":{"start":{"line":53,"column":31},"end":{"line":56,"column":73}},"34":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}},"35":{"start":{"line":56,"column":41},"end":{"line":56,"column":72}},"36":{"start":{"line":58,"column":4},"end":{"line":58,"column":52}},"37":{"start":{"line":59,"column":4},"end":{"line":64,"column":null}},"38":{"start":{"line":63,"column":8},"end":{"line":63,"column":76}},"39":{"start":{"line":66,"column":4},"end":{"line":66,"column":null}},"40":{"start":{"line":68,"column":4},"end":{"line":68,"column":null}},"41":{"start":{"line":70,"column":1},"end":{"line":70,"column":null}},"42":{"start":{"line":72,"column":24},"end":{"line":90,"column":1}},"43":{"start":{"line":73,"column":2},"end":{"line":73,"column":null}},"44":{"start":{"line":74,"column":31},"end":{"line":74,"column":89}},"45":{"start":{"line":75,"column":34},"end":{"line":75,"column":83}},"46":{"start":{"line":76,"column":23},"end":{"line":76,"column":68}},"47":{"start":{"line":78,"column":17},"end":{"line":78,"column":34}},"48":{"start":{"line":79,"column":2},"end":{"line":83,"column":null}},"49":{"start":{"line":80,"column":4},"end":{"line":82,"column":null}},"50":{"start":{"line":81,"column":6},"end":{"line":81,"column":null}},"51":{"start":{"line":84,"column":2},"end":{"line":84,"column":null}},"52":{"start":{"line":85,"column":2},"end":{"line":87,"column":null}},"53":{"start":{"line":86,"column":4},"end":{"line":86,"column":null}},"54":{"start":{"line":89,"column":2},"end":{"line":89,"column":null}},"55":{"start":{"line":92,"column":26},"end":{"line":126,"column":1}},"56":{"start":{"line":93,"column":2},"end":{"line":93,"column":null}},"57":{"start":{"line":94,"column":16},"end":{"line":118,"column":3}},"58":{"start":{"line":120,"column":18},"end":{"line":120,"column":54}},"59":{"start":{"line":121,"column":19},"end":{"line":121,"column":48}},"60":{"start":{"line":123,"column":29},"end":{"line":123,"column":37}},"61":{"start":{"line":125,"column":2},"end":{"line":125,"column":null}},"62":{"start":{"line":128,"column":24},"end":{"line":156,"column":1}},"63":{"start":{"line":129,"column":33},"end":{"line":129,"column":41}},"64":{"start":{"line":131,"column":23},"end":{"line":131,"column":66}},"65":{"start":{"line":132,"column":2},"end":{"line":132,"column":null}},"66":{"start":{"line":133,"column":2},"end":{"line":133,"column":null}},"67":{"start":{"line":135,"column":33},"end":{"line":135,"column":54}},"68":{"start":{"line":137,"column":31},"end":{"line":137,"column":80}},"69":{"start":{"line":138,"column":20},"end":{"line":138,"column":90}},"70":{"start":{"line":139,"column":22},"end":{"line":145,"column":3}},"71":{"start":{"line":146,"column":24},"end":{"line":146,"column":59}},"72":{"start":{"line":147,"column":25},"end":{"line":147,"column":71}},"73":{"start":{"line":149,"column":22},"end":{"line":149,"column":36}},"74":{"start":{"line":151,"column":2},"end":{"line":151,"column":null}},"75":{"start":{"line":152,"column":2},"end":{"line":152,"column":null}},"76":{"start":{"line":154,"column":23},"end":{"line":154,"column":101}},"77":{"start":{"line":155,"column":2},"end":{"line":155,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},"loc":{"start":{"line":13,"column":55},"end":{"line":13,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":17,"column":15},"end":{"line":17,"column":22}},"loc":{"start":{"line":22,"column":6},"end":{"line":70,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":79},"end":{"line":53,"column":88}},"loc":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}}},"3":{"name":"(anonymous_5)","decl":{"start":{"line":56,"column":14},"end":{"line":56,"column":15}},"loc":{"start":{"line":56,"column":41},"end":{"line":56,"column":72}}},"4":{"name":"(anonymous_6)","decl":{"start":{"line":62,"column":33},"end":{"line":62,"column":34}},"loc":{"start":{"line":63,"column":8},"end":{"line":63,"column":76}}},"5":{"name":"(anonymous_7)","decl":{"start":{"line":72,"column":24},"end":{"line":72,"column":31}},"loc":{"start":{"line":72,"column":72},"end":{"line":90,"column":1}}},"6":{"name":"(anonymous_8)","decl":{"start":{"line":92,"column":26},"end":{"line":92,"column":33}},"loc":{"start":{"line":92,"column":63},"end":{"line":126,"column":1}}},"7":{"name":"(anonymous_9)","decl":{"start":{"line":128,"column":24},"end":{"line":128,"column":31}},"loc":{"start":{"line":128,"column":80},"end":{"line":156,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},"type":"if","locations":[{"start":{"line":13,"column":55},"end":{"line":13,"column":null}}]},"1":{"loc":{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},"type":"cond-expr","locations":[{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},{"start":{"line":13,"column":55},"end":{"line":13,"column":null}}]},"2":{"loc":{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},"type":"binary-expr","locations":[{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},{"start":{"line":13,"column":55},"end":{"line":13,"column":null}}]},"3":{"loc":{"start":{"line":34,"column":2},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":38,"column":null}}]},"4":{"loc":{"start":{"line":41,"column":2},"end":{"line":46,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":46,"column":null}}]},"5":{"loc":{"start":{"line":52,"column":2},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":69,"column":null}},{"start":{"line":67,"column":9},"end":{"line":69,"column":null}}]},"6":{"loc":{"start":{"line":53,"column":43},"end":{"line":53,"column":72}},"type":"binary-expr","locations":[{"start":{"line":53,"column":43},"end":{"line":53,"column":66}},{"start":{"line":53,"column":70},"end":{"line":53,"column":72}}]},"7":{"loc":{"start":{"line":80,"column":4},"end":{"line":82,"column":null}},"type":"if","locations":[{"start":{"line":80,"column":4},"end":{"line":82,"column":null}}]},"8":{"loc":{"start":{"line":85,"column":2},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":85,"column":2},"end":{"line":87,"column":null}}]},"9":{"loc":{"start":{"line":138,"column":20},"end":{"line":138,"column":90}},"type":"binary-expr","locations":[{"start":{"line":138,"column":20},"end":{"line":138,"column":38}},{"start":{"line":138,"column":42},"end":{"line":138,"column":90}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0],"4":[0],"5":[0,0],"6":[0,0],"7":[0],"8":[0],"9":[0,0]}} +,"/Users/zane/playground/cloudsite/src/lib/actions/destroy.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/destroy.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"7":{"start":{"line":11,"column":16},"end":{"line":59,"column":1}},"8":{"start":{"line":12,"column":36},"end":{"line":12,"column":44}},"9":{"start":{"line":14,"column":22},"end":{"line":14,"column":51}},"10":{"start":{"line":15,"column":19},"end":{"line":15,"column":48}},"11":{"start":{"line":18,"column":2},"end":{"line":27,"column":null}},"12":{"start":{"line":19,"column":4},"end":{"line":19,"column":null}},"13":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"14":{"start":{"line":22,"column":4},"end":{"line":26,"column":null}},"15":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"16":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"17":{"start":{"line":29,"column":23},"end":{"line":29,"column":66}},"18":{"start":{"line":30,"column":2},"end":{"line":30,"column":null}},"19":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"20":{"start":{"line":33,"column":31},"end":{"line":33,"column":72}},"21":{"start":{"line":34,"column":29},"end":{"line":34,"column":78}},"22":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"23":{"start":{"line":38,"column":2},"end":{"line":58,"column":null}},"24":{"start":{"line":39,"column":24},"end":{"line":39,"column":109}},"25":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"26":{"start":{"line":42,"column":4},"end":{"line":47,"column":null}},"27":{"start":{"line":43,"column":6},"end":{"line":43,"column":null}},"28":{"start":{"line":44,"column":6},"end":{"line":44,"column":null}},"29":{"start":{"line":45,"column":11},"end":{"line":47,"column":null}},"30":{"start":{"line":46,"column":6},"end":{"line":46,"column":null}},"31":{"start":{"line":50,"column":4},"end":{"line":55,"column":null}},"32":{"start":{"line":51,"column":6},"end":{"line":51,"column":null}},"33":{"start":{"line":52,"column":6},"end":{"line":52,"column":null}},"34":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}},"35":{"start":{"line":57,"column":4},"end":{"line":57,"column":null}},"36":{"start":{"line":59,"column":1},"end":{"line":59,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":16},"end":{"line":11,"column":23}},"loc":{"start":{"line":11,"column":64},"end":{"line":59,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":4},"end":{"line":19,"column":54}},"type":"binary-expr","locations":[{"start":{"line":19,"column":4},"end":{"line":19,"column":20}},{"start":{"line":19,"column":4},"end":{"line":19,"column":20}},{"start":{"line":19,"column":4},"end":{"line":19,"column":54}}]},"1":{"loc":{"start":{"line":22,"column":4},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":26,"column":null}},{"start":{"line":24,"column":11},"end":{"line":26,"column":null}}]},"2":{"loc":{"start":{"line":23,"column":6},"end":{"line":23,"column":56}},"type":"binary-expr","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":22}},{"start":{"line":23,"column":6},"end":{"line":23,"column":22}},{"start":{"line":23,"column":6},"end":{"line":23,"column":56}}]},"3":{"loc":{"start":{"line":40,"column":4},"end":{"line":40,"column":64}},"type":"binary-expr","locations":[{"start":{"line":40,"column":4},"end":{"line":40,"column":20}},{"start":{"line":40,"column":4},"end":{"line":40,"column":20}},{"start":{"line":40,"column":4},"end":{"line":40,"column":64}}]},"4":{"loc":{"start":{"line":42,"column":4},"end":{"line":47,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":47,"column":null}},{"start":{"line":45,"column":11},"end":{"line":47,"column":null}}]},"5":{"loc":{"start":{"line":42,"column":8},"end":{"line":42,"column":71}},"type":"binary-expr","locations":[{"start":{"line":42,"column":8},"end":{"line":42,"column":39}},{"start":{"line":42,"column":43},"end":{"line":42,"column":71}}]},"6":{"loc":{"start":{"line":45,"column":11},"end":{"line":47,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":11},"end":{"line":47,"column":null}}]},"7":{"loc":{"start":{"line":50,"column":4},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":4},"end":{"line":55,"column":null}},{"start":{"line":53,"column":11},"end":{"line":55,"column":null}}]},"8":{"loc":{"start":{"line":57,"column":4},"end":{"line":57,"column":31}},"type":"binary-expr","locations":[{"start":{"line":57,"column":4},"end":{"line":57,"column":20}},{"start":{"line":57,"column":4},"end":{"line":57,"column":20}},{"start":{"line":57,"column":4},"end":{"line":57,"column":31}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0},"f":{"0":0},"b":{"0":[0,0,0],"1":[0,0],"2":[0,0,0],"3":[0,0,0],"4":[0,0],"5":[0,0],"6":[0],"7":[0,0],"8":[0,0,0]}} +,"/Users/zane/playground/cloudsite/src/lib/actions/update.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/update.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":8,"column":15},"end":{"line":32,"column":1}},"6":{"start":{"line":9,"column":16},"end":{"line":9,"column":87}},"7":{"start":{"line":11,"column":22},"end":{"line":11,"column":51}},"8":{"start":{"line":13,"column":18},"end":{"line":13,"column":20}},"9":{"start":{"line":14,"column":2},"end":{"line":17,"column":null}},"10":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"11":{"start":{"line":19,"column":2},"end":{"line":21,"column":null}},"12":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"13":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"14":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"15":{"start":{"line":27,"column":2},"end":{"line":27,"column":null}},"16":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"17":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"18":{"start":{"line":32,"column":1},"end":{"line":32,"column":null}},"19":{"start":{"line":34,"column":24},"end":{"line":51,"column":1}},"20":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"21":{"start":{"line":37,"column":39},"end":{"line":37,"column":47}},"22":{"start":{"line":39,"column":27},"end":{"line":39,"column":64}},"23":{"start":{"line":40,"column":33},"end":{"line":49,"column":4}},"24":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":15},"end":{"line":8,"column":22}},"loc":{"start":{"line":8,"column":111},"end":{"line":32,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":34,"column":24},"end":{"line":34,"column":31}},"loc":{"start":{"line":34,"column":61},"end":{"line":51,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":16},"end":{"line":9,"column":87}},"type":"binary-expr","locations":[{"start":{"line":9,"column":16},"end":{"line":9,"column":39}},{"start":{"line":9,"column":43},"end":{"line":9,"column":62}},{"start":{"line":9,"column":66},"end":{"line":9,"column":87}}]},"1":{"loc":{"start":{"line":14,"column":2},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":17,"column":null}}]},"2":{"loc":{"start":{"line":14,"column":6},"end":{"line":14,"column":42}},"type":"binary-expr","locations":[{"start":{"line":14,"column":6},"end":{"line":14,"column":20}},{"start":{"line":14,"column":24},"end":{"line":14,"column":42}}]},"3":{"loc":{"start":{"line":19,"column":2},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":2},"end":{"line":21,"column":null}}]},"4":{"loc":{"start":{"line":19,"column":6},"end":{"line":19,"column":38}},"type":"binary-expr","locations":[{"start":{"line":19,"column":6},"end":{"line":19,"column":20}},{"start":{"line":19,"column":24},"end":{"line":19,"column":38}}]},"5":{"loc":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":25,"column":null}}]},"6":{"loc":{"start":{"line":23,"column":6},"end":{"line":23,"column":40}},"type":"binary-expr","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":20}},{"start":{"line":23,"column":24},"end":{"line":23,"column":40}}]},"7":{"loc":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":31,"column":null}}]},"8":{"loc":{"start":{"line":29,"column":6},"end":{"line":29,"column":76}},"type":"binary-expr","locations":[{"start":{"line":29,"column":7},"end":{"line":29,"column":21}},{"start":{"line":29,"column":25},"end":{"line":29,"column":43}},{"start":{"line":29,"column":48},"end":{"line":29,"column":76}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0},"f":{"0":0,"1":0},"b":{"0":[0,0,0],"1":[0],"2":[0,0],"3":[0],"4":[0,0],"5":[0],"6":[0,0],"7":[0],"8":[0,0,0]}} +,"/Users/zane/playground/cloudsite/src/lib/actions/verify.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/verify.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"2":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"3":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"4":{"start":{"line":11,"column":26},"end":{"line":11,"column":30}},"5":{"start":{"line":13,"column":15},"end":{"line":34,"column":1}},"6":{"start":{"line":14,"column":19},"end":{"line":14,"column":102}},"7":{"start":{"line":16,"column":2},"end":{"line":18,"column":null}},"8":{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},"9":{"start":{"line":20,"column":17},"end":{"line":20,"column":19}},"10":{"start":{"line":21,"column":2},"end":{"line":23,"column":null}},"11":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"12":{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},"13":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"14":{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},"15":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"16":{"start":{"line":31,"column":18},"end":{"line":31,"column":43}},"17":{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},"18":{"start":{"line":33,"column":42},"end":{"line":33,"column":62}},"19":{"start":{"line":33,"column":62},"end":{"line":33,"column":73}},"20":{"start":{"line":34,"column":1},"end":{"line":34,"column":null}},"21":{"start":{"line":36,"column":23},"end":{"line":73,"column":1}},"22":{"start":{"line":37,"column":2},"end":{"line":39,"column":null}},"23":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"24":{"start":{"line":40,"column":37},"end":{"line":40,"column":45}},"25":{"start":{"line":42,"column":19},"end":{"line":42,"column":48}},"26":{"start":{"line":43,"column":19},"end":{"line":43,"column":58}},"27":{"start":{"line":45,"column":22},"end":{"line":45,"column":70}},"28":{"start":{"line":46,"column":2},"end":{"line":72,"column":null}},"29":{"start":{"line":47,"column":23},"end":{"line":47,"column":86}},"30":{"start":{"line":49,"column":25},"end":{"line":49,"column":50}},"31":{"start":{"line":50,"column":25},"end":{"line":50,"column":50}},"32":{"start":{"line":51,"column":25},"end":{"line":51,"column":50}},"33":{"start":{"line":52,"column":20},"end":{"line":52,"column":69}},"34":{"start":{"line":53,"column":4},"end":{"line":60,"column":null}},"35":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}},"36":{"start":{"line":55,"column":6},"end":{"line":55,"column":null}},"37":{"start":{"line":57,"column":6},"end":{"line":57,"column":null}},"38":{"start":{"line":58,"column":6},"end":{"line":59,"column":null}},"39":{"start":{"line":62,"column":4},"end":{"line":62,"column":null}},"40":{"start":{"line":64,"column":4},"end":{"line":64,"column":null}},"41":{"start":{"line":65,"column":4},"end":{"line":65,"column":null}},"42":{"start":{"line":67,"column":4},"end":{"line":67,"column":null}},"43":{"start":{"line":69,"column":4},"end":{"line":71,"column":null}},"44":{"start":{"line":70,"column":6},"end":{"line":70,"column":null}},"45":{"start":{"line":75,"column":22},"end":{"line":103,"column":1}},"46":{"start":{"line":76,"column":2},"end":{"line":78,"column":null}},"47":{"start":{"line":77,"column":4},"end":{"line":77,"column":null}},"48":{"start":{"line":79,"column":25},"end":{"line":79,"column":33}},"49":{"start":{"line":81,"column":2},"end":{"line":102,"column":null}},"50":{"start":{"line":82,"column":27},"end":{"line":85,"column":6}},"51":{"start":{"line":87,"column":20},"end":{"line":89,"column":null}},"52":{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},"53":{"start":{"line":94,"column":4},"end":{"line":97,"column":null}},"54":{"start":{"line":99,"column":4},"end":{"line":101,"column":null}},"55":{"start":{"line":100,"column":6},"end":{"line":100,"column":null}},"56":{"start":{"line":105,"column":21},"end":{"line":164,"column":1}},"57":{"start":{"line":106,"column":2},"end":{"line":108,"column":null}},"58":{"start":{"line":107,"column":4},"end":{"line":107,"column":null}},"59":{"start":{"line":110,"column":22},"end":{"line":110,"column":53}},"60":{"start":{"line":112,"column":2},"end":{"line":161,"column":null}},"61":{"start":{"line":113,"column":26},"end":{"line":113,"column":34}},"62":{"start":{"line":114,"column":21},"end":{"line":114,"column":62}},"63":{"start":{"line":115,"column":31},"end":{"line":115,"column":85}},"64":{"start":{"line":116,"column":34},"end":{"line":116,"column":97}},"65":{"start":{"line":118,"column":47},"end":{"line":120,"column":6}},"66":{"start":{"line":123,"column":4},"end":{"line":131,"column":null}},"67":{"start":{"line":124,"column":6},"end":{"line":126,"column":null}},"68":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"69":{"start":{"line":127,"column":6},"end":{"line":127,"column":null}},"70":{"start":{"line":127,"column":35},"end":{"line":127,"column":73}},"71":{"start":{"line":129,"column":6},"end":{"line":129,"column":null}},"72":{"start":{"line":130,"column":6},"end":{"line":130,"column":null}},"73":{"start":{"line":133,"column":29},"end":{"line":133,"column":72}},"74":{"start":{"line":134,"column":4},"end":{"line":153,"column":null}},"75":{"start":{"line":135,"column":6},"end":{"line":135,"column":null}},"76":{"start":{"line":136,"column":6},"end":{"line":139,"column":null}},"77":{"start":{"line":140,"column":11},"end":{"line":153,"column":null}},"78":{"start":{"line":141,"column":6},"end":{"line":141,"column":null}},"79":{"start":{"line":142,"column":6},"end":{"line":142,"column":null}},"80":{"start":{"line":143,"column":11},"end":{"line":153,"column":null}},"81":{"start":{"line":144,"column":6},"end":{"line":144,"column":null}},"82":{"start":{"line":145,"column":6},"end":{"line":145,"column":null}},"83":{"start":{"line":146,"column":11},"end":{"line":153,"column":null}},"84":{"start":{"line":147,"column":6},"end":{"line":147,"column":null}},"85":{"start":{"line":148,"column":6},"end":{"line":149,"column":null}},"86":{"start":{"line":151,"column":6},"end":{"line":151,"column":null}},"87":{"start":{"line":152,"column":6},"end":{"line":152,"column":null}},"88":{"start":{"line":155,"column":4},"end":{"line":155,"column":null}},"89":{"start":{"line":156,"column":4},"end":{"line":156,"column":null}},"90":{"start":{"line":158,"column":4},"end":{"line":160,"column":null}},"91":{"start":{"line":159,"column":6},"end":{"line":159,"column":null}},"92":{"start":{"line":163,"column":2},"end":{"line":163,"column":null}},"93":{"start":{"line":166,"column":28},"end":{"line":179,"column":1}},"94":{"start":{"line":167,"column":17},"end":{"line":170,"column":3}},"95":{"start":{"line":172,"column":2},"end":{"line":176,"column":null}},"96":{"start":{"line":173,"column":4},"end":{"line":173,"column":null}},"97":{"start":{"line":175,"column":4},"end":{"line":175,"column":null}},"98":{"start":{"line":178,"column":2},"end":{"line":178,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":13,"column":15},"end":{"line":13,"column":22}},"loc":{"start":{"line":13,"column":109},"end":{"line":34,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":33,"column":24},"end":{"line":33,"column":25}},"loc":{"start":{"line":33,"column":40},"end":{"line":33,"column":74}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":36,"column":23},"end":{"line":36,"column":30}},"loc":{"start":{"line":36,"column":76},"end":{"line":73,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":75,"column":22},"end":{"line":75,"column":29}},"loc":{"start":{"line":75,"column":62},"end":{"line":103,"column":1}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":105,"column":21},"end":{"line":105,"column":28}},"loc":{"start":{"line":105,"column":74},"end":{"line":164,"column":1}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":127,"column":24},"end":{"line":127,"column":31}},"loc":{"start":{"line":127,"column":35},"end":{"line":127,"column":73}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":166,"column":28},"end":{"line":166,"column":29}},"loc":{"start":{"line":166,"column":59},"end":{"line":179,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":19},"end":{"line":14,"column":102}},"type":"binary-expr","locations":[{"start":{"line":14,"column":19},"end":{"line":14,"column":45}},{"start":{"line":14,"column":49},"end":{"line":14,"column":74}},{"start":{"line":14,"column":78},"end":{"line":14,"column":102}}]},"1":{"loc":{"start":{"line":16,"column":2},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":2},"end":{"line":18,"column":null}}]},"2":{"loc":{"start":{"line":16,"column":6},"end":{"line":16,"column":44}},"type":"binary-expr","locations":[{"start":{"line":16,"column":6},"end":{"line":16,"column":14}},{"start":{"line":16,"column":18},"end":{"line":16,"column":30}},{"start":{"line":16,"column":34},"end":{"line":16,"column":44}}]},"3":{"loc":{"start":{"line":21,"column":2},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":23,"column":null}}]},"4":{"loc":{"start":{"line":21,"column":6},"end":{"line":21,"column":29}},"type":"binary-expr","locations":[{"start":{"line":21,"column":6},"end":{"line":21,"column":14}},{"start":{"line":21,"column":18},"end":{"line":21,"column":29}}]},"5":{"loc":{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":26,"column":null}}]},"6":{"loc":{"start":{"line":24,"column":6},"end":{"line":24,"column":30}},"type":"binary-expr","locations":[{"start":{"line":24,"column":6},"end":{"line":24,"column":14}},{"start":{"line":24,"column":18},"end":{"line":24,"column":30}}]},"7":{"loc":{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":29,"column":null}}]},"8":{"loc":{"start":{"line":27,"column":6},"end":{"line":27,"column":28}},"type":"binary-expr","locations":[{"start":{"line":27,"column":6},"end":{"line":27,"column":14}},{"start":{"line":27,"column":18},"end":{"line":27,"column":28}}]},"9":{"loc":{"start":{"line":37,"column":2},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":39,"column":null}}]},"10":{"loc":{"start":{"line":53,"column":4},"end":{"line":60,"column":null}},"type":"if","locations":[{"start":{"line":53,"column":4},"end":{"line":60,"column":null}},{"start":{"line":56,"column":11},"end":{"line":60,"column":null}}]},"11":{"loc":{"start":{"line":69,"column":4},"end":{"line":71,"column":null}},"type":"if","locations":[{"start":{"line":69,"column":4},"end":{"line":71,"column":null}}]},"12":{"loc":{"start":{"line":76,"column":2},"end":{"line":78,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":2},"end":{"line":78,"column":null}}]},"13":{"loc":{"start":{"line":99,"column":4},"end":{"line":101,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":101,"column":null}}]},"14":{"loc":{"start":{"line":106,"column":2},"end":{"line":108,"column":null}},"type":"if","locations":[{"start":{"line":106,"column":2},"end":{"line":108,"column":null}}]},"15":{"loc":{"start":{"line":124,"column":6},"end":{"line":126,"column":null}},"type":"if","locations":[{"start":{"line":124,"column":6},"end":{"line":126,"column":null}}]},"16":{"loc":{"start":{"line":134,"column":4},"end":{"line":153,"column":null}},"type":"if","locations":[{"start":{"line":134,"column":4},"end":{"line":153,"column":null}},{"start":{"line":140,"column":11},"end":{"line":153,"column":null}}]},"17":{"loc":{"start":{"line":136,"column":29},"end":{"line":138,"column":35}},"type":"cond-expr","locations":[{"start":{"line":137,"column":10},"end":{"line":137,"column":43}},{"start":{"line":138,"column":10},"end":{"line":138,"column":35}}]},"18":{"loc":{"start":{"line":140,"column":11},"end":{"line":153,"column":null}},"type":"if","locations":[{"start":{"line":140,"column":11},"end":{"line":153,"column":null}},{"start":{"line":143,"column":11},"end":{"line":153,"column":null}}]},"19":{"loc":{"start":{"line":143,"column":11},"end":{"line":153,"column":null}},"type":"if","locations":[{"start":{"line":143,"column":11},"end":{"line":153,"column":null}},{"start":{"line":146,"column":11},"end":{"line":153,"column":null}}]},"20":{"loc":{"start":{"line":146,"column":11},"end":{"line":153,"column":null}},"type":"if","locations":[{"start":{"line":146,"column":11},"end":{"line":153,"column":null}},{"start":{"line":150,"column":11},"end":{"line":153,"column":null}}]},"21":{"loc":{"start":{"line":158,"column":4},"end":{"line":160,"column":null}},"type":"if","locations":[{"start":{"line":158,"column":4},"end":{"line":160,"column":null}}]},"22":{"loc":{"start":{"line":172,"column":2},"end":{"line":176,"column":null}},"type":"if","locations":[{"start":{"line":172,"column":2},"end":{"line":176,"column":null}},{"start":{"line":174,"column":9},"end":{"line":176,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0,0,0],"1":[0],"2":[0,0,0],"3":[0],"4":[0,0],"5":[0],"6":[0,0],"7":[0],"8":[0,0],"9":[0],"10":[0,0],"11":[0],"12":[0],"13":[0],"14":[0],"15":[0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0],"22":[0,0]}} +,"/Users/zane/playground/cloudsite/src/lib/actions/lib/create-or-update-dns-records.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/lib/create-or-update-dns-records.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":33},"end":{"line":38,"column":1}},"3":{"start":{"line":5,"column":59},"end":{"line":5,"column":67}},"4":{"start":{"line":7,"column":27},"end":{"line":7,"column":72}},"5":{"start":{"line":8,"column":33},"end":{"line":8,"column":94}},"6":{"start":{"line":9,"column":31},"end":{"line":9,"column":82}},"7":{"start":{"line":10,"column":33},"end":{"line":10,"column":77}},"8":{"start":{"line":12,"column":24},"end":{"line":12,"column":66}},"9":{"start":{"line":14,"column":23},"end":{"line":14,"column":73}},"10":{"start":{"line":16,"column":18},"end":{"line":16,"column":51}},"11":{"start":{"line":18,"column":41},"end":{"line":35,"column":4}},"12":{"start":{"line":22,"column":39},"end":{"line":33,"column":7}},"13":{"start":{"line":36,"column":2},"end":{"line":36,"column":null}},"14":{"start":{"line":37,"column":2},"end":{"line":37,"column":null}},"15":{"start":{"line":38,"column":1},"end":{"line":38,"column":null}},"16":{"start":{"line":40,"column":24},"end":{"line":53,"column":1}},"17":{"start":{"line":41,"column":33},"end":{"line":41,"column":85}},"18":{"start":{"line":42,"column":34},"end":{"line":42,"column":82}},"19":{"start":{"line":44,"column":2},"end":{"line":48,"column":null}},"20":{"start":{"line":45,"column":4},"end":{"line":47,"column":null}},"21":{"start":{"line":46,"column":6},"end":{"line":46,"column":47}},"22":{"start":{"line":50,"column":2},"end":{"line":52,"column":null}},"23":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":33},"end":{"line":4,"column":40}},"loc":{"start":{"line":4,"column":70},"end":{"line":38,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":22,"column":29},"end":{"line":22,"column":33}},"loc":{"start":{"line":22,"column":39},"end":{"line":33,"column":7}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":40,"column":24},"end":{"line":40,"column":31}},"loc":{"start":{"line":40,"column":76},"end":{"line":53,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":45,"column":4},"end":{"line":47,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":4},"end":{"line":47,"column":null}}]},"1":{"loc":{"start":{"line":50,"column":2},"end":{"line":52,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":2},"end":{"line":52,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0]}} +,"/Users/zane/playground/cloudsite/src/lib/actions/lib/get-credentials.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/lib/get-credentials.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":23},"end":{"line":26,"column":1}},"2":{"start":{"line":4,"column":2},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":22},"end":{"line":23,"column":4}},"4":{"start":{"line":25,"column":2},"end":{"line":25,"column":null}},"5":{"start":{"line":26,"column":1},"end":{"line":26,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":23},"end":{"line":3,"column":24}},"loc":{"start":{"line":3,"column":43},"end":{"line":26,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":15},"end":{"line":4,"column":65}},"type":"binary-expr","locations":[{"start":{"line":4,"column":15},"end":{"line":4,"column":25}},{"start":{"line":4,"column":29},"end":{"line":4,"column":52}},{"start":{"line":4,"column":56},"end":{"line":4,"column":65}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"f":{"0":0},"b":{"0":[0,0,0]}} +,"/Users/zane/playground/cloudsite/src/lib/actions/lib/sync-site-content.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/lib/sync-site-content.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":45}},"6":{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},"7":{"start":{"line":9,"column":24},"end":{"line":32,"column":1}},"8":{"start":{"line":10,"column":49},"end":{"line":10,"column":57}},"9":{"start":{"line":12,"column":2},"end":{"line":20,"column":null}},"10":{"start":{"line":13,"column":24},"end":{"line":13,"column":56}},"11":{"start":{"line":14,"column":24},"end":{"line":14,"column":64}},"12":{"start":{"line":15,"column":4},"end":{"line":19,"column":null}},"13":{"start":{"line":16,"column":6},"end":{"line":16,"column":null}},"14":{"start":{"line":17,"column":6},"end":{"line":17,"column":null}},"15":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"16":{"start":{"line":22,"column":2},"end":{"line":22,"column":null}},"17":{"start":{"line":24,"column":19},"end":{"line":24,"column":48}},"18":{"start":{"line":25,"column":19},"end":{"line":25,"column":58}},"19":{"start":{"line":27,"column":2},"end":{"line":31,"column":null}},"20":{"start":{"line":28,"column":41},"end":{"line":28,"column":111}},"21":{"start":{"line":32,"column":1},"end":{"line":32,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},"loc":{"start":{"line":7,"column":45},"end":{"line":7,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":9,"column":24},"end":{"line":9,"column":31}},"loc":{"start":{"line":9,"column":70},"end":{"line":32,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":28,"column":30},"end":{"line":28,"column":35}},"loc":{"start":{"line":28,"column":41},"end":{"line":28,"column":111}}}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},"type":"if","locations":[{"start":{"line":7,"column":45},"end":{"line":7,"column":null}}]},"1":{"loc":{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},"type":"cond-expr","locations":[{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},{"start":{"line":7,"column":45},"end":{"line":7,"column":null}}]},"2":{"loc":{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},"type":"binary-expr","locations":[{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},{"start":{"line":7,"column":45},"end":{"line":7,"column":null}}]},"3":{"loc":{"start":{"line":12,"column":2},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":2},"end":{"line":20,"column":null}}]},"4":{"loc":{"start":{"line":12,"column":6},"end":{"line":12,"column":53}},"type":"binary-expr","locations":[{"start":{"line":12,"column":6},"end":{"line":12,"column":22}},{"start":{"line":12,"column":26},"end":{"line":12,"column":53}}]},"5":{"loc":{"start":{"line":15,"column":4},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":4},"end":{"line":19,"column":null}}]},"6":{"loc":{"start":{"line":28,"column":57},"end":{"line":28,"column":110}},"type":"binary-expr","locations":[{"start":{"line":28,"column":57},"end":{"line":28,"column":79}},{"start":{"line":28,"column":83},"end":{"line":28,"column":110}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0],"4":[0,0],"5":[0],"6":[0,0]}} +,"/Users/zane/playground/cloudsite/src/lib/actions/lib/track-stack-status.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/lib/track-stack-status.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":26},"end":{"line":3,"column":30}},"2":{"start":{"line":5,"column":25},"end":{"line":40,"column":1}},"3":{"start":{"line":7,"column":2},"end":{"line":26,"column":null}},"4":{"start":{"line":8,"column":26},"end":{"line":8,"column":51}},"5":{"start":{"line":9,"column":28},"end":{"line":9,"column":68}},"6":{"start":{"line":10,"column":29},"end":{"line":10,"column":77}},"7":{"start":{"line":12,"column":4},"end":{"line":12,"column":null}},"8":{"start":{"line":14,"column":4},"end":{"line":22,"column":null}},"9":{"start":{"line":15,"column":6},"end":{"line":15,"column":null}},"10":{"start":{"line":16,"column":11},"end":{"line":22,"column":null}},"11":{"start":{"line":17,"column":6},"end":{"line":17,"column":null}},"12":{"start":{"line":18,"column":11},"end":{"line":22,"column":null}},"13":{"start":{"line":19,"column":6},"end":{"line":19,"column":null}},"14":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"15":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"16":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"17":{"start":{"line":25,"column":33},"end":{"line":25,"column":71}},"18":{"start":{"line":28,"column":2},"end":{"line":37,"column":null}},"19":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"20":{"start":{"line":30,"column":24},"end":{"line":30,"column":49}},"21":{"start":{"line":31,"column":26},"end":{"line":31,"column":61}},"22":{"start":{"line":32,"column":4},"end":{"line":32,"column":null}},"23":{"start":{"line":34,"column":4},"end":{"line":34,"column":null}},"24":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"25":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"26":{"start":{"line":40,"column":1},"end":{"line":40,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":25},"end":{"line":5,"column":32}},"loc":{"start":{"line":5,"column":91},"end":{"line":40,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":25,"column":22},"end":{"line":25,"column":29}},"loc":{"start":{"line":25,"column":33},"end":{"line":25,"column":71}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":4},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":4},"end":{"line":22,"column":null}},{"start":{"line":16,"column":11},"end":{"line":22,"column":null}}]},"1":{"loc":{"start":{"line":14,"column":8},"end":{"line":14,"column":76}},"type":"binary-expr","locations":[{"start":{"line":14,"column":8},"end":{"line":14,"column":44}},{"start":{"line":14,"column":48},"end":{"line":14,"column":76}}]},"2":{"loc":{"start":{"line":16,"column":11},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":11},"end":{"line":22,"column":null}},{"start":{"line":18,"column":11},"end":{"line":22,"column":null}}]},"3":{"loc":{"start":{"line":16,"column":15},"end":{"line":16,"column":83}},"type":"binary-expr","locations":[{"start":{"line":16,"column":15},"end":{"line":16,"column":51}},{"start":{"line":16,"column":55},"end":{"line":16,"column":83}}]},"4":{"loc":{"start":{"line":18,"column":11},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":11},"end":{"line":22,"column":null}},{"start":{"line":20,"column":11},"end":{"line":22,"column":null}}]},"5":{"loc":{"start":{"line":18,"column":15},"end":{"line":18,"column":98}},"type":"binary-expr","locations":[{"start":{"line":18,"column":15},"end":{"line":18,"column":53}},{"start":{"line":18,"column":57},"end":{"line":18,"column":98}}]},"6":{"loc":{"start":{"line":28,"column":2},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":37,"column":null}},{"start":{"line":35,"column":9},"end":{"line":37,"column":null}}]},"7":{"loc":{"start":{"line":28,"column":6},"end":{"line":28,"column":71}},"type":"binary-expr","locations":[{"start":{"line":28,"column":6},"end":{"line":28,"column":41}},{"start":{"line":28,"column":45},"end":{"line":28,"column":71}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0]}} +,"/Users/zane/playground/cloudsite/src/lib/actions/lib/update-site-info.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/lib/update-site-info.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":23},"end":{"line":13,"column":1}},"2":{"start":{"line":4,"column":32},"end":{"line":4,"column":40}},"3":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":31},"end":{"line":6,"column":80}},"5":{"start":{"line":7,"column":26},"end":{"line":7,"column":78}},"6":{"start":{"line":8,"column":27},"end":{"line":8,"column":75}},"7":{"start":{"line":9,"column":35},"end":{"line":10,"column":102}},"8":{"start":{"line":10,"column":47},"end":{"line":10,"column":89}},"9":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"10":{"start":{"line":13,"column":1},"end":{"line":13,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":23},"end":{"line":3,"column":30}},"loc":{"start":{"line":3,"column":60},"end":{"line":13,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":28},"end":{"line":10,"column":29}},"loc":{"start":{"line":10,"column":47},"end":{"line":10,"column":89}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"f":{"0":0,"1":0},"b":{}} +,"/Users/zane/playground/cloudsite/src/lib/actions/lib/update-stack.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/lib/update-stack.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":51}},"6":{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},"7":{"start":{"line":9,"column":20},"end":{"line":59,"column":1}},"8":{"start":{"line":10,"column":32},"end":{"line":10,"column":40}},"9":{"start":{"line":12,"column":23},"end":{"line":12,"column":66}},"10":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"11":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"12":{"start":{"line":16,"column":22},"end":{"line":16,"column":43}},"13":{"start":{"line":18,"column":31},"end":{"line":18,"column":80}},"14":{"start":{"line":19,"column":29},"end":{"line":22,"column":4}},"15":{"start":{"line":23,"column":30},"end":{"line":23,"column":81}},"16":{"start":{"line":24,"column":26},"end":{"line":24,"column":58}},"17":{"start":{"line":26,"column":2},"end":{"line":29,"column":null}},"18":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"19":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"20":{"start":{"line":32,"column":29},"end":{"line":38,"column":4}},"21":{"start":{"line":40,"column":2},"end":{"line":40,"column":null}},"22":{"start":{"line":42,"column":2},"end":{"line":42,"column":null}},"23":{"start":{"line":44,"column":2},"end":{"line":44,"column":50}},"24":{"start":{"line":46,"column":29},"end":{"line":49,"column":71}},"25":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"26":{"start":{"line":49,"column":39},"end":{"line":49,"column":70}},"27":{"start":{"line":51,"column":2},"end":{"line":56,"column":null}},"28":{"start":{"line":52,"column":4},"end":{"line":55,"column":null}},"29":{"start":{"line":54,"column":8},"end":{"line":54,"column":76}},"30":{"start":{"line":58,"column":2},"end":{"line":58,"column":null}},"31":{"start":{"line":59,"column":1},"end":{"line":59,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},"loc":{"start":{"line":7,"column":51},"end":{"line":7,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":9,"column":20},"end":{"line":9,"column":27}},"loc":{"start":{"line":9,"column":57},"end":{"line":59,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":46,"column":77},"end":{"line":46,"column":86}},"loc":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}}},"3":{"name":"(anonymous_5)","decl":{"start":{"line":49,"column":12},"end":{"line":49,"column":13}},"loc":{"start":{"line":49,"column":39},"end":{"line":49,"column":70}}},"4":{"name":"(anonymous_6)","decl":{"start":{"line":53,"column":33},"end":{"line":53,"column":34}},"loc":{"start":{"line":54,"column":8},"end":{"line":54,"column":76}}}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},"type":"if","locations":[{"start":{"line":7,"column":51},"end":{"line":7,"column":null}}]},"1":{"loc":{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},"type":"cond-expr","locations":[{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},{"start":{"line":7,"column":51},"end":{"line":7,"column":null}}]},"2":{"loc":{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},"type":"binary-expr","locations":[{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},{"start":{"line":7,"column":51},"end":{"line":7,"column":null}}]},"3":{"loc":{"start":{"line":26,"column":2},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":2},"end":{"line":29,"column":null}}]},"4":{"loc":{"start":{"line":46,"column":41},"end":{"line":46,"column":70}},"type":"binary-expr","locations":[{"start":{"line":46,"column":41},"end":{"line":46,"column":64}},{"start":{"line":46,"column":68},"end":{"line":46,"column":70}}]},"5":{"loc":{"start":{"line":51,"column":2},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":51,"column":2},"end":{"line":56,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0],"4":[0,0],"5":[0]}} +,"/Users/zane/playground/cloudsite/src/lib/plugins/access-logs.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/access-logs.mjs","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":3,"column":1}},"1":{"start":{"line":2,"column":50},"end":{"line":2,"column":73}},"2":{"start":{"line":5,"column":16},"end":{"line":7,"column":1}},"3":{"start":{"line":6,"column":2},"end":{"line":6,"column":null}},"4":{"start":{"line":9,"column":16},"end":{"line":9,"column":38}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":44},"end":{"line":2,"column":45}},"loc":{"start":{"line":2,"column":50},"end":{"line":2,"column":73}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":5,"column":16},"end":{"line":5,"column":22}},"loc":{"start":{"line":5,"column":22},"end":{"line":7,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{"0":0,"1":0},"b":{}} +,"/Users/zane/playground/cloudsite/src/lib/plugins/cloudfront-logs.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/cloudfront-logs.mjs","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":5,"column":1}},"1":{"start":{"line":3,"column":60},"end":{"line":3,"column":83}},"2":{"start":{"line":7,"column":31},"end":{"line":9,"column":1}},"3":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"4":{"start":{"line":11,"column":20},"end":{"line":21,"column":1}},"5":{"start":{"line":12,"column":28},"end":{"line":12,"column":40}},"6":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"7":{"start":{"line":16,"column":2},"end":{"line":20,"column":null}},"8":{"start":{"line":23,"column":20},"end":{"line":23,"column":70}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":54},"end":{"line":3,"column":55}},"loc":{"start":{"line":3,"column":60},"end":{"line":3,"column":83}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":31},"end":{"line":7,"column":38}},"loc":{"start":{"line":7,"column":59},"end":{"line":9,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":11,"column":20},"end":{"line":11,"column":27}},"loc":{"start":{"line":11,"column":58},"end":{"line":21,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"f":{"0":0,"1":0,"2":0},"b":{}} +,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/constants.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/constants.mjs","statementMap":{"0":{"start":{"line":1,"column":37},"end":{"line":1,"column":68}},"1":{"start":{"line":2,"column":37},"end":{"line":2,"column":68}},"2":{"start":{"line":3,"column":36},"end":{"line":3,"column":66}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0},"f":{},"b":{}} +,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"3":{"start":{"line":7,"column":36},"end":{"line":32,"column":1}},"4":{"start":{"line":8,"column":23},"end":{"line":8,"column":35}},"5":{"start":{"line":9,"column":21},"end":{"line":9,"column":29}},"6":{"start":{"line":10,"column":20},"end":{"line":10,"column":28}},"7":{"start":{"line":12,"column":23},"end":{"line":12,"column":64}},"8":{"start":{"line":13,"column":2},"end":{"line":31,"column":null}},"9":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"10":{"start":{"line":15,"column":31},"end":{"line":15,"column":85}},"11":{"start":{"line":16,"column":4},"end":{"line":26,"column":null}},"12":{"start":{"line":17,"column":6},"end":{"line":17,"column":null}},"13":{"start":{"line":19,"column":6},"end":{"line":25,"column":null}},"14":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"15":{"start":{"line":21,"column":8},"end":{"line":21,"column":null}},"16":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"17":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"18":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"19":{"start":{"line":28,"column":21},"end":{"line":28,"column":41}},"20":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"21":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"22":{"start":{"line":32,"column":1},"end":{"line":32,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":36},"end":{"line":7,"column":43}},"loc":{"start":{"line":7,"column":87},"end":{"line":32,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":4},"end":{"line":14,"column":89}},"type":"binary-expr","locations":[{"start":{"line":14,"column":4},"end":{"line":14,"column":20}},{"start":{"line":14,"column":4},"end":{"line":14,"column":20}},{"start":{"line":14,"column":4},"end":{"line":14,"column":89}}]},"1":{"loc":{"start":{"line":19,"column":6},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":6},"end":{"line":25,"column":null}},{"start":{"line":22,"column":13},"end":{"line":25,"column":null}}]},"2":{"loc":{"start":{"line":19,"column":10},"end":{"line":19,"column":70}},"type":"binary-expr","locations":[{"start":{"line":19,"column":10},"end":{"line":19,"column":31}},{"start":{"line":19,"column":35},"end":{"line":19,"column":70}}]},"3":{"loc":{"start":{"line":19,"column":35},"end":{"line":19,"column":62}},"type":"cond-expr","locations":[{"start":{"line":19,"column":46},"end":{"line":19,"column":48}},{"start":{"line":19,"column":35},"end":{"line":19,"column":62}}]},"4":{"loc":{"start":{"line":19,"column":35},"end":{"line":19,"column":48}},"type":"binary-expr","locations":[{"start":{"line":19,"column":35},"end":{"line":19,"column":48}},{"start":{"line":19,"column":46},"end":{"line":19,"column":48}}]},"5":{"loc":{"start":{"line":20,"column":8},"end":{"line":20,"column":39}},"type":"binary-expr","locations":[{"start":{"line":20,"column":8},"end":{"line":20,"column":24}},{"start":{"line":20,"column":8},"end":{"line":20,"column":24}},{"start":{"line":20,"column":8},"end":{"line":20,"column":39}}]},"6":{"loc":{"start":{"line":23,"column":8},"end":{"line":23,"column":35}},"type":"binary-expr","locations":[{"start":{"line":23,"column":8},"end":{"line":23,"column":24}},{"start":{"line":23,"column":8},"end":{"line":23,"column":24}},{"start":{"line":23,"column":8},"end":{"line":23,"column":35}}]},"7":{"loc":{"start":{"line":27,"column":4},"end":{"line":27,"column":39}},"type":"binary-expr","locations":[{"start":{"line":27,"column":4},"end":{"line":27,"column":20}},{"start":{"line":27,"column":4},"end":{"line":27,"column":20}},{"start":{"line":27,"column":4},"end":{"line":27,"column":39}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0},"f":{"0":0},"b":{"0":[0,0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0,0],"6":[0,0,0],"7":[0,0,0]}} +,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-contact-emailer.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-contact-emailer.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":28},"end":{"line":116,"column":1}},"3":{"start":{"line":5,"column":28},"end":{"line":5,"column":40}},"4":{"start":{"line":6,"column":34},"end":{"line":6,"column":52}},"5":{"start":{"line":7,"column":36},"end":{"line":7,"column":52}},"6":{"start":{"line":9,"column":2},"end":{"line":11,"column":null}},"7":{"start":{"line":10,"column":4},"end":{"line":10,"column":null}},"8":{"start":{"line":14,"column":2},"end":{"line":16,"column":null}},"9":{"start":{"line":18,"column":30},"end":{"line":22,"column":4}},"10":{"start":{"line":23,"column":38},"end":{"line":23,"column":57}},"11":{"start":{"line":25,"column":2},"end":{"line":32,"column":null}},"12":{"start":{"line":34,"column":2},"end":{"line":72,"column":null}},"13":{"start":{"line":74,"column":2},"end":{"line":100,"column":null}},"14":{"start":{"line":102,"column":2},"end":{"line":110,"column":null}},"15":{"start":{"line":112,"column":2},"end":{"line":115,"column":null}},"16":{"start":{"line":113,"column":4},"end":{"line":114,"column":null}},"17":{"start":{"line":116,"column":1},"end":{"line":116,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":28},"end":{"line":4,"column":35}},"loc":{"start":{"line":4,"column":106},"end":{"line":116,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":null}}]},"1":{"loc":{"start":{"line":9,"column":6},"end":{"line":9,"column":86}},"type":"binary-expr","locations":[{"start":{"line":9,"column":6},"end":{"line":9,"column":43}},{"start":{"line":9,"column":47},"end":{"line":9,"column":86}}]},"2":{"loc":{"start":{"line":112,"column":2},"end":{"line":115,"column":null}},"type":"if","locations":[{"start":{"line":112,"column":2},"end":{"line":115,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"f":{"0":0},"b":{"0":[0],"1":[0,0],"2":[0]}} +,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-contact-form-table.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-contact-form-table.mjs","statementMap":{"0":{"start":{"line":1,"column":30},"end":{"line":23,"column":1}},"1":{"start":{"line":2,"column":43},"end":{"line":2,"column":55}},"2":{"start":{"line":3,"column":25},"end":{"line":3,"column":33}},"3":{"start":{"line":5,"column":2},"end":{"line":19,"column":null}},"4":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}},"5":{"start":{"line":22,"column":2},"end":{"line":22,"column":null}},"6":{"start":{"line":23,"column":1},"end":{"line":23,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":30},"end":{"line":1,"column":31}},"loc":{"start":{"line":1,"column":62},"end":{"line":23,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"f":{"0":0},"b":{}} +,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-contact-handler.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-contact-handler.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":28},"end":{"line":121,"column":1}},"3":{"start":{"line":5,"column":36},"end":{"line":5,"column":44}},"4":{"start":{"line":6,"column":43},"end":{"line":6,"column":55}},"5":{"start":{"line":8,"column":37},"end":{"line":12,"column":4}},"6":{"start":{"line":14,"column":37},"end":{"line":14,"column":63}},"7":{"start":{"line":15,"column":35},"end":{"line":15,"column":61}},"8":{"start":{"line":17,"column":2},"end":{"line":49,"column":null}},"9":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}},"10":{"start":{"line":51,"column":2},"end":{"line":51,"column":null}},"11":{"start":{"line":53,"column":2},"end":{"line":60,"column":null}},"12":{"start":{"line":62,"column":2},"end":{"line":87,"column":null}},"13":{"start":{"line":88,"column":2},"end":{"line":88,"column":null}},"14":{"start":{"line":89,"column":2},"end":{"line":89,"column":null}},"15":{"start":{"line":91,"column":2},"end":{"line":103,"column":null}},"16":{"start":{"line":105,"column":2},"end":{"line":118,"column":null}},"17":{"start":{"line":119,"column":2},"end":{"line":119,"column":null}},"18":{"start":{"line":120,"column":2},"end":{"line":120,"column":null}},"19":{"start":{"line":121,"column":1},"end":{"line":121,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":28},"end":{"line":4,"column":35}},"loc":{"start":{"line":4,"column":106},"end":{"line":121,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},"f":{"0":0},"b":{}} +,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-request-signer.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-request-signer.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":27},"end":{"line":87,"column":1}},"3":{"start":{"line":5,"column":28},"end":{"line":5,"column":40}},"4":{"start":{"line":7,"column":2},"end":{"line":40,"column":null}},"5":{"start":{"line":42,"column":34},"end":{"line":46,"column":4}},"6":{"start":{"line":48,"column":2},"end":{"line":55,"column":null}},"7":{"start":{"line":57,"column":2},"end":{"line":78,"column":null}},"8":{"start":{"line":80,"column":2},"end":{"line":86,"column":null}},"9":{"start":{"line":87,"column":1},"end":{"line":87,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":27},"end":{"line":4,"column":34}},"loc":{"start":{"line":4,"column":95},"end":{"line":87,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"f":{"0":0},"b":{}} +,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":20,"column":36},"end":{"line":63,"column":1}},"7":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}},"8":{"start":{"line":23,"column":34},"end":{"line":23,"column":42}},"9":{"start":{"line":24,"column":33},"end":{"line":24,"column":41}},"10":{"start":{"line":26,"column":19},"end":{"line":26,"column":56}},"11":{"start":{"line":28,"column":2},"end":{"line":44,"column":null}},"12":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"13":{"start":{"line":30,"column":4},"end":{"line":37,"column":null}},"14":{"start":{"line":39,"column":32},"end":{"line":42,"column":6}},"15":{"start":{"line":43,"column":4},"end":{"line":43,"column":null}},"16":{"start":{"line":45,"column":2},"end":{"line":45,"column":null}},"17":{"start":{"line":47,"column":22},"end":{"line":49,"column":null}},"18":{"start":{"line":52,"column":2},"end":{"line":58,"column":null}},"19":{"start":{"line":53,"column":4},"end":{"line":57,"column":null}},"20":{"start":{"line":60,"column":2},"end":{"line":60,"column":null}},"21":{"start":{"line":62,"column":2},"end":{"line":62,"column":null}},"22":{"start":{"line":63,"column":1},"end":{"line":63,"column":null}},"23":{"start":{"line":65,"column":19},"end":{"line":78,"column":1}},"24":{"start":{"line":67,"column":18},"end":{"line":67,"column":47}},"25":{"start":{"line":68,"column":21},"end":{"line":68,"column":46}},"26":{"start":{"line":70,"column":27},"end":{"line":75,"column":4}},"27":{"start":{"line":77,"column":2},"end":{"line":77,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":20,"column":36},"end":{"line":20,"column":43}},"loc":{"start":{"line":20,"column":96},"end":{"line":63,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":65,"column":19},"end":{"line":65,"column":26}},"loc":{"start":{"line":65,"column":65},"end":{"line":78,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":2},"end":{"line":44,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":44,"column":null}}]},"1":{"loc":{"start":{"line":52,"column":2},"end":{"line":58,"column":null}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":58,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0},"f":{"0":0,"1":0},"b":{"0":[0],"1":[0]}} +,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs","statementMap":{"0":{"start":{"line":1,"column":37},"end":{"line":42,"column":1}},"1":{"start":{"line":2,"column":28},"end":{"line":2,"column":40}},"2":{"start":{"line":3,"column":29},"end":{"line":3,"column":42}},"3":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":20},"end":{"line":7,"column":108}},"5":{"start":{"line":8,"column":2},"end":{"line":17,"column":null}},"6":{"start":{"line":19,"column":27},"end":{"line":19,"column":128}},"7":{"start":{"line":20,"column":2},"end":{"line":38,"column":null}},"8":{"start":{"line":40,"column":2},"end":{"line":40,"column":null}},"9":{"start":{"line":41,"column":2},"end":{"line":41,"column":null}},"10":{"start":{"line":42,"column":1},"end":{"line":42,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":37},"end":{"line":1,"column":38}},"loc":{"start":{"line":1,"column":69},"end":{"line":42,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":27},"end":{"line":19,"column":128}},"type":"binary-expr","locations":[{"start":{"line":19,"column":27},"end":{"line":19,"column":122}},{"start":{"line":19,"column":126},"end":{"line":19,"column":128}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"f":{"0":0},"b":{"0":[0,0]}} +,"/Users/zane/playground/cloudsite/src/lib/shared/convert-domain-to-bucket-name.js": {"path":"/Users/zane/playground/cloudsite/src/lib/shared/convert-domain-to-bucket-name.js","statementMap":{"0":{"start":{"line":1,"column":35},"end":{"line":1,"column":106}},"1":{"start":{"line":1,"column":46},"end":{"line":1,"column":106}},"2":{"start":{"line":1,"column":106},"end":{"line":1,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":35},"end":{"line":1,"column":41}},"loc":{"start":{"line":1,"column":46},"end":{"line":1,"column":106}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0},"f":{"0":0},"b":{}} +,"/Users/zane/playground/cloudsite/src/lib/shared/determine-bucket-name.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/shared/determine-bucket-name.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":9,"column":28},"end":{"line":52,"column":1}},"6":{"start":{"line":10,"column":66},"end":{"line":10,"column":70}},"7":{"start":{"line":11,"column":33},"end":{"line":11,"column":37}},"8":{"start":{"line":13,"column":2},"end":{"line":15,"column":null}},"9":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"10":{"start":{"line":17,"column":22},"end":{"line":17,"column":30}},"11":{"start":{"line":18,"column":2},"end":{"line":23,"column":null}},"12":{"start":{"line":19,"column":4},"end":{"line":19,"column":null}},"13":{"start":{"line":20,"column":21},"end":{"line":20,"column":96}},"14":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"15":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"16":{"start":{"line":25,"column":2},"end":{"line":25,"column":null}},"17":{"start":{"line":27,"column":2},"end":{"line":51,"column":null}},"18":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"19":{"start":{"line":30,"column":18},"end":{"line":30,"column":74}},"20":{"start":{"line":32,"column":20},"end":{"line":32,"column":48}},"21":{"start":{"line":33,"column":4},"end":{"line":46,"column":null}},"22":{"start":{"line":34,"column":6},"end":{"line":34,"column":null}},"23":{"start":{"line":35,"column":6},"end":{"line":37,"column":null}},"24":{"start":{"line":36,"column":8},"end":{"line":36,"column":null}},"25":{"start":{"line":39,"column":6},"end":{"line":45,"column":null}},"26":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"27":{"start":{"line":41,"column":8},"end":{"line":41,"column":null}},"28":{"start":{"line":42,"column":13},"end":{"line":45,"column":null}},"29":{"start":{"line":43,"column":8},"end":{"line":43,"column":null}},"30":{"start":{"line":44,"column":8},"end":{"line":44,"column":null}},"31":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"32":{"start":{"line":48,"column":23},"end":{"line":48,"column":43}},"33":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"34":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"35":{"start":{"line":52,"column":1},"end":{"line":52,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":9,"column":28},"end":{"line":9,"column":35}},"loc":{"start":{"line":9,"column":44},"end":{"line":52,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":35},"end":{"line":10,"column":51}},"type":"default-arg","locations":[{"start":{"line":10,"column":46},"end":{"line":10,"column":51}}]},"1":{"loc":{"start":{"line":13,"column":2},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":13,"column":2},"end":{"line":15,"column":null}}]},"2":{"loc":{"start":{"line":14,"column":17},"end":{"line":14,"column":77}},"type":"binary-expr","locations":[{"start":{"line":14,"column":17},"end":{"line":14,"column":36}},{"start":{"line":14,"column":40},"end":{"line":14,"column":77}}]},"3":{"loc":{"start":{"line":18,"column":2},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":2},"end":{"line":23,"column":null}}]},"4":{"loc":{"start":{"line":25,"column":13},"end":{"line":25,"column":54}},"type":"binary-expr","locations":[{"start":{"line":25,"column":13},"end":{"line":25,"column":21}},{"start":{"line":25,"column":25},"end":{"line":25,"column":54}}]},"5":{"loc":{"start":{"line":35,"column":6},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":6},"end":{"line":37,"column":null}}]},"6":{"loc":{"start":{"line":39,"column":6},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":6},"end":{"line":45,"column":null}},{"start":{"line":42,"column":13},"end":{"line":45,"column":null}}]},"7":{"loc":{"start":{"line":42,"column":13},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":13},"end":{"line":45,"column":null}}]},"8":{"loc":{"start":{"line":42,"column":17},"end":{"line":42,"column":75}},"type":"binary-expr","locations":[{"start":{"line":42,"column":17},"end":{"line":42,"column":34}},{"start":{"line":42,"column":38},"end":{"line":42,"column":75}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0},"f":{"0":0},"b":{"0":[0],"1":[0],"2":[0,0],"3":[0],"4":[0,0],"5":[0],"6":[0,0],"7":[0],"8":[0,0]}} +,"/Users/zane/playground/cloudsite/src/lib/shared/determine-oac-name.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/shared/determine-oac-name.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"3":{"start":{"line":7,"column":25},"end":{"line":27,"column":1}},"4":{"start":{"line":8,"column":21},"end":{"line":8,"column":29}},"5":{"start":{"line":9,"column":20},"end":{"line":9,"column":28}},"6":{"start":{"line":13,"column":22},"end":{"line":13,"column":67}},"7":{"start":{"line":15,"column":2},"end":{"line":26,"column":null}},"8":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"9":{"start":{"line":17,"column":4},"end":{"line":25,"column":null}},"10":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"11":{"start":{"line":19,"column":23},"end":{"line":19,"column":43}},"12":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"13":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"14":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"15":{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},"16":{"start":{"line":27,"column":1},"end":{"line":27,"column":null}},"17":{"start":{"line":29,"column":23},"end":{"line":48,"column":1}},"18":{"start":{"line":30,"column":27},"end":{"line":30,"column":72}},"19":{"start":{"line":32,"column":17},"end":{"line":32,"column":19}},"20":{"start":{"line":33,"column":2},"end":{"line":47,"column":null}},"21":{"start":{"line":34,"column":27},"end":{"line":36,"column":6}},"22":{"start":{"line":38,"column":28},"end":{"line":38,"column":71}},"23":{"start":{"line":39,"column":18},"end":{"line":39,"column":63}},"24":{"start":{"line":41,"column":4},"end":{"line":41,"column":null}},"25":{"start":{"line":41,"column":50},"end":{"line":41,"column":54}},"26":{"start":{"line":43,"column":4},"end":{"line":43,"column":null}},"27":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"28":{"start":{"line":45,"column":6},"end":{"line":45,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":25},"end":{"line":7,"column":32}},"loc":{"start":{"line":7,"column":72},"end":{"line":27,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":29,"column":23},"end":{"line":29,"column":30}},"loc":{"start":{"line":29,"column":58},"end":{"line":48,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":41,"column":29},"end":{"line":41,"column":30}},"loc":{"start":{"line":41,"column":50},"end":{"line":41,"column":54}}}},"branchMap":{"0":{"loc":{"start":{"line":16,"column":4},"end":{"line":16,"column":78}},"type":"binary-expr","locations":[{"start":{"line":16,"column":4},"end":{"line":16,"column":20}},{"start":{"line":16,"column":4},"end":{"line":16,"column":20}},{"start":{"line":16,"column":4},"end":{"line":16,"column":78}}]},"1":{"loc":{"start":{"line":17,"column":4},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":25,"column":null}},{"start":{"line":22,"column":11},"end":{"line":25,"column":null}}]},"2":{"loc":{"start":{"line":18,"column":6},"end":{"line":18,"column":41}},"type":"binary-expr","locations":[{"start":{"line":18,"column":6},"end":{"line":18,"column":22}},{"start":{"line":18,"column":6},"end":{"line":18,"column":22}},{"start":{"line":18,"column":6},"end":{"line":18,"column":41}}]},"3":{"loc":{"start":{"line":23,"column":6},"end":{"line":23,"column":37}},"type":"binary-expr","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":22}},{"start":{"line":23,"column":6},"end":{"line":23,"column":22}},{"start":{"line":23,"column":6},"end":{"line":23,"column":37}}]},"4":{"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":46,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0,0],"1":[0,0],"2":[0,0,0],"3":[0,0,0],"4":[0]}} +,"/Users/zane/playground/cloudsite/src/lib/shared/progress-logger.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/shared/progress-logger.mjs","statementMap":{"0":{"start":{"line":1,"column":20},"end":{"line":1,"column":37}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{}} +,"/Users/zane/playground/cloudsite/src/lib/shared/site-template.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/shared/site-template.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":50}},"6":{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},"7":{"start":{"line":14,"column":21},"end":{"line":237,"column":1}},"8":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"9":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"10":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"11":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"12":{"start":{"line":44,"column":74},"end":{"line":44,"column":87}},"13":{"start":{"line":46,"column":20},"end":{"line":50,"column":6}},"14":{"start":{"line":52,"column":4},"end":{"line":150,"column":null}},"15":{"start":{"line":154,"column":25},"end":{"line":154,"column":29}},"16":{"start":{"line":155,"column":36},"end":{"line":155,"column":44}},"17":{"start":{"line":157,"column":4},"end":{"line":157,"column":null}},"18":{"start":{"line":158,"column":21},"end":{"line":158,"column":69}},"19":{"start":{"line":159,"column":32},"end":{"line":159,"column":89}},"20":{"start":{"line":160,"column":4},"end":{"line":160,"column":null}},"21":{"start":{"line":161,"column":4},"end":{"line":161,"column":null}},"22":{"start":{"line":165,"column":27},"end":{"line":165,"column":40}},"23":{"start":{"line":166,"column":64},"end":{"line":166,"column":77}},"24":{"start":{"line":168,"column":4},"end":{"line":175,"column":null}},"25":{"start":{"line":169,"column":6},"end":{"line":174,"column":null}},"26":{"start":{"line":176,"column":4},"end":{"line":176,"column":null}},"27":{"start":{"line":178,"column":4},"end":{"line":187,"column":null}},"28":{"start":{"line":189,"column":4},"end":{"line":189,"column":null}},"29":{"start":{"line":193,"column":25},"end":{"line":193,"column":29}},"30":{"start":{"line":194,"column":43},"end":{"line":194,"column":51}},"31":{"start":{"line":196,"column":4},"end":{"line":206,"column":null}},"32":{"start":{"line":197,"column":21},"end":{"line":197,"column":39}},"33":{"start":{"line":198,"column":6},"end":{"line":200,"column":null}},"34":{"start":{"line":199,"column":8},"end":{"line":199,"column":null}},"35":{"start":{"line":202,"column":41},"end":{"line":202,"column":47}},"36":{"start":{"line":203,"column":6},"end":{"line":205,"column":null}},"37":{"start":{"line":204,"column":8},"end":{"line":204,"column":null}},"38":{"start":{"line":210,"column":25},"end":{"line":210,"column":29}},"39":{"start":{"line":211,"column":43},"end":{"line":211,"column":51}},"40":{"start":{"line":213,"column":4},"end":{"line":220,"column":null}},"41":{"start":{"line":214,"column":21},"end":{"line":214,"column":39}},"42":{"start":{"line":215,"column":6},"end":{"line":217,"column":null}},"43":{"start":{"line":216,"column":8},"end":{"line":216,"column":null}},"44":{"start":{"line":219,"column":6},"end":{"line":219,"column":null}},"45":{"start":{"line":224,"column":27},"end":{"line":224,"column":40}},"46":{"start":{"line":225,"column":26},"end":{"line":225,"column":64}},"47":{"start":{"line":227,"column":27},"end":{"line":232,"column":5}},"48":{"start":{"line":234,"column":19},"end":{"line":234,"column":63}},"49":{"start":{"line":235,"column":4},"end":{"line":235,"column":null}},"50":{"start":{"line":237,"column":1},"end":{"line":237,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},"loc":{"start":{"line":8,"column":50},"end":{"line":8,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":35,"column":2},"end":{"line":35,"column":13}},"loc":{"start":{"line":35,"column":42},"end":{"line":41,"column":null}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":43,"column":2},"end":{"line":43,"column":8}},"loc":{"start":{"line":43,"column":30},"end":{"line":151,"column":null}}},"3":{"name":"(anonymous_5)","decl":{"start":{"line":153,"column":2},"end":{"line":153,"column":8}},"loc":{"start":{"line":153,"column":38},"end":{"line":162,"column":null}}},"4":{"name":"(anonymous_6)","decl":{"start":{"line":164,"column":2},"end":{"line":164,"column":8}},"loc":{"start":{"line":164,"column":37},"end":{"line":190,"column":null}}},"5":{"name":"(anonymous_7)","decl":{"start":{"line":192,"column":2},"end":{"line":192,"column":8}},"loc":{"start":{"line":192,"column":26},"end":{"line":207,"column":null}}},"6":{"name":"(anonymous_8)","decl":{"start":{"line":209,"column":2},"end":{"line":209,"column":8}},"loc":{"start":{"line":209,"column":23},"end":{"line":221,"column":null}}},"7":{"name":"(anonymous_9)","decl":{"start":{"line":223,"column":2},"end":{"line":223,"column":8}},"loc":{"start":{"line":223,"column":12},"end":{"line":236,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":50},"end":{"line":8,"column":null}}]},"1":{"loc":{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},"type":"cond-expr","locations":[{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},{"start":{"line":8,"column":50},"end":{"line":8,"column":null}}]},"2":{"loc":{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},"type":"binary-expr","locations":[{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},{"start":{"line":8,"column":50},"end":{"line":8,"column":null}}]},"3":{"loc":{"start":{"line":166,"column":10},"end":{"line":166,"column":60}},"type":"default-arg","locations":[{"start":{"line":166,"column":32},"end":{"line":166,"column":60}}]},"4":{"loc":{"start":{"line":168,"column":4},"end":{"line":175,"column":null}},"type":"if","locations":[{"start":{"line":168,"column":4},"end":{"line":175,"column":null}}]},"5":{"loc":{"start":{"line":198,"column":6},"end":{"line":200,"column":null}},"type":"if","locations":[{"start":{"line":198,"column":6},"end":{"line":200,"column":null}}]},"6":{"loc":{"start":{"line":203,"column":6},"end":{"line":205,"column":null}},"type":"if","locations":[{"start":{"line":203,"column":6},"end":{"line":205,"column":null}}]},"7":{"loc":{"start":{"line":215,"column":6},"end":{"line":217,"column":null}},"type":"if","locations":[{"start":{"line":215,"column":6},"end":{"line":217,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0],"4":[0],"5":[0],"6":[0],"7":[0]}} +} diff --git a/qa/coverage/favicon.png b/qa/coverage/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 1.47% + Statements + 15/1018 +
+ + +
+ 3.2% + Branches + 12/375 +
+ + +
+ 2.97% + Functions + 3/101 +
+ + +
+ 1.33% + Lines + 13/975 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cli +
+
8.53%7/8217.64%6/3425%1/48.45%6/71
cli/lib +
+
0%0/2960%0/1320%0/320%0/278
cli/lib/configuration +
+
32%8/2550%6/1240%2/531.81%7/22
lib/actions +
+
0%0/2390%0/900%0/180%0/235
lib/actions/lib +
+
0%0/1220%0/430%0/160%0/119
lib/plugins +
+
0%0/14100%0/00%0/50%0/14
lib/plugins/contact-handler/lib +
+
0%0/1200%0/280%0/80%0/120
lib/shared +
+
0%0/1200%0/360%0/130%0/116
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/actions/create.mjs.html b/qa/coverage/lib/actions/create.mjs.html new file mode 100644 index 00000000..4dc0edfd --- /dev/null +++ b/qa/coverage/lib/actions/create.mjs.html @@ -0,0 +1,559 @@ + + + + + + Code coverage report for lib/actions/create.mjs + + + + + + + + + +
+
+

All files / lib/actions create.mjs

+
+ +
+ 0% + Statements + 0/78 +
+ + +
+ 0% + Branches + 0/16 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 0% + Lines + 0/77 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ACMClient, ListCertificatesCommand, RequestCertificateCommand } from '@aws-sdk/client-acm'
+import { CloudFormationClient, CreateStackCommand } from '@aws-sdk/client-cloudformation'
+ 
+import { convertDomainToBucketName } from '../shared/convert-domain-to-bucket-name'
+import { createOrUpdateDNSRecords } from './lib/create-or-update-dns-records'
+import { determineBucketName } from '../shared/determine-bucket-name'
+import { errorOut } from '../../cli/lib/error-out'
+import { getCredentials } from './lib/get-credentials'
+import * as plugins from '../plugins'
+import { SiteTemplate } from '../shared/site-template'
+import { syncSiteContent } from './lib/sync-site-content'
+import { trackStackStatus } from './lib/track-stack-status'
+import { updateSiteInfo } from './lib/update-site-info'I
+ 
+const STACK_CREATE_TIMEOUT = 30 // min
+ 
+const create = async ({
+  noBuild,
+  noDeleteOnFailure,
+  siteInfo,
+  ...downstreamOptions
+}) => {
+  const { apexDomain } = siteInfo
+  let { bucketName } = siteInfo
+ 
+  const credentials = getCredentials(downstreamOptions)
+ 
+  const acmClient = new ACMClient({
+    credentials,
+    region : 'us-east-1' // N. Virginia; required for certificate request
+  })
+ 
+  let { certificateArn, status } = await findCertificate({ acmClient, apexDomain })
+  Iif (certificateArn === null) {
+    process.stdout.write(`Creating wildcard certificate for '${apexDomain}'...`)
+    certificateArn = await createCertificate({ acmClient, apexDomain })
+    status = 'PENDING_VALIDATION'
+  }
+  siteInfo.certificateArn = certificateArn
+ 
+  Iif (status === 'PENDING_VALIDATION') {
+    const accountLocalCertID = certificateArn.replace(/[^/]+\/(.+)/, '$1')
+    const certificateConsoleURL =
+      `https://us-east-1.console.aws.amazon.com/acm/home?region=us-east-1#/certificates/${accountLocalCertID}`
+    throw new Error(`Wildcard certificate for '${apexDomain}' found, but requires validation. Please validate the certificate. To validate on S3 when using Route 53 for DNS service, try navigating to the folliwng URL and select 'Create records in Route 53'::\n\n${certificateConsoleURL}\n\nSubsequent validation may take up to 30 minutes. For further documentation:\n\nhttps://docs.aws.amazon.com/acm/latest/userguide/dns-validation.html`)
+  }
+ 
+  bucketName = await determineBucketName({ apexDomain, bucketName, credentials, findName : true, siteInfo })
+  siteInfo.bucketName = bucketName
+  const stackCreated = await createSiteStack({ credentials, noDeleteOnFailure, siteInfo })
+ 
+  if (stackCreated === true) {
+    const postUpdateHandlers = Object.keys(siteInfo.pluginSettings || {}).map((pluginKey) =>
+      [pluginKey, plugins[pluginKey].postUpdateHandler]
+    )
+      .filter(([, postUpdateHandler]) => postUpdateHandler !== undefined)
+ 
+    await updateSiteInfo({ credentials, siteInfo }) // needed by createOrUpdateDNSRecords
+    await Promise.all([
+      syncSiteContent({ credentials, noBuild, siteInfo }),
+      createOrUpdateDNSRecords({ credentials, siteInfo }),
+      ...(postUpdateHandlers.map(([pluginKey, handler]) =>
+        handler({ settings : siteInfo.pluginSettings[pluginKey], siteInfo })))
+    ])
+ 
+    process.stdout.write('Stack created.\n')
+  } else {
+    errorOut('Stack creation error.\n')
+  }
+}
+ 
+const findCertificate = async ({ apexDomain, acmClient, nextToken }) => {
+  process.stdout.write('Searching for existing certificate...\n')
+  const listCertificateInput = { CertificateStatuses : ['PENDING_VALIDATION', 'ISSUED'] }
+  const listCertificatesCommand = new ListCertificatesCommand(listCertificateInput)
+  const listResponse = await acmClient.send(listCertificatesCommand)
+ 
+  const domain = '*.' + apexDomain
+  for (const { CertificateArn, DomainName, Status } of listResponse.CertificateSummaryList) {
+    Iif (DomainName === domain) {
+      return { certificateArn : CertificateArn, status : Status }
+    }
+  }
+  nextToken = listResponse.NextToken
+  Iif (nextToken !== undefined) {
+    return await findCertificate({ apexDomain, acmClient, nextToken })
+  }
+  // else
+  return { certificateArn : null, status : null }
+}
+ 
+const createCertificate = async ({ acmClient, apexDomain }) => {
+  process.stdout.write(`Creating wildcard certificate for '${apexDomain}'...`)
+  const input = { // RequestCertificateRequest
+    DomainName              : '*.' + apexDomain, // TODO: support more narrow cert?
+    ValidationMethod        : 'DNS', // TODO: support email
+    SubjectAlternativeNames : [
+      apexDomain, 'www.' + apexDomain
+    ], /*
+    // IdempotencyToken: "STRING_VALUE", TODO: should we use this?
+    /* DomainValidationOptions: [ // DomainValidationOptionList : TODO: is this only used for email verification?
+      { // DomainValidationOption
+        DomainName: "STRING_VALUE", // required
+        ValidationDomain: "STRING_VALUE", // required
+      },
+    ], */
+    Options : { // CertificateOptions
+      CertificateTransparencyLoggingPreference : 'ENABLED'
+    },
+    // CertificateAuthorityArn: "STRING_VALUE", TODO: only used for private certs, I think
+    /* Tags: [ // TagList : TODO: support tags? tag with the website
+      { // Tag
+        Key: "STRING_VALUE", // required
+        Value: "STRING_VALUE",
+      },
+    ], */
+    KeyAlgorithm : 'RSA_2048' // TODO: support key options"RSA_1024" || "RSA_2048" || "RSA_3072" || "RSA_4096" || "EC_prime256v1" || "EC_secp384r1" || "EC_secp521r1",
+  }
+  // this method can safely be called multiple times; it'll  match  existing certs (by domain name I'd assume)
+  const command = new RequestCertificateCommand(input)
+  const response = await acmClient.send(command)
+ 
+  const { CertificateArn } = response
+ 
+  return CertificateArn
+}
+ 
+const createSiteStack = async ({ credentials, noDeleteOnFailure, siteInfo }) => {
+  const { apexDomain, region } = siteInfo
+ 
+  const siteTemplate = new SiteTemplate({ credentials, siteInfo })
+  await siteTemplate.initializeTemplate()
+  await siteTemplate.loadPlugins()
+ 
+  const cloudFormationTemplate = siteTemplate.render()
+ 
+  const cloudFormationClient = new CloudFormationClient({ credentials, region })
+  const stackName = siteInfo.stackName || convertDomainToBucketName(apexDomain) + '-stack'
+  const createInput = {
+    StackName        : stackName,
+    TemplateBody     : cloudFormationTemplate,
+    DisableRollback  : false,
+    Capabilities     : ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'],
+    TimeoutInMinutes : STACK_CREATE_TIMEOUT
+  }
+  const createCommand = new CreateStackCommand(createInput)
+  const createResponse = await cloudFormationClient.send(createCommand)
+ 
+  const { StackId } = createResponse
+ 
+  siteInfo.stackName = stackName
+  siteInfo.stackArn = StackId
+ 
+  const stackCreated = await trackStackStatus({ cloudFormationClient, noDeleteOnFailure, stackName })
+  return stackCreated
+}
+ 
+export { create }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/actions/destroy.mjs.html b/qa/coverage/lib/actions/destroy.mjs.html new file mode 100644 index 00000000..82c7b12f --- /dev/null +++ b/qa/coverage/lib/actions/destroy.mjs.html @@ -0,0 +1,268 @@ + + + + + + Code coverage report for lib/actions/destroy.mjs + + + + + + + + + +
+
+

All files / lib/actions destroy.mjs

+
+ +
+ 0% + Statements + 0/37 +
+ + +
+ 0% + Branches + 0/21 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/37 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { S3Client } from '@aws-sdk/client-s3'
+import { CloudFormationClient, DeleteStackCommand } from '@aws-sdk/client-cloudformation'
+ 
+import { emptyBucket } from 's3-empty-bucket'
+ 
+import { getCredentials } from './lib/get-credentials'
+import { progressLogger } from '../shared/progress-logger'
+import { SiteTemplate } from '../shared/site-template'
+import { trackStackStatus } from './lib/track-stack-status'
+ 
+const destroy = async ({ globalOptions, siteInfo, verbose }) => {
+  const { bucketName, stackName } = siteInfo
+ 
+  const credentials = getCredentials(globalOptions)
+  const s3Client = new S3Client({ credentials })
+ 
+  // this method provides user udptaes
+  try {
+    progressLogger?.write('Deleting site bucket...\n')
+    await emptyBucket({ bucketName, s3Client, verbose })
+  } catch (e) {
+    if (e.name === 'NoSuchBucket') {
+      progressLogger?.write('Bucket already deleted.\n')
+    } else {
+      throw e
+    }
+  }
+ 
+  const siteTemplate = new SiteTemplate({ credentials, siteInfo })
+  await siteTemplate.destroyPlugins()
+ 
+  progressLogger.write('Deleting stack...')
+  const cloudFormationClient = new CloudFormationClient({ credentials })
+  const deleteStackCommand = new DeleteStackCommand({ StackName : stackName })
+  await cloudFormationClient.send(deleteStackCommand)
+ 
+  // the delete command is doesn't mind if the bucket doesn't exist, but trackStackStatus does
+  try {
+    const finalStatus = await trackStackStatus({ cloudFormationClient, noDeleteOnFailure : true, stackName })
+    progressLogger?.write('Final status: ' + finalStatus + '\n')
+ 
+    if (finalStatus === 'DELETE_FAILED' && progressLogger !== undefined) {
+      progressLogger.write('\nThe delete is expected to fail at first because the \'replicated Lambda functions\' take a while to clear and the stack cannot be fully deleted until AWS clears the replicated functions. Give it at least 30 min and up to a few hours and try again.')
+      return false
+    } else Iif (finalStatus === 'DELETE_COMPLETE') {
+      return true
+    }
+  } catch (e) {
+    // oddly, if the stack does not exist we get a ValidationError; which means it's already deleted
+    if (e.name === 'ValidationError') {
+      progressLogger.write(' already deleted.\n')
+      return true
+    } else {
+      throw e
+    }
+  } finally {
+    progressLogger?.write('\n')
+  }
+}
+ 
+export { destroy }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/actions/index.html b/qa/coverage/lib/actions/index.html new file mode 100644 index 00000000..9b142c06 --- /dev/null +++ b/qa/coverage/lib/actions/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for lib/actions + + + + + + + + + +
+
+

All files lib/actions

+
+ +
+ 0% + Statements + 0/239 +
+ + +
+ 0% + Branches + 0/90 +
+ + +
+ 0% + Functions + 0/18 +
+ + +
+ 0% + Lines + 0/235 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
create.mjs +
+
0%0/780%0/160%0/80%0/77
destroy.mjs +
+
0%0/370%0/210%0/10%0/37
update.mjs +
+
0%0/250%0/160%0/20%0/25
verify.mjs +
+
0%0/990%0/370%0/70%0/96
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/create-or-update-dns-records.mjs.html b/qa/coverage/lib/actions/lib/create-or-update-dns-records.mjs.html new file mode 100644 index 00000000..d883a894 --- /dev/null +++ b/qa/coverage/lib/actions/lib/create-or-update-dns-records.mjs.html @@ -0,0 +1,250 @@ + + + + + + Code coverage report for lib/actions/lib/create-or-update-dns-records.mjs + + + + + + + + + +
+
+

All files / lib/actions/lib create-or-update-dns-records.mjs

+
+ +
+ 0% + Statements + 0/24 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/24 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Route53Client, ChangeResourceRecordSetsCommand, ListHostedZonesCommand } from '@aws-sdk/client-route-53'
+import { CloudFrontClient, GetDistributionCommand } from '@aws-sdk/client-cloudfront'
+ 
+const createOrUpdateDNSRecords = async ({ credentials, siteInfo }) => {
+  const { apexDomain, cloudFrontDistributionID, region } = siteInfo
+ 
+  const cloudFrontClient = new CloudFrontClient({ credentials, region })
+  const getDistributionCommand = new GetDistributionCommand({ Id : cloudFrontDistributionID })
+  const distributionResponse = await cloudFrontClient.send(getDistributionCommand)
+  const distributionDomainName = distributionResponse.Distribution.DomainName
+ 
+  const route53Client = new Route53Client({ credentials, region })
+ 
+  const hostedZoneID = await getHostedZoneID({ route53Client, siteInfo })
+ 
+  const domains = [apexDomain, 'www.' + apexDomain]
+ 
+  const changeResourceRecordSetCommand = new ChangeResourceRecordSetsCommand({
+    HostedZoneId : hostedZoneID,
+    ChangeBatch  : {
+      Comment : `Point '${apexDomain}' and 'www.${apexDomain}' to CloudFront distribution.`,
+      Changes : domains.map((name) => ({
+        Action            : 'UPSERT',
+        ResourceRecordSet : {
+          Name        : name,
+          AliasTarget : {
+            DNSName              : distributionDomainName,
+            EvaluateTargetHealth : false,
+            HostedZoneId         : 'Z2FDTNDATAQYW2' // Static value specified by API for use with CloudFront aliases
+          },
+          Type : 'A'
+        }
+      }))
+    }
+  })
+  process.stdout.write(`Creating/updating Route 53 resource record sets/DNS entries for ${domains.join(', ')}...\n`)
+  await route53Client.send(changeResourceRecordSetCommand)
+}
+ 
+const getHostedZoneID = async ({ markerToken, route53Client, siteInfo }) => {
+  const listHostedZonesCommand = new ListHostedZonesCommand({ marker : markerToken })
+  const listHostedZonesResponse = await route53Client.send(listHostedZonesCommand)
+ 
+  for (const { Id, Name } of listHostedZonesResponse.HostedZones) {
+    Iif (Name === siteInfo.apexDomain + '.') {
+      return Id.replace(/\/[^/]+\/(.+)/, '$1') // /hostedzone/XXX -> XXX
+    }
+  }
+ 
+  Iif (listHostedZonesResponse.IsTruncated === true) {
+    return await getHostedZoneID({ markerToken : listHostedZonesResponse.NewMarker, route53Client, siteInfo })
+  }
+}
+ 
+export { createOrUpdateDNSRecords }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/get-credentials.mjs.html b/qa/coverage/lib/actions/lib/get-credentials.mjs.html new file mode 100644 index 00000000..c09a69fd --- /dev/null +++ b/qa/coverage/lib/actions/lib/get-credentials.mjs.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for lib/actions/lib/get-credentials.mjs + + + + + + + + + +
+
+

All files / lib/actions/lib get-credentials.mjs

+
+ +
+ 0% + Statements + 0/6 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { fromIni } from '@aws-sdk/credential-providers'
+ 
+const getCredentials = ({ ssoProfile }) => {
+  ssoProfile = ssoProfile || process.env.AWS_PROFILE || 'default'
+ 
+  const credentials = fromIni({
+    profile : ssoProfile
+    // Optional. The path to the shared credentials file. If not specified, the provider will use
+    // the value in the `AWS_SHARED_CREDENTIALS_FILE` environment variable or a default of
+    // `~/.aws/credentials`.
+    // filepath: "~/.aws/credentials",
+    // Optional. The path to the shared config file. If not specified, the provider will use the
+    // value in the `AWS_CONFIG_FILE` environment variable or a default of `~/.aws/config`.
+    // configFilepath: "~/.aws/config",
+    // Optional. A function that returns a a promise fulfilled with an MFA token code for the
+    // provided MFA Serial code. If a profile requires an MFA code and `mfaCodeProvider` is not a
+    // valid function, the credential provider promise will be rejected.
+    /* mfaCodeProvider: async (mfaSerial) => {
+      return "token";
+    }, */
+    // Optional. Custom STS client configurations overriding the default ones.
+    // clientConfig: { region },
+  })
+ 
+  return credentials
+}
+ 
+export { getCredentials }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/index.html b/qa/coverage/lib/actions/lib/index.html new file mode 100644 index 00000000..d85f4962 --- /dev/null +++ b/qa/coverage/lib/actions/lib/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for lib/actions/lib + + + + + + + + + +
+
+

All files lib/actions/lib

+
+ +
+ 0% + Statements + 0/122 +
+ + +
+ 0% + Branches + 0/43 +
+ + +
+ 0% + Functions + 0/16 +
+ + +
+ 0% + Lines + 0/119 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
create-or-update-dns-records.mjs +
+
0%0/240%0/20%0/30%0/24
get-credentials.mjs +
+
0%0/60%0/30%0/10%0/6
sync-site-content.mjs +
+
0%0/220%0/120%0/30%0/21
track-stack-status.mjs +
+
0%0/270%0/160%0/20%0/26
update-site-info.mjs +
+
0%0/11100%0/00%0/20%0/11
update-stack.mjs +
+
0%0/320%0/100%0/50%0/31
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/sync-site-content.mjs.html b/qa/coverage/lib/actions/lib/sync-site-content.mjs.html new file mode 100644 index 00000000..5860cce5 --- /dev/null +++ b/qa/coverage/lib/actions/lib/sync-site-content.mjs.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for lib/actions/lib/sync-site-content.mjs + + + + + + + + + +
+
+

All files / lib/actions/lib sync-site-content.mjs

+
+ +
+ 0% + Statements + 0/22 +
+ + +
+ 0% + Branches + 0/12 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { existsSync as fileExists } from 'node:fs'
+import * as fsPath from 'node:path'
+ 
+import { S3Client } from '@aws-sdk/client-s3'
+import { tryExec } from '@liquid-labs/shell-toolkit'
+import mime from 'mime-types'
+import { S3SyncClient } from 's3-sync-client'I
+ 
+const syncSiteContent = async ({ credentials, noBuild, siteInfo }) => {
+  const { bucketName, sourcePath, sourceType } = siteInfo
+ 
+  Iif (noBuild !== true && sourceType === 'docusaurus') {
+    const packageRoot = fsPath.resolve(sourcePath, '..')
+    const packagePath = fsPath.join(packageRoot, 'package.json')
+    Iif (fileExists(packagePath)) {
+      process.stdout.write('Rebuilding site... ')
+      tryExec(`cd "${packageRoot}" && npm run build`)
+      process.stdout.write('done.\n')
+    }
+  }
+ 
+  process.stdout.write(`Syncing files from ${sourcePath}...\n`)
+ 
+  const s3Client = new S3Client({ credentials })
+  const { sync } = new S3SyncClient({ client : s3Client })
+ 
+  await sync(sourcePath, 's3://' + bucketName, {
+    commandInput           : (input) => ({ ContentType : mime.lookup(input.Key) || 'application/octet-stream' }),
+    del                    : true,
+    maxConcurrentTransfers : 10
+  })
+}
+ 
+export { syncSiteContent }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/track-stack-status.mjs.html b/qa/coverage/lib/actions/lib/track-stack-status.mjs.html new file mode 100644 index 00000000..2777a3a8 --- /dev/null +++ b/qa/coverage/lib/actions/lib/track-stack-status.mjs.html @@ -0,0 +1,211 @@ + + + + + + Code coverage report for lib/actions/lib/track-stack-status.mjs + + + + + + + + + +
+
+

All files / lib/actions/lib track-stack-status.mjs

+
+ +
+ 0% + Statements + 0/27 +
+ + +
+ 0% + Branches + 0/16 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { DeleteStackCommand, DescribeStacksCommand } from '@aws-sdk/client-cloudformation'
+ 
+const RECHECK_WAIT_TIME = 2000 // ms
+ 
+const trackStackStatus = async ({ cloudFormationClient, noDeleteOnFailure, stackName }) => {
+  let stackStatus, previousStatus
+  do {
+    const describeInput = { StackName : stackName }
+    const describeCommand = new DescribeStacksCommand(describeInput)
+    const describeResponse = await cloudFormationClient.send(describeCommand)
+ 
+    stackStatus = describeResponse.Stacks[0].StackStatus
+ 
+    if (stackStatus === 'CREATE_IN_PROGRESS' && previousStatus === undefined) {
+      process.stdout.write('Creating stack')
+    } else if (stackStatus === 'UPDATE_IN_PROGRESS' && previousStatus === undefined) {
+      process.stdout.write('Updating stack')
+    } else if (stackStatus === 'ROLLBACK_IN_PROGRESS' && previousStatus !== 'ROLLBACK_IN_PROGRESS') {
+      process.stdout.write('\nRollback in progress')
+    } else {
+      process.stdout.write('.')
+    }
+ 
+    previousStatus = stackStatus
+    await new Promise(resolve => setTimeout(resolve, RECHECK_WAIT_TIME))
+  } while (stackStatus.endsWith('_IN_PROGRESS'))
+ 
+  if (stackStatus === 'ROLLBACK_COMPLETE' && noDeleteOnFailure !== true) {
+    process.stdout.write(`\nDeleting stack '${stackName}'... `)
+    const deleteInput = { StackName : stackName }
+    const deleteCommand = new DeleteStackCommand(deleteInput)
+    await cloudFormationClient.send(deleteCommand)
+ 
+    process.stdout.write('done.\n')
+  } else {
+    process.stdout.write('\nStack status: ' + stackStatus + '\n')
+  }
+ 
+  return stackStatus === 'CREATE_COMPLETE'
+}
+ 
+export { trackStackStatus }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/update-site-info.mjs.html b/qa/coverage/lib/actions/lib/update-site-info.mjs.html new file mode 100644 index 00000000..fa5c6d6d --- /dev/null +++ b/qa/coverage/lib/actions/lib/update-site-info.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for lib/actions/lib/update-site-info.mjs + + + + + + + + + +
+
+

All files / lib/actions/lib update-site-info.mjs

+
+ +
+ 0% + Statements + 0/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { CloudFormationClient, DescribeStacksCommand } from '@aws-sdk/client-cloudformation'
+ 
+const updateSiteInfo = async ({ credentials, siteInfo }) => {
+  const { region, stackName } = siteInfo
+  process.stdout.write('Gathering information from stack...\n')
+  const cloudFormationClient = new CloudFormationClient({ credentials, region })
+  const describeCommand = new DescribeStacksCommand({ StackName : stackName })
+  const describeResponse = await cloudFormationClient.send(describeCommand)
+  const cloudFrontDistributionID = describeResponse
+    .Stacks[0].Outputs.find(({ OutputKey }) => OutputKey === 'SiteCloudFrontDistribution').OutputValue
+ 
+  siteInfo.cloudFrontDistributionID = cloudFrontDistributionID
+}
+ 
+export { updateSiteInfo }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/update-stack.mjs.html b/qa/coverage/lib/actions/lib/update-stack.mjs.html new file mode 100644 index 00000000..24f5a37f --- /dev/null +++ b/qa/coverage/lib/actions/lib/update-stack.mjs.html @@ -0,0 +1,268 @@ + + + + + + Code coverage report for lib/actions/lib/update-stack.mjs + + + + + + + + + +
+
+

All files / lib/actions/lib update-stack.mjs

+
+ +
+ 0% + Statements + 0/32 +
+ + +
+ 0% + Branches + 0/10 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 0% + Lines + 0/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { CloudFormationClient, GetTemplateCommand, UpdateStackCommand } from '@aws-sdk/client-cloudformation'
+import isEqual from 'lodash/isEqual'
+ 
+import * as plugins from '../../plugins'
+import { SiteTemplate } from '../../shared/site-template'
+import { trackStackStatus } from './track-stack-status'
+import { updateSiteInfo } from './update-site-info'I
+ 
+const updateStack = async ({ credentials, siteInfo }) => {
+  const { region, stackName } = siteInfo
+ 
+  const siteTemplate = new SiteTemplate({ credentials, siteInfo })
+  await siteTemplate.initializeTemplate()
+  await siteTemplate.loadPlugins()
+ 
+  const newTemplate = siteTemplate.render()
+ 
+  const cloudFormationClient = new CloudFormationClient({ credentials, region })
+  const getTemplateCommand = new GetTemplateCommand({
+    StackName     : stackName,
+    TemplateStage : 'Original'
+  })
+  const getTemplateResponse = await cloudFormationClient.send(getTemplateCommand)
+  const currentTemplate = getTemplateResponse.TemplateBody
+ 
+  Iif (isEqual(currentTemplate, newTemplate)) {
+    process.stdout.write('No change to template; skipping stack update.\n')
+    return
+  }
+  // else, the template has changed
+ 
+  const stackUpdateCommand = new UpdateStackCommand({ // UpdateStackInput
+    StackName           : stackName,
+    TemplateBody        : newTemplate,
+    UsePreviousTemplate : false,
+    Capabilities        : ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'],
+    DisableRollback     : false
+  })
+ 
+  await cloudFormationClient.send(stackUpdateCommand)
+ 
+  await trackStackStatus({ cloudFormationClient, noDeleteOnFailure : true, stackName })
+ 
+  await updateSiteInfo({ credentials, siteInfo }) // needed by createOrUpdateDNSRecords
+ 
+  const postUpdateHandlers = Object.keys(siteInfo.pluginSettings || {}).map((pluginKey) =>
+    [pluginKey, plugins[pluginKey].postUpdateHandler]
+  )
+    .filter(([, postUpdateHandler]) => postUpdateHandler !== undefined)
+ 
+  Iif (postUpdateHandlers.length > 0) {
+    await Promise.all([
+      ...(postUpdateHandlers.map(([pluginKey, handler]) =>
+        handler({ settings : siteInfo.pluginSettings[pluginKey], siteInfo })))
+    ])
+  }
+ 
+  process.stdout.write('Stack created.\n')
+}
+ 
+export { updateStack }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/actions/update.mjs.html b/qa/coverage/lib/actions/update.mjs.html new file mode 100644 index 00000000..d5a04632 --- /dev/null +++ b/qa/coverage/lib/actions/update.mjs.html @@ -0,0 +1,244 @@ + + + + + + Code coverage report for lib/actions/update.mjs + + + + + + + + + +
+
+

All files / lib/actions update.mjs

+
+ +
+ 0% + Statements + 0/25 +
+ + +
+ 0% + Branches + 0/16 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { CloudFrontClient, CreateInvalidationCommand } from '@aws-sdk/client-cloudfront'
+ 
+import { createOrUpdateDNSRecords } from './lib/create-or-update-dns-records'
+import { getCredentials } from './lib/get-credentials'
+import { syncSiteContent } from './lib/sync-site-content'
+import { updateStack } from './lib/update-stack'
+ 
+const update = async ({ doContent, doDNS, doStack, noBuild, noCacheInvalidation, siteInfo, globalOptions }) => {
+  const doAll = doContent === undefined && doDNS === undefined && doStack === undefined
+ 
+  const credentials = getCredentials(globalOptions)
+ 
+  const updates = []
+  Iif (doAll === true || doContent === true) {
+    // method will report actions to user
+    updates.push(syncSiteContent({ credentials, noBuild, siteInfo }))
+  }
+ 
+  Iif (doAll === true || doDNS === true) {
+    updates.push(createOrUpdateDNSRecords({ credentials, siteInfo }))
+  }
+ 
+  Iif (doAll === true || doStack === true) {
+    updates.push(updateStack({ credentials, siteInfo }))
+  }
+ 
+  await Promise.all(updates)
+ 
+  Iif ((doAll === true || doContent === true) && noCacheInvalidation !== true) {
+    await invalidateCache({ credentials, siteInfo })
+  }
+}
+ 
+const invalidateCache = async ({ credentials, siteInfo }) => {
+  process.stdout.write('Invalidating CloudFront cache...\n')
+ 
+  const { cloudFrontDistributionID } = siteInfo
+ 
+  const cloudFrontClient = new CloudFrontClient({ credentials })
+  const invalidateCacheCommand = new CreateInvalidationCommand({
+    DistributionId    : cloudFrontDistributionID,
+    InvalidationBatch : {
+      Paths : {
+        Quantity : 1,
+        Items    : ['/*']
+      },
+      CallerReference : new Date().getTime() + ''
+    }
+  })
+  await cloudFrontClient.send(invalidateCacheCommand)
+}
+ 
+export { update }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/actions/verify.mjs.html b/qa/coverage/lib/actions/verify.mjs.html new file mode 100644 index 00000000..381bfded --- /dev/null +++ b/qa/coverage/lib/actions/verify.mjs.html @@ -0,0 +1,628 @@ + + + + + + Code coverage report for lib/actions/verify.mjs + + + + + + + + + +
+
+

All files / lib/actions verify.mjs

+
+ +
+ 0% + Statements + 0/99 +
+ + +
+ 0% + Branches + 0/37 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 0% + Lines + 0/96 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  CloudFormationClient,
+  DescribeStackDriftDetectionStatusCommand,
+  DetectStackDriftCommand
+} from '@aws-sdk/client-cloudformation'
+import { S3Client } from '@aws-sdk/client-s3'
+import { S3SyncClient } from 's3-sync-client'
+ 
+import { getCredentials } from './lib/get-credentials'
+ 
+const RECHECK_WAIT_TIME = 2000 // ms
+ 
+const verify = async ({ checkContent, checkSiteUp, checkStack, globalOptions, progressLogger, siteInfo }) => {
+  const checkAll = checkContent === undefined && checkSiteUp === undefined && checkStack === undefined
+  let credentials
+  Iif (checkAll || checkContent || checkStack) {
+    credentials = getCredentials(globalOptions)
+  }
+ 
+  const checks = []
+  Iif (checkAll || checkSiteUp) {
+    checks.push(doCheckSiteUp({ progressLogger, siteInfo }))
+  }
+  Iif (checkAll || checkContent) {
+    checks.push(doCheckContent({ credentials, progressLogger, siteInfo }))
+  }
+  Iif (checkAll || checkStack) {
+    checks.push(doCheckStack({ credentials, progressLogger, siteInfo }))
+  }
+ 
+  const results = await Promise.all(checks)
+ 
+  return results.reduce((acc, array) => { acc.push(...array); return acc }, [])
+}
+ 
+const doCheckContent = async ({ credentials, progressLogger, siteInfo }) => {
+  Iif (progressLogger !== undefined) {
+    progressLogger.write('Checking site content in sync...\n')
+  }
+  const { bucketName, sourcePath } = siteInfo
+ 
+  const s3Client = new S3Client({ credentials })
+  const { sync } = new S3SyncClient({ client : s3Client })
+ 
+  const checkResult = { check : 'S3 bucket and local source in sync' }
+  try {
+    const objectData = await sync(sourcePath, 's3://' + bucketName, { dryRun : true })
+ 
+    const createdCount = objectData.created.length
+    const updatedCount = objectData.updated.length
+    const deletedCount = objectData.deleted.length
+    const inSync = (createdCount + updatedCount + deletedCount) === 0
+    if (inSync === true) {
+      checkResult.status = 'success'
+      checkResult.message = 'S3 bucket and local source are up-to-date'
+    } else {
+      checkResult.status = 'failed'
+      checkResult.message =
+        `${createdCount} files to create, ${updatedCount} files to update, and ${deletedCount} files to delete`
+    }
+ 
+    return [checkResult]
+  } catch (e) {
+    checkResult.status = 'error'
+    checkResult.message = e.message
+ 
+    return [checkResult]
+  } finally {
+    Iif (progressLogger !== undefined) {
+      progressLogger.write('Site content check complete.\n')
+    }
+  }
+}
+ 
+const doCheckSiteUp = async ({ progressLogger, siteInfo }) => {
+  Iif (progressLogger !== undefined) {
+    progressLogger.write('Checking site is up...\n')
+  }
+  const { apexDomain } = siteInfo
+ 
+  try {
+    const fetchResponses = await Promise.all([
+      fetch('https://' + apexDomain),
+      fetch('https://www.' + apexDomain)
+    ])
+ 
+    const results = [
+      processFetchResults({ domain : apexDomain, fetchResponse : fetchResponses[0] }),
+      processFetchResults({ domain : 'www.' + apexDomain, fetchResponse : fetchResponses[1] })
+    ]
+ 
+    return results
+  } catch (e) {
+    return [
+      { check : `site ${apexDomain} is up`, status : 'error', message : e.message },
+      { check : `site www.${apexDomain} is up`, status : 'error', message : e.message }
+    ]
+  } finally {
+    Iif (progressLogger !== undefined) {
+      progressLogger.write('Site is up check complete.\n')
+    }
+  }
+}
+ 
+const doCheckStack = async ({ credentials, progressLogger, siteInfo }) => {
+  Iif (progressLogger !== undefined) {
+    progressLogger.write('Checking stack drift status...\n')
+  }
+ 
+  const checkResult = { check : 'Stack drift check' }
+ 
+  try {
+    const { stackName } = siteInfo
+    const cfClient = new CloudFormationClient({ credentials })
+    const detectDriftCommand = new DetectStackDriftCommand({ StackName : stackName })
+    const stackDriftOperationID = (await cfClient.send(detectDriftCommand)).StackDriftDetectionId
+ 
+    const describeStackDriftDetectionCommand = new DescribeStackDriftDetectionStatusCommand({
+      StackDriftDetectionId : stackDriftOperationID
+    })
+    let stackDriftDescribeResponse
+    let detectionStatus
+    do {
+      Iif (progressLogger !== undefined) {
+        progressLogger.write('.')
+      }
+      await new Promise(resolve => setTimeout(resolve, RECHECK_WAIT_TIME))
+ 
+      stackDriftDescribeResponse = await cfClient.send(describeStackDriftDetectionCommand)
+      detectionStatus = stackDriftDescribeResponse.DetectionStatus
+    } while (detectionStatus === 'DETECTION_IN_PROGRESS')
+ 
+    const stackDriftStatus = stackDriftDescribeResponse.StackDriftStatus
+    if (detectionStatus === 'DETECTION_FAILED') {
+      checkResult.status = 'error'
+      checkResult.message = (stackDriftStatus === 'IN_SYNC'
+        ? 'Stack as checked in sync, but: '
+        : 'Stack not in sync and: ') +
+        stackDriftDescribeResponse.DetectionStatusReason
+    } else if (stackDriftStatus === 'IN_SYNC') {
+      checkResult.status = 'success'
+      checkResult.message = stackName + ' is in sync with template'
+    } else if (stackDriftStatus === 'UNKNOWN') {
+      checkResult.status = 'error'
+      checkResult.message = stackName + ' drift status is unknown'
+    } else if (stackDriftStatus === 'DRIFTED') {
+      checkResult.status = 'failed'
+      checkResult.message =
+        `${stackDriftDescribeResponse.DriftedStackResourceCount} resources have drifted on stack ${stackName}`
+    } else {
+      checkResult.status = 'error'
+      checkResult.message = `Unexpected status '${stackDriftStatus} while checking ${stackName}`
+    }
+  } catch (e) {
+    checkResult.status = 'error'
+    checkResult.message = e.message
+  } finally {
+    Iif (progressLogger !== undefined) {
+      progressLogger.write('\nStack drift check complete.\n')
+    }
+  }
+ 
+  return [checkResult]
+}
+ 
+const processFetchResults = ({ domain, fetchResponse }) => {
+  const result = {
+    check   : `site ${domain} is up`,
+    message : `Got HTTP status ${fetchResponse.status} fetching https://${domain}.`
+  }
+ 
+  if (fetchResponse.status === 200) {
+    result.status = 'success'
+  } else {
+    result.status = 'failed'
+  }
+ 
+  return result
+}
+ 
+export { verify }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/plugins/access-logs.mjs.html b/qa/coverage/lib/plugins/access-logs.mjs.html new file mode 100644 index 00000000..f8d4bcd4 --- /dev/null +++ b/qa/coverage/lib/plugins/access-logs.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for lib/plugins/access-logs.mjs + + + + + + + + + +
+
+

All files / lib/plugins access-logs.mjs

+
+ +
+ 0% + Statements + 0/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12  +  +  +  +  +  +  +  +  +  +  + 
const config = {
+  options : { default : true, validation : (v) => typeof v === 'boolean' }
+}
+ 
+const handler = () => {
+  throw new Error('Not yet implemented')
+}
+ 
+const accessLogs = { config, handler }
+ 
+export { accessLogs }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/plugins/cloudfront-logs.mjs.html b/qa/coverage/lib/plugins/cloudfront-logs.mjs.html new file mode 100644 index 00000000..195e0c16 --- /dev/null +++ b/qa/coverage/lib/plugins/cloudfront-logs.mjs.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for lib/plugins/cloudfront-logs.mjs + + + + + + + + + +
+
+

All files / lib/plugins cloudfront-logs.mjs

+
+ +
+ 0% + Statements + 0/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
const config = {
+  options : {
+    includeCookies : { default : false, validation : (v) => typeof v === 'boolean' }
+  }
+}
+ 
+const preStackDestroyHandler = async ({ siteTemplate }) => {
+  await siteTemplate.destroySharedLoggingBucket()
+}
+ 
+const stackConfig = async ({ siteTemplate, settings }) => {
+  const { finalTemplate } = siteTemplate
+ 
+  await siteTemplate.enableSharedLoggingBucket()
+ 
+  finalTemplate.Resources.SiteCloudFrontDistribution.Properties.DistributionConfig.Logging = {
+    Bucket         : { 'Fn::GetAtt' : ['SharedLoggingBucket', 'DomainName'] },
+    IncludeCookies : settings.includeCookies,
+    Prefix         : 'cloudfront-logs/'
+  }
+}
+ 
+const cloudfrontLogs = { config, preStackDestroyHandler, stackConfig }
+ 
+export { cloudfrontLogs }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/constants.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/constants.mjs.html new file mode 100644 index 00000000..bac96970 --- /dev/null +++ b/qa/coverage/lib/plugins/contact-handler/lib/constants.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for lib/plugins/contact-handler/lib/constants.mjs + + + + + + + + + +
+
+

All files / lib/plugins/contact-handler/lib constants.mjs

+
+ +
+ 0% + Statements + 0/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4  +  +  + 
export const CONTACT_EMAILER_ZIP_NAME = 'contact-emailer-lambda.zip'
+export const CONTACT_HANDLER_ZIP_NAME = 'contact-handler-lambda.zip'
+export const REQUEST_SIGNER_ZIP_NAME = 'request-signer-lambda.zip'
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs.html new file mode 100644 index 00000000..a029be7f --- /dev/null +++ b/qa/coverage/lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs + + + + + + + + + +
+
+

All files / lib/plugins/contact-handler/lib determine-lambda-function-name.mjs

+
+ +
+ 0% + Statements + 0/23 +
+ + +
+ 0% + Branches + 0/20 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { v4 as uuidv4 } from 'uuid'
+ 
+import { LambdaClient, GetFunctionCommand } from '@aws-sdk/client-lambda'
+ 
+import { progressLogger } from '../../../shared/progress-logger'
+ 
+const determineLambdaFunctionName = async ({ baseName, credentials, siteTemplate }) => {
+  const { siteInfo } = siteTemplate
+  const { region } = siteInfo
+  let currentName = baseName
+ 
+  const lambdaClient = new LambdaClient({ credentials, region })
+  while (true) {
+    progressLogger?.write(`Checking if lambda function name '${currentName}' is free...`)
+    const getFunctionCommand = new GetFunctionCommand({ FunctionName : currentName })
+    try {
+      await lambdaClient.send(getFunctionCommand)
+    } catch (e) {
+      if (e.name === 'NotFound' || e.$metadata?.httpStatusCode === 404) {
+        progressLogger?.write('FREE\n')
+        return currentName
+      } else {
+        progressLogger?.write('\n')
+        throw e
+      }
+    }
+    progressLogger?.write('NOT free\n')
+    const nameSalt = uuidv4().slice(0, 8)
+    currentName = currentName.replace(/-[A-F0-9]{8}$/i, '')
+    currentName += '-' + nameSalt
+  }
+}
+ 
+export { determineLambdaFunctionName }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/index.html b/qa/coverage/lib/plugins/contact-handler/lib/index.html new file mode 100644 index 00000000..79f3404f --- /dev/null +++ b/qa/coverage/lib/plugins/contact-handler/lib/index.html @@ -0,0 +1,221 @@ + + + + + + Code coverage report for lib/plugins/contact-handler/lib + + + + + + + + + +
+
+

All files lib/plugins/contact-handler/lib

+
+ +
+ 0% + Statements + 0/120 +
+ + +
+ 0% + Branches + 0/28 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 0% + Lines + 0/120 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
constants.mjs +
+
0%0/3100%0/0100%0/00%0/3
determine-lambda-function-name.mjs +
+
0%0/230%0/200%0/10%0/23
setup-contact-emailer.mjs +
+
0%0/180%0/40%0/10%0/18
setup-contact-form-table.mjs +
+
0%0/7100%0/00%0/10%0/7
setup-contact-handler.mjs +
+
0%0/20100%0/00%0/10%0/20
setup-request-signer.mjs +
+
0%0/10100%0/00%0/10%0/10
stage-lambda-function-zip-files.mjs +
+
0%0/280%0/20%0/20%0/28
update-cloud-front-distribution.mjs +
+
0%0/110%0/20%0/10%0/11
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-emailer.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-emailer.mjs.html new file mode 100644 index 00000000..29754e28 --- /dev/null +++ b/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-emailer.mjs.html @@ -0,0 +1,439 @@ + + + + + + Code coverage report for lib/plugins/contact-handler/lib/setup-contact-emailer.mjs + + + + + + + + + +
+
+

All files / lib/plugins/contact-handler/lib setup-contact-emailer.mjs

+
+ +
+ 0% + Statements + 0/18 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { CONTACT_EMAILER_ZIP_NAME } from './constants'
+import { determineLambdaFunctionName } from './determine-lambda-function-name'
+ 
+const setupContactEmailer = async ({ credentials, lambdaFunctionsBucketName, settings, siteTemplate }) => {
+  const { finalTemplate } = siteTemplate
+  const contactHandlerFromEmail = settings.emailFrom
+  const contactHandlerTargetEmail = settings.emailTo
+ 
+  Iif (contactHandlerFromEmail === undefined && contactHandlerTargetEmail !== undefined) {
+    throw new Error("Found site setting for 'emailTo', but no 'emailFrom'; 'emailFrom' must be set to activate email functionality.")
+  }
+ 
+  // setup stream on table
+  finalTemplate.Resources.ContactHandlerDynamoDB.Properties.StreamSpecification = {
+    StreamViewType : 'NEW_IMAGE'
+  }
+ 
+  const emailerFunctionName = await determineLambdaFunctionName({
+    baseName : lambdaFunctionsBucketName + '-contact-emailer',
+    credentials,
+    siteTemplate
+  })
+  const emailerFunctionLogGroupName = emailerFunctionName
+ 
+  finalTemplate.Resources.ContactEmailerLogGroup = {
+    Type       : 'AWS::Logs::LogGroup',
+    Properties : {
+      LogGroupClass   : 'STANDARD', // TODO: support option for INFREQUENT_ACCESS
+      LogGroupName    : emailerFunctionLogGroupName,
+      RetentionInDays : 180 // TODO: support options
+    }
+  }
+ 
+  finalTemplate.Resources.ContactEmailerRole = {
+    Type       : 'AWS::IAM::Role',
+    Properties : {
+      AssumeRolePolicyDocument : {
+        Version   : '2012-10-17',
+        Statement : [
+          {
+            Effect    : 'Allow',
+            Principal : {
+              Service : ['lambda.amazonaws.com']
+            },
+            Action : ['sts:AssumeRole']
+          }
+        ]
+      },
+      Path     : '/',
+      Policies : [
+        {
+          PolicyName     : emailerFunctionName,
+          PolicyDocument : {
+            Version   : '2012-10-17',
+            Statement : [
+              {
+                Effect   : 'Allow',
+                Action   : ['ses:SendEmail', 'ses:SendEmailRaw', 'ses:GetSendQuota', 'ses:GetSendStatistics'],
+                Resource : '*'
+              }
+            ]
+          }
+        }
+      ],
+      ManagedPolicyArns : [
+        // AWSLambdaBasicExecutionRole: allows logging to CloudWatch
+        'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole',
+        // Allows reading from DynamoDB streams
+        'arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole'
+      ]
+    }
+  }
+ 
+  finalTemplate.Resources.ContactEmailerFunction = {
+    Type       : 'AWS::Lambda::Function',
+    DependsOn  : ['ContactEmailerRole', 'ContactEmailerLogGroup'],
+    Properties : {
+      FunctionName : emailerFunctionName,
+      Handler      : 'index.handler',
+      Role         : { 'Fn::GetAtt' : ['ContactEmailerRole', 'Arn'] },
+      Runtime      : 'nodejs20.x',
+      MemorySize   : 128,
+      Timeout      : 5,
+      Code         : {
+        S3Bucket : lambdaFunctionsBucketName,
+        S3Key    : CONTACT_EMAILER_ZIP_NAME
+      },
+      Environment : {
+        Variables : {
+          EMAIL_HANDLER_SOURCE_EMAIL : contactHandlerFromEmail
+        }
+      },
+      LoggingConfig : {
+        ApplicationLogLevel : 'INFO', // support options
+        LogFormat           : 'JSON', // support options
+        LogGroup            : emailerFunctionLogGroupName,
+        SystemLogLevel      : 'INFO' // support options
+      }
+    }
+  }
+ 
+  finalTemplate.Resources.ContactEmailerEventsSource = {
+    Type       : 'AWS::Lambda::EventSourceMapping',
+    DependsOn  : ['ContactEmailerFunction'],
+    Properties : {
+      FunctionName     : { 'Fn::GetAtt' : ['ContactEmailerFunction', 'Arn'] },
+      EventSourceArn   : { 'Fn::GetAtt' : ['ContactHandlerDynamoDB', 'StreamArn'] },
+      StartingPosition : 'LATEST'
+    }
+  }
+ 
+  Iif (contactHandlerTargetEmail !== undefined) {
+    finalTemplate.Resources.ContactEmailerFunction.Properties.Environment.Variables.EMAIL_HANDLER_TARGET_EMAIL =
+      contactHandlerTargetEmail
+  }
+}
+ 
+export { setupContactEmailer }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-form-table.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-form-table.mjs.html new file mode 100644 index 00000000..c5ab2b7f --- /dev/null +++ b/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-form-table.mjs.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for lib/plugins/contact-handler/lib/setup-contact-form-table.mjs + + + + + + + + + +
+
+

All files / lib/plugins/contact-handler/lib setup-contact-form-table.mjs

+
+ +
+ 0% + Statements + 0/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
const setupContactFormTable = ({ siteInfo, siteTemplate }) => {
+  const { finalTemplate, resourceTypes } = siteTemplate
+  const { bucketName } = siteInfo
+ 
+  finalTemplate.Resources.ContactHandlerDynamoDB = {
+    Type       : 'AWS::DynamoDB::Table',
+    Properties : {
+      TableName            : bucketName + '-ContactFormEntries',
+      AttributeDefinitions : [
+        { AttributeName : 'SubmissionID', AttributeType : 'S' },
+        { AttributeName : 'SubmissionTime', AttributeType : 'S' }
+      ],
+      KeySchema : [
+        { AttributeName : 'SubmissionID', KeyType : 'HASH' },
+        { AttributeName : 'SubmissionTime', KeyType : 'RANGE' }
+      ],
+      BillingMode : 'PAY_PER_REQUEST'
+    }
+  }
+ 
+  finalTemplate.Outputs.ContactHandlerDynamoDB = { Value : { Ref : 'ContactHandlerDynamoDB' } }
+  resourceTypes['DynamoDB::Table'] = true
+}
+ 
+export { setupContactFormTable }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-handler.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-handler.mjs.html new file mode 100644 index 00000000..f0078160 --- /dev/null +++ b/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-handler.mjs.html @@ -0,0 +1,454 @@ + + + + + + Code coverage report for lib/plugins/contact-handler/lib/setup-contact-handler.mjs + + + + + + + + + +
+
+

All files / lib/plugins/contact-handler/lib setup-contact-handler.mjs

+
+ +
+ 0% + Statements + 0/20 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { CONTACT_HANDLER_ZIP_NAME } from './constants'
+import { determineLambdaFunctionName } from './determine-lambda-function-name'
+ 
+const setupContactHandler = async ({ credentials, lambdaFunctionsBucketName, siteInfo, siteTemplate }) => {
+  const { accountID, bucketName } = siteInfo
+  const { finalTemplate, resourceTypes } = siteTemplate
+ 
+  const contactHandlerFunctionName = await determineLambdaFunctionName({
+    baseName : lambdaFunctionsBucketName + '-contact-handler',
+    credentials,
+    siteTemplate
+  })
+ 
+  const contactHandlerLogGroupName = contactHandlerFunctionName
+  const contactHandlerPolicyName = contactHandlerFunctionName
+ 
+  finalTemplate.Resources.ContactHandlerRole = {
+    Type       : 'AWS::IAM::Role',
+    Properties : {
+      AssumeRolePolicyDocument : {
+        Version   : '2012-10-17',
+        Statement : [
+          {
+            Effect    : 'Allow',
+            Principal : {
+              Service : ['lambda.amazonaws.com']
+            },
+            Action : ['sts:AssumeRole']
+          }
+        ]
+      },
+      Path     : '/',
+      Policies : [
+        {
+          PolicyName     : contactHandlerPolicyName,
+          PolicyDocument : {
+            Version   : '2012-10-17',
+            Statement : [
+              {
+                Effect   : 'Allow',
+                Action   : '*',
+                Resource : '*'
+              }
+            ]
+          }
+        }
+      ]
+    }
+  }
+  finalTemplate.Outputs.ContactHandlerRole = { Value : { Ref : 'ContactHandlerRole' } }
+  resourceTypes['IAM::Role'] = true
+ 
+  finalTemplate.Resources.ContactHandlerLogGroup = {
+    Type       : 'AWS::Logs::LogGroup',
+    Properties : {
+      LogGroupClass   : 'STANDARD', // TODO: support option for INFREQUENT_ACCESS
+      LogGroupName    : contactHandlerLogGroupName,
+      RetentionInDays : 180 // TODO: support options
+    }
+  }
+ 
+  finalTemplate.Resources.ContactHandlerLambdaFunction = {
+    Type       : 'AWS::Lambda::Function',
+    DependsOn  : ['ContactHandlerRole', 'ContactHandlerLogGroup'],
+    Properties : {
+      FunctionName : contactHandlerFunctionName,
+      Description  : 'Handles contact form submissions; creates DynamoDB entry and sends email.',
+      Code         : {
+        S3Bucket : lambdaFunctionsBucketName,
+        S3Key    : CONTACT_HANDLER_ZIP_NAME
+      },
+      Handler     : 'index.handler',
+      Role        : { 'Fn::GetAtt' : ['ContactHandlerRole', 'Arn'] },
+      Runtime     : 'nodejs20.x',
+      MemorySize  : 128,
+      Timeout     : 5,
+      Environment : {
+        Variables : { TABLE_PREFIX : bucketName }
+      },
+      LoggingConfig : {
+        ApplicationLogLevel : 'INFO', // support options
+        LogFormat           : 'JSON', // support options
+        LogGroup            : contactHandlerLogGroupName,
+        SystemLogLevel      : 'INFO' // support options
+      }
+    }
+  }
+  finalTemplate.Outputs.ContactHandlerLambdaFunction = { Value : { Ref : 'ContactHandlerLambdaFunction' } }
+  resourceTypes['Lambda::Function'] = true
+ 
+  finalTemplate.Resources.ContactHandlerLambdaPermission = {
+    Type       : 'AWS::Lambda::Permission',
+    DependsOn  : ['SiteCloudFrontDistribution', 'ContactHandlerLambdaFunction'],
+    Properties : {
+      Action              : 'lambda:InvokeFunctionUrl',
+      Principal           : 'cloudfront.amazonaws.com',
+      FunctionName        : contactHandlerFunctionName,
+      FunctionUrlAuthType : 'AWS_IAM',
+      SourceArn           : {
+        'Fn::Join' : ['', [`arn:aws:cloudfront::${accountID}:distribution/`, { 'Fn::GetAtt' : ['SiteCloudFrontDistribution', 'Id'] }]]
+      }
+    }
+  }
+ 
+  finalTemplate.Resources.ContactHandlerLambdaURL = {
+    Type       : 'AWS::Lambda::Url',
+    DependsOn  : ['ContactHandlerLambdaFunction'],
+    Properties : {
+      AuthType : 'AWS_IAM',
+      Cors     : {
+        AllowCredentials : true,
+        AllowHeaders     : ['*'],
+        AllowMethods     : ['POST'],
+        AllowOrigins     : ['*']
+      },
+      TargetFunctionArn : { 'Fn::GetAtt' : ['ContactHandlerLambdaFunction', 'Arn'] }
+    }
+  }
+  finalTemplate.Outputs.ContactHandlerLambdaURL = { Value : { Ref : 'ContactHandlerLambdaURL' } }
+  resourceTypes['Lambda::Url'] = true
+}
+ 
+export { setupContactHandler }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/setup-request-signer.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/setup-request-signer.mjs.html new file mode 100644 index 00000000..dfca5b11 --- /dev/null +++ b/qa/coverage/lib/plugins/contact-handler/lib/setup-request-signer.mjs.html @@ -0,0 +1,352 @@ + + + + + + Code coverage report for lib/plugins/contact-handler/lib/setup-request-signer.mjs + + + + + + + + + +
+
+

All files / lib/plugins/contact-handler/lib setup-request-signer.mjs

+
+ +
+ 0% + Statements + 0/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { REQUEST_SIGNER_ZIP_NAME } from './constants'
+import { determineLambdaFunctionName } from './determine-lambda-function-name'
+ 
+const setupRequestSigner = async ({ credentials, lambdaFunctionsBucketName, siteTemplate }) => {
+  const { finalTemplate } = siteTemplate
+ 
+  finalTemplate.Resources.RequestSignerRole = {
+    Type       : 'AWS::IAM::Role',
+    DependsOn  : ['ContactHandlerLambdaFunction'],
+    Properties : {
+      AssumeRolePolicyDocument : {
+        Version   : '2012-10-17',
+        Statement : [
+          {
+            Effect    : 'Allow',
+            Principal : { Service : ['lambda.amazonaws.com', 'edgelambda.amazonaws.com'] },
+            Action    : ['sts:AssumeRole']
+          }
+        ]
+      },
+      Path     : '/',
+      Policies : [
+        {
+          PolicyName     : lambdaFunctionsBucketName + '-request-signer',
+          PolicyDocument : {
+            Version   : '2012-10-17',
+            Statement : [
+              {
+                Effect   : 'Allow',
+                Action   : 'lambda:InvokeFunctionUrl',
+                Resource : { 'Fn::GetAtt' : ['ContactHandlerLambdaFunction', 'Arn'] }
+              }
+            ]
+          }
+        }
+      ],
+      // AWSLambdaBasicExecutionRole: allows logging to CloudWatch
+      ManagedPolicyArns : ['arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole']
+    }
+  }
+ 
+  const signFunctionHandlerName = await determineLambdaFunctionName({
+    baseName : lambdaFunctionsBucketName + '-request-signer',
+    credentials,
+    siteTemplate
+  })
+ 
+  finalTemplate.Resources.RequestSignerLogGroup = {
+    Type       : 'AWS::Logs::LogGroup',
+    Properties : {
+      LogGroupClass   : 'STANDARD', // TODO: support option for INFREQUENT_ACCESS
+      LogGroupName    : signFunctionHandlerName,
+      RetentionInDays : 180 // TODO: support options
+    }
+  }
+ 
+  finalTemplate.Resources.SignRequestFunction = {
+    Type       : 'AWS::Lambda::Function',
+    DependsOn  : ['RequestSignerRole'],
+    Properties : {
+      FunctionName : signFunctionHandlerName,
+      Handler      : 'index.handler',
+      Role         : { 'Fn::GetAtt' : ['RequestSignerRole', 'Arn'] },
+      Runtime      : 'nodejs20.x',
+      MemorySize   : 128,
+      Timeout      : 5,
+      Code         : {
+        S3Bucket : lambdaFunctionsBucketName,
+        S3Key    : REQUEST_SIGNER_ZIP_NAME
+      },
+      LoggingConfig : {
+        ApplicationLogLevel : 'INFO', // support options
+        LogFormat           : 'JSON', // support options
+        LogGroup            : signFunctionHandlerName,
+        SystemLogLevel      : 'INFO' // support options
+      }
+    }
+  }
+ 
+  finalTemplate.Resources.SignRequestFunctionVersion = {
+    Type       : 'AWS::Lambda::Version',
+    DependsOn  : ['SignRequestFunction'],
+    Properties : {
+      FunctionName : { 'Fn::GetAtt' : ['SignRequestFunction', 'Arn'] }
+    }
+  }
+}
+ 
+export { setupRequestSigner }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs.html new file mode 100644 index 00000000..71b21292 --- /dev/null +++ b/qa/coverage/lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs.html @@ -0,0 +1,325 @@ + + + + + + Code coverage report for lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs + + + + + + + + + +
+
+

All files / lib/plugins/contact-handler/lib stage-lambda-function-zip-files.mjs

+
+ +
+ 0% + Statements + 0/28 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { join as pathJoin } from 'node:path'
+import { createReadStream } from 'node:fs'
+ 
+import { CreateBucketCommand, PutObjectCommand, S3Client } from '@aws-sdk/client-s3'
+ 
+import { CONTACT_EMAILER_ZIP_NAME, CONTACT_HANDLER_ZIP_NAME, REQUEST_SIGNER_ZIP_NAME } from './constants'
+import { convertDomainToBucketName } from '../../../shared/convert-domain-to-bucket-name'
+import { determineBucketName } from '../../../shared/determine-bucket-name'
+// jsdoc wants this, but it causes a circular dependency
+// import { SiteTemplate } from '../../../shared/site-template'
+ 
+/* eslint-disable  jsdoc/no-undefined-types */ // See note above re. SiteTemplate
+/**
+ * Stages the zipped Lambda function packages on a common S3 bucket.
+ * @param {object} input - Destructured input argument.
+ * @param {boolean} input.enableEmail - True if the site is to be built with email on contact form submission support.
+ * @param {object} input.siteInfo - See {@link SiteTemplate} for details.
+ * @returns {string} The Lambda function bucket name.
+ */ /* eslint-enable  jsdoc/no-undefined-types */
+const stageLambdaFunctionZipFiles = async ({ credentials, enableEmail, settings, siteInfo }) => {
+  process.stdout.write('Staging Lambda function zip files...\n')
+ 
+  let { lambdaFunctionsBucket } = settings
+  const { apexDomain, region } = siteInfo
+ 
+  const s3Client = new S3Client({ credentials, region })
+ 
+  Iif (lambdaFunctionsBucket === undefined) {
+    lambdaFunctionsBucket = convertDomainToBucketName(apexDomain) + '-lambda-functions'
+    lambdaFunctionsBucket =
+      await determineBucketName({
+        bucketName : lambdaFunctionsBucket,
+        credentials,
+        findName   : true,
+        s3Client,
+        siteInfo
+      })
+ 
+    const createBucketCommand = new CreateBucketCommand({
+      ACL    : 'private',
+      Bucket : lambdaFunctionsBucket
+    })
+    await s3Client.send(createBucketCommand)
+  }
+  settings.lambdaFunctionsBucket = lambdaFunctionsBucket
+ 
+  const putCommands = [
+    putZipFile({ bucketName : lambdaFunctionsBucket, fileName : CONTACT_HANDLER_ZIP_NAME, s3Client }),
+    putZipFile({ bucketName : lambdaFunctionsBucket, fileName : REQUEST_SIGNER_ZIP_NAME, s3Client })
+  ]
+ 
+  Iif (enableEmail === true) {
+    putCommands.push(putZipFile({
+      bucketName : lambdaFunctionsBucket,
+      fileName   : CONTACT_EMAILER_ZIP_NAME,
+      s3Client
+    }))
+  }
+ 
+  await Promise.all(putCommands)
+ 
+  return lambdaFunctionsBucket
+}
+ 
+const putZipFile = async ({ bucketName, fileName, s3Client }) => {
+  // when built, everything sits in './dist' together
+  const zipPath = pathJoin(__dirname, fileName)
+  const readStream = createReadStream(zipPath)
+ 
+  const putObjectCommand = new PutObjectCommand({
+    Body        : readStream,
+    Bucket      : bucketName,
+    Key         : fileName,
+    ContentType : 'application/zip'
+  })
+ 
+  await s3Client.send(putObjectCommand)
+}
+ 
+export { stageLambdaFunctionZipFiles }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs.html new file mode 100644 index 00000000..d3971662 --- /dev/null +++ b/qa/coverage/lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs.html @@ -0,0 +1,217 @@ + + + + + + Code coverage report for lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs + + + + + + + + + +
+
+

All files / lib/plugins/contact-handler/lib update-cloud-front-distribution.mjs

+
+ +
+ 0% + Statements + 0/11 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
const updateCloudFrontDistribution = ({ settings, siteTemplate }) => {
+  const { finalTemplate } = siteTemplate
+  const contactHandlerPath = settings.path
+ 
+  finalTemplate.Resources.SiteCloudFrontDistribution.DependsOn.push('ContactHandlerLambdaURL')
+ 
+  const cfOrigins = finalTemplate.Resources.SiteCloudFrontDistribution.Properties.DistributionConfig.Origins
+  cfOrigins.push({
+    Id         : 'ContactHandlerLambdaOrigin',
+    DomainName : { // strip the https://
+      'Fn::Select' : [2, { 'Fn::Split' : ['/', { 'Fn::GetAtt' : ['ContactHandlerLambdaURL', 'FunctionUrl'] }] }]
+    },
+    CustomOriginConfig : {
+      HTTPSPort            : 443,
+      OriginProtocolPolicy : 'https-only'
+    }
+  })
+ 
+  const cfCacheBehaviors = finalTemplate.Resources.SiteCloudFrontDistribution.Properties.DistributionConfig.CacheBehaviors || []
+  cfCacheBehaviors.push({
+    AllowedMethods             : ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT'],
+    CachePolicyId              : '4135ea2d-6df8-44a3-9df3-4b5a84be39ad', // caching disabled managed policy
+    PathPattern                : contactHandlerPath,
+    TargetOriginId             : 'ContactHandlerLambdaOrigin',
+    ViewerProtocolPolicy       : 'https-only',
+    LambdaFunctionAssociations : [
+      {
+        EventType         : 'origin-request',
+        IncludeBody       : true,
+        LambdaFunctionARN : {
+          'Fn::Join' : [':', [
+            { 'Fn::GetAtt' : ['SignRequestFunction', 'Arn'] },
+            { 'Fn::GetAtt' : ['SignRequestFunctionVersion', 'Version'] }]
+          ]
+        }
+      }
+    ]
+  })
+ 
+  finalTemplate.Resources.SiteCloudFrontDistribution.Properties.DistributionConfig.CacheBehaviors = cfCacheBehaviors
+  finalTemplate.Resources.SiteCloudFrontDistribution.DependsOn.push('SignRequestFunctionVersion')
+}
+ 
+export { updateCloudFrontDistribution }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/plugins/index.html b/qa/coverage/lib/plugins/index.html new file mode 100644 index 00000000..e337acf3 --- /dev/null +++ b/qa/coverage/lib/plugins/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for lib/plugins + + + + + + + + + +
+
+

All files lib/plugins

+
+ +
+ 0% + Statements + 0/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 0% + Lines + 0/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
access-logs.mjs +
+
0%0/5100%0/00%0/20%0/5
cloudfront-logs.mjs +
+
0%0/9100%0/00%0/30%0/9
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/shared/convert-domain-to-bucket-name.js.html b/qa/coverage/lib/shared/convert-domain-to-bucket-name.js.html new file mode 100644 index 00000000..67f3ed90 --- /dev/null +++ b/qa/coverage/lib/shared/convert-domain-to-bucket-name.js.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for lib/shared/convert-domain-to-bucket-name.js + + + + + + + + + +
+
+

All files / lib/shared convert-domain-to-bucket-name.js

+
+ +
+ 0% + Statements + 0/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4  +  +  + 
const convertDomainToBucketName = (domain) => domain.replaceAll(/\./g, '-').replaceAll(/[^a-z0-9-]/g, 'x')
+ 
+export { convertDomainToBucketName }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/shared/determine-bucket-name.mjs.html b/qa/coverage/lib/shared/determine-bucket-name.mjs.html new file mode 100644 index 00000000..a03c2bb2 --- /dev/null +++ b/qa/coverage/lib/shared/determine-bucket-name.mjs.html @@ -0,0 +1,247 @@ + + + + + + Code coverage report for lib/shared/determine-bucket-name.mjs + + + + + + + + + +
+
+

All files / lib/shared determine-bucket-name.mjs

+
+ +
+ 0% + Statements + 0/36 +
+ + +
+ 0% + Branches + 0/13 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { v4 as uuidv4 } from 'uuid'
+ 
+import { S3Client, HeadBucketCommand } from '@aws-sdk/client-s3'
+import { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts'
+ 
+import { convertDomainToBucketName } from './convert-domain-to-bucket-name'
+import { progressLogger } from './progress-logger'
+ 
+const determineBucketName = async (args) => {
+  const { apexDomain, credentials, findName = false, siteInfo } = args
+  let { bucketName, s3Client } = args
+ 
+  Iif (bucketName === undefined) {
+    bucketName = siteInfo.bucketName || convertDomainToBucketName(apexDomain)
+  }
+ 
+  let { accountID } = siteInfo
+  Iif (accountID === undefined) {
+    progressLogger.write('Getting effective account ID...\n')
+    const response = await new STSClient({ credentials }).send(new GetCallerIdentityCommand({}))
+    accountID = response.Account
+    siteInfo.accountID = accountID
+  }
+ 
+  s3Client = s3Client || new S3Client({ credentials })
+ 
+  while (true) {
+    progressLogger.write(`Checking bucket '${bucketName}' is free... `)
+ 
+    const input = { Bucket : bucketName, ExpectedBucketOwner : accountID }
+ 
+    const command = new HeadBucketCommand(input)
+    try {
+      await s3Client.send(command)
+      Iif (findName !== true) {
+        throw new Error(`Account already owns bucket '${bucketName}'; delete or specify alternate bucket name.`)
+      }
+    } catch (e) {
+      if (e.name === 'NotFound') {
+        progressLogger.write('FREE\n')
+        return bucketName
+      } else Iif (findName !== true || e.name === 'CredentialsProviderError') {
+        progressLogger.write('\n')
+        throw e
+      }
+    }
+    progressLogger.write('NOT free\n')
+    const bucketSalt = uuidv4().slice(0, 8)
+    bucketName = bucketName.replace(/-[A-F0-9]{8}$/i, '')
+    bucketName += '-' + bucketSalt
+  }
+}
+ 
+export { determineBucketName }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/shared/determine-oac-name.mjs.html b/qa/coverage/lib/shared/determine-oac-name.mjs.html new file mode 100644 index 00000000..52ccb633 --- /dev/null +++ b/qa/coverage/lib/shared/determine-oac-name.mjs.html @@ -0,0 +1,235 @@ + + + + + + Code coverage report for lib/shared/determine-oac-name.mjs + + + + + + + + + +
+
+

All files / lib/shared determine-oac-name.mjs

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/12 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { v4 as uuidv4 } from 'uuid'
+ 
+import { CloudFrontClient, ListOriginAccessControlsCommand } from '@aws-sdk/client-cloudfront'
+ 
+import { progressLogger } from './progress-logger'
+ 
+const determineOACName = async ({ baseName, credentials, siteInfo }) => {
+  const { region } = siteInfo
+  let currentName = baseName
+ 
+  // there is on way to get an OAC based on teh name alone, you need the ID (ARN?) which we don't have. So, we have to
+  // list the OACs and search for one with the given name
+  const allOACNames = await getAllOACNames({ credentials, region })
+ 
+  while (true) {
+    progressLogger?.write(`Checking if OAC name '${currentName}' is free... `)
+    if (allOACNames.includes(currentName)) {
+      progressLogger?.write('NOT free\n')
+      const nameSalt = uuidv4().slice(0, 8)
+      currentName = currentName.replace(/-[A-F0-9]{8}$/i, '')
+      currentName += '-' + nameSalt
+    } else {
+      progressLogger?.write('FREE\n')
+      return currentName
+    }
+  }
+}
+ 
+const getAllOACNames = async ({ credentials, region }) => {
+  const cloudfrontClient = new CloudFrontClient({ credentials, region })
+  let currentMarker
+  const result = []
+  while (true) {
+    const listOACCommand = new ListOriginAccessControlsCommand({
+      Marker : currentMarker
+    })
+ 
+    const oacListResponse = await cloudfrontClient.send(listOACCommand)
+    const items = oacListResponse.OriginAccessControlList.Items
+ 
+    result.push(...items.map(({ Name : name }) => name))
+ 
+    currentMarker = oacListResponse.OriginAccessControlList.NextMarker
+    Iif (currentMarker === undefined) {
+      return result
+    }
+  }
+}
+ 
+export { determineOACName }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/shared/index.html b/qa/coverage/lib/shared/index.html new file mode 100644 index 00000000..e641b1bb --- /dev/null +++ b/qa/coverage/lib/shared/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for lib/shared + + + + + + + + + +
+
+

All files lib/shared

+
+ +
+ 0% + Statements + 0/120 +
+ + +
+ 0% + Branches + 0/36 +
+ + +
+ 0% + Functions + 0/13 +
+ + +
+ 0% + Lines + 0/116 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
convert-domain-to-bucket-name.js +
+
0%0/3100%0/00%0/10%0/1
determine-bucket-name.mjs +
+
0%0/360%0/130%0/10%0/36
determine-oac-name.mjs +
+
0%0/290%0/120%0/30%0/28
progress-logger.mjs +
+
0%0/1100%0/0100%0/00%0/1
site-template.mjs +
+
0%0/510%0/110%0/80%0/50
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/shared/progress-logger.mjs.html b/qa/coverage/lib/shared/progress-logger.mjs.html new file mode 100644 index 00000000..667ea4eb --- /dev/null +++ b/qa/coverage/lib/shared/progress-logger.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for lib/shared/progress-logger.mjs + + + + + + + + + +
+
+

All files / lib/shared progress-logger.mjs

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4  +  +  + 
const progressLogger = process.stdout
+ 
+export { progressLogger }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/lib/shared/site-template.mjs.html b/qa/coverage/lib/shared/site-template.mjs.html new file mode 100644 index 00000000..709dd393 --- /dev/null +++ b/qa/coverage/lib/shared/site-template.mjs.html @@ -0,0 +1,802 @@ + + + + + + Code coverage report for lib/shared/site-template.mjs + + + + + + + + + +
+
+

All files / lib/shared site-template.mjs

+
+ +
+ 0% + Statements + 0/51 +
+ + +
+ 0% + Branches + 0/11 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 0% + Lines + 0/50 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import yaml from 'js-yaml'
+ 
+import { S3Client, DeleteBucketCommand } from '@aws-sdk/client-s3'
+ 
+import { determineBucketName } from './determine-bucket-name'
+import { determineOACName } from './determine-oac-name'
+import * as plugins from '../plugins'
+import { progressLogger } from './progress-logger'I
+ 
+/**
+ * Class encapsulating site stack configuration. Any enabled plugins are loaded and processed by this class.
+ * @class
+ */
+const SiteTemplate = class {
+  /* eslint-disable jsdoc/check-param-names */ // eslint doesn't believe our 2nd level destructure documentation
+  /**
+   * Creates a new {@link SiteTemplate}.
+   * @param {object} input - Destructured input argument.
+   * @param {object} input.credentials - credentials for AWS SDK clients.
+   * @param {object} input.siteInfo - Collection of site related data elements.
+   * @param {string} input.siteInfo.apexDomain - the sites apex domain
+   * @param {string} input.siteInfo.sourcePath - the path to the site's static source files, may be absolute or CWD
+   *   relative
+   * @param {string} input.siteInfo.region - the region of the site
+   * @param {string} input.siteInfo.certificateArn {string} - the AWS ARN for the site's SSL certificate
+   * @param {string} input.siteInfo.accountID - the ID of the account under which the stack resides (not ARN)
+   * @param {string} input.siteInfo.bucketName - the name of the bucket where the site's static files are stored
+   * @param {string} input.siteInfo.stackName - the name of the stack
+   * @param {string} input.siteInfo.stackArn - the stack's ARN
+   * @param {string} input.siteInfo.cloudFrontDistributionID - the stack's CloudfFront ID (not ARN)
+   * @param {object} input.siteInfo.pluginSettings - collection of plugin settings; settings are grouped/keyed by the
+   *   plugin's name; setting values are dependent on the plugin
+   * @param credentials.siteInfo
+   */ /* eslint-enable jsdoc/check-param-names */
+  constructor ({ credentials, siteInfo }) {
+    this.siteInfo = siteInfo
+    this.credentials = credentials
+ 
+    this.resourceTypes = { 'CloudFormation::Distribution' : true, 'S3::Bucket' : true }
+    this.finalTemplate = this.baseTemplate
+  }
+ 
+  async initializeTemplate () {
+    const { accountID, apexDomain, bucketName, certificateArn, region } = this.siteInfo
+ 
+    const oacName = await determineOACName({
+      baseName    : `${bucketName}-OAC`,
+      credentials : this.credentials,
+      siteInfo    : this.siteInfo
+    })
+ 
+    this.finalTemplate = {
+      Resources : {
+        SiteS3Bucket : {
+          Type       : 'AWS::S3::Bucket',
+          Properties : {
+            AccessControl : 'Private',
+            BucketName    : bucketName
+          }
+        },
+        SiteCloudFrontOriginAccessControl : {
+          Type       : 'AWS::CloudFront::OriginAccessControl',
+          Properties : {
+            OriginAccessControlConfig : {
+              Description                   : 'Origin Access Control (OAC) allowing CloudFront Distribution to access site S3 bucket.',
+              Name                          : oacName,
+              OriginAccessControlOriginType : 's3',
+              SigningBehavior               : 'always',
+              SigningProtocol               : 'sigv4'
+            }
+          }
+        },
+        SiteCloudFrontDistribution : {
+          Type       : 'AWS::CloudFront::Distribution',
+          DependsOn  : ['SiteS3Bucket'],
+          Properties : {
+            DistributionConfig : {
+              Origins : [
+                {
+                  DomainName     : `${bucketName}.s3.${region}.amazonaws.com`,
+                  Id             : 'static-hosting',
+                  S3OriginConfig : {
+                    OriginAccessIdentity : ''
+                  },
+                  OriginAccessControlId : { 'Fn::GetAtt' : ['SiteCloudFrontOriginAccessControl', 'Id'] }
+                }
+              ],
+              Enabled              : true,
+              DefaultRootObject    : 'index.html',
+              CustomErrorResponses : [
+                { ErrorCode : 403, ResponseCode : 200, ResponsePagePath : '/index.html' },
+                { ErrorCode : 404, ResponseCode : 200, ResponsePagePath : '/index.html' }
+              ],
+              HttpVersion       : 'http2',
+              Aliases           : [apexDomain, `www.${apexDomain}`],
+              ViewerCertificate : {
+                AcmCertificateArn      : certificateArn,
+                MinimumProtocolVersion : 'TLSv1.2_2021',
+                SslSupportMethod       : 'sni-only'
+              },
+              DefaultCacheBehavior : {
+                AllowedMethods       : ['GET', 'HEAD'],
+                CachePolicyId        : '658327ea-f89d-4fab-a63d-7e88639e58f6', // CachingOptimized cache policy ID
+                Compress             : true,
+                TargetOriginId       : 'static-hosting',
+                ViewerProtocolPolicy : 'redirect-to-https'
+              }
+            }
+          }
+        }, // SiteCloudFrontDistribution
+        SiteBucketPolicy : {
+          Type       : 'AWS::S3::BucketPolicy',
+          DependsOn  : ['SiteS3Bucket', 'SiteCloudFrontDistribution'],
+          Properties : {
+            Bucket         : bucketName,
+            PolicyDocument : {
+              Version   : '2012-10-17',
+              Statement : [
+                {
+                  Effect    : 'Allow',
+                  Principal : {
+                    Service : 'cloudfront.amazonaws.com'
+                  },
+                  Action    : 's3:GetObject',
+                  Resource  : `arn:aws:s3:::${bucketName}/*`,
+                  Condition : {
+                    StringEquals : {
+                      'AWS:SourceArn' : {
+                        'Fn::Join' : ['', [`arn:aws:cloudfront::${accountID}:distribution/`, { 'Fn::GetAtt' : ['SiteCloudFrontDistribution', 'Id'] }]]
+                      }
+                    }
+                  }
+                }
+              ]
+            }
+          }
+        }
+      }, // Resources
+      Outputs : {
+        SiteS3Bucket : {
+          Value : { Ref : 'SiteS3Bucket' }
+        },
+        SiteCloudFrontOriginAccessControl : {
+          Value : { Ref : 'SiteCloudFrontOriginAccessControl' }
+        },
+        SiteCloudFrontDistribution : {
+          Value : { Ref : 'SiteCloudFrontDistribution' }
+        }
+      }
+    }
+  }
+ 
+  async destroySharedLoggingBucket () {
+    const { siteInfo } = this
+    const { sharedLoggingBucket } = siteInfo
+ 
+    progressLogger.write('Deleting shared logging bucket...\n')
+    const s3Client = new S3Client({ credentials : this.credentials })
+    const deleteBucketCommand = new DeleteBucketCommand({ Bucket : sharedLoggingBucket })
+    await s3Client.send(deleteBucketCommand)
+    delete siteInfo.sharedLoggingBucket
+  }
+ 
+  async enableSharedLoggingBucket () {
+    const { bucketName } = this.siteInfo // used to create a name for the shared logging bucket
+    let { sharedLoggingBucket = bucketName + '-common-logs' } = this.siteInfo
+ 
+    Iif (sharedLoggingBucket === undefined) {
+      sharedLoggingBucket = await determineBucketName({
+        bucketName  : sharedLoggingBucket,
+        credentials : this.credentials,
+        findName    : true,
+        siteInfo    : this.siteInfo
+      })
+    }
+    this.siteInfo.sharedLoggingBucket = sharedLoggingBucket
+ 
+    this.finalTemplate.Resources.SharedLoggingBucket = {
+      Type       : 'AWS::S3::Bucket',
+      Properties : {
+        AccessControl     : 'Private',
+        BucketName        : sharedLoggingBucket,
+        OwnershipControls : { // this enables ACLs, as required by CloudFront standard logging
+          Rules : [{ ObjectOwnership : 'BucketOwnerPreferred' }]
+        }
+      }
+    }
+ 
+    return sharedLoggingBucket
+  }
+ 
+  async destroyPlugins () {
+    const { siteInfo } = this
+    const { apexDomain, pluginSettings } = siteInfo
+ 
+    for (const [pluginKey, settings] of Object.entries(pluginSettings)) {
+      const plugin = plugins[pluginKey]
+      Iif (plugin === undefined) {
+        throw new Error(`Unknown plugin found in '${apexDomain}' plugin settings.`)
+      }
+ 
+      const { preStackDestroyHandler } = plugin
+      Iif (preStackDestroyHandler !== undefined) {
+        await preStackDestroyHandler({ siteTemplate : this, settings })
+      }
+    }
+  }
+ 
+  async loadPlugins () {
+    const { siteInfo } = this
+    const { apexDomain, pluginSettings } = siteInfo
+ 
+    for (const [pluginKey, settings] of Object.entries(pluginSettings)) {
+      const plugin = plugins[pluginKey]
+      Iif (plugin === undefined) {
+        throw new Error(`Unknown plugin found in '${apexDomain}' plugin settings.`)
+      }
+ 
+      await plugin.stackConfig({ siteTemplate : this, settings })
+    }
+  }
+ 
+  render () {
+    const { apexDomain } = this.siteInfo
+    const resourceTypes = Object.keys(this.resourceTypes).sort()
+ 
+    const outputTemplate = Object.assign({
+      AWSTemplateFormatVersion : '2010-09-09',
+      Description              : `${apexDomain} site built with ${resourceTypes.slice(0, -1).join(', ')} and ${resourceTypes[resourceTypes.length - 1]}.`
+    },
+    this.finalTemplate
+    )
+ 
+    const output = yaml.dump(outputTemplate, { lineWidth : 0 })
+    return output
+  }
+}
+ 
+export { SiteTemplate }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/prettify.css b/qa/coverage/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/qa/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/qa/coverage/prettify.js b/qa/coverage/prettify.js new file mode 100644 index 00000000..b3225238 --- /dev/null +++ b/qa/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/qa/coverage/sort-arrow-sprite.png b/qa/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/qa/coverage/sorter.js b/qa/coverage/sorter.js new file mode 100644 index 00000000..2bb296a8 --- /dev/null +++ b/qa/coverage/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/qa/lint.txt b/qa/lint.txt new file mode 100644 index 00000000..3e741dd3 --- /dev/null +++ b/qa/lint.txt @@ -0,0 +1 @@ +Test git rev: 449e467f0a8c5e0bddf9d1e01dc351e5a20665ff diff --git a/qa/unit-test.txt b/qa/unit-test.txt new file mode 100644 index 00000000..66a79531 --- /dev/null +++ b/qa/unit-test.txt @@ -0,0 +1,67 @@ +Test git rev: 449e467f0a8c5e0bddf9d1e01dc351e5a20665ff +PASS cli/lib/configuration/test/handle-configuration-show.test.js + handleConfigurationShow + ✓ prints the file contents (2 ms) + +--------------------------------------|---------|----------|---------|---------|------------------- +File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s +--------------------------------------|---------|----------|---------|---------|------------------- +All files | 1.47 | 3.2 | 2.97 | 1.33 | + cli | 8.53 | 17.64 | 25 | 8.45 | + cloudsite.mjs | 0 | 0 | 0 | 0 | 1-101 + constants.mjs | 100 | 100 | 100 | 100 | + cli/lib | 0 | 0 | 0 | 0 | + error-out.mjs | 0 | 100 | 0 | 0 | 1-4 + format-output.mjs | 0 | 0 | 0 | 0 | 1-15 + get-site-info.mjs | 0 | 0 | 0 | 0 | 1-14 + get-value-container-and-key.mjs | 0 | 0 | 0 | 0 | 1-38 + handle-configuration.mjs | 0 | 0 | 0 | 0 | 1-21 + handle-create.mjs | 0 | 0 | 0 | 0 | 1-68 + handle-destroy.mjs | 0 | 0 | 0 | 0 | 1-26 + handle-detail.mjs | 0 | 0 | 0 | 0 | 1-21 + handle-get-iam-policy.mjs | 0 | 0 | 0 | 0 | 1-108 + handle-list.mjs | 0 | 0 | 0 | 0 | 1-23 + handle-plugin-settings.mjs | 0 | 0 | 0 | 0 | 1-54 + handle-update.mjs | 0 | 100 | 0 | 0 | 1-20 + handle-verify.mjs | 0 | 0 | 0 | 0 | 1-27 + options.mjs | 0 | 0 | 0 | 0 | 1-36 + smart-convert.mjs | 0 | 0 | 0 | 0 | 1-20 + cli/lib/configuration | 32 | 50 | 40 | 31.81 | + handle-configuration-initialize.mjs | 0 | 0 | 0 | 0 | 1-30 + handle-configuration-show.mjs | 100 | 100 | 100 | 100 | + lib/actions | 0 | 0 | 0 | 0 | + create.mjs | 0 | 0 | 0 | 0 | 1-155 + destroy.mjs | 0 | 0 | 0 | 0 | 1-59 + update.mjs | 0 | 0 | 0 | 0 | 1-50 + verify.mjs | 0 | 0 | 0 | 0 | 1-178 + lib/actions/lib | 0 | 0 | 0 | 0 | + create-or-update-dns-records.mjs | 0 | 0 | 0 | 0 | 1-51 + get-credentials.mjs | 0 | 0 | 0 | 0 | 1-26 + sync-site-content.mjs | 0 | 0 | 0 | 0 | 1-32 + track-stack-status.mjs | 0 | 0 | 0 | 0 | 1-40 + update-site-info.mjs | 0 | 100 | 0 | 0 | 1-13 + update-stack.mjs | 0 | 0 | 0 | 0 | 1-59 + lib/plugins | 0 | 100 | 0 | 0 | + access-logs.mjs | 0 | 100 | 0 | 0 | 1-9 + cloudfront-logs.mjs | 0 | 100 | 0 | 0 | 1-23 + lib/plugins/contact-handler/lib | 0 | 0 | 0 | 0 | + constants.mjs | 0 | 100 | 100 | 0 | 1-3 + determine-lambda-function-name.mjs | 0 | 0 | 0 | 0 | 1-32 + setup-contact-emailer.mjs | 0 | 0 | 0 | 0 | 1-116 + setup-contact-form-table.mjs | 0 | 100 | 0 | 0 | 1-23 + setup-contact-handler.mjs | 0 | 100 | 0 | 0 | 1-121 + setup-request-signer.mjs | 0 | 100 | 0 | 0 | 1-87 + stage-lambda-function-zip-files.mjs | 0 | 0 | 0 | 0 | 1-77 + update-cloud-front-distribution.mjs | 0 | 0 | 0 | 0 | 1-42 + lib/shared | 0 | 0 | 0 | 0 | + convert-domain-to-bucket-name.js | 0 | 100 | 0 | 0 | 1 + determine-bucket-name.mjs | 0 | 0 | 0 | 0 | 1-52 + determine-oac-name.mjs | 0 | 0 | 0 | 0 | 1-45 + progress-logger.mjs | 0 | 100 | 100 | 0 | 1 + site-template.mjs | 0 | 0 | 0 | 0 | 1-237 +--------------------------------------|---------|----------|---------|---------|------------------- +Test Suites: 1 passed, 1 total +Tests: 1 passed, 1 total +Snapshots: 0 total +Time: 0.968 s, estimated 1 s +Ran all test suites. From d5f5e46899575f2cfe1d2e1d98fcd587543833dc Mon Sep 17 00:00:00 2001 From: Zane Rockenbaugh Date: Sun, 17 Mar 2024 10:15:39 -0500 Subject: [PATCH 3/3] removed QA files --- qa/coverage/base.css | 224 ---- qa/coverage/block-navigation.js | 87 -- qa/coverage/cli/cloudsite.mjs.html | 400 ------ qa/coverage/cli/constants.mjs.html | 832 ------------ qa/coverage/cli/index.html | 131 -- .../handle-configuration-initialize.mjs.html | 181 --- .../handle-configuration-show.mjs.html | 118 -- qa/coverage/cli/lib/configuration/index.html | 131 -- qa/coverage/cli/lib/error-out.mjs.html | 103 -- qa/coverage/cli/lib/format-output.mjs.html | 136 -- qa/coverage/cli/lib/get-site-info.mjs.html | 133 -- .../lib/get-value-container-and-key.mjs.html | 205 --- .../cli/lib/handle-configuration.mjs.html | 154 --- qa/coverage/cli/lib/handle-create.mjs.html | 295 ----- qa/coverage/cli/lib/handle-destroy.mjs.html | 169 --- qa/coverage/cli/lib/handle-detail.mjs.html | 154 --- .../cli/lib/handle-get-iam-policy.mjs.html | 415 ------ qa/coverage/cli/lib/handle-list.mjs.html | 160 --- .../cli/lib/handle-plugin-settings.mjs.html | 253 ---- qa/coverage/cli/lib/handle-update.mjs.html | 151 --- qa/coverage/cli/lib/handle-verify.mjs.html | 172 --- qa/coverage/cli/lib/index.html | 326 ----- qa/coverage/cli/lib/options.mjs.html | 199 --- qa/coverage/cli/lib/smart-convert.mjs.html | 151 --- qa/coverage/clover.xml | 1137 ----------------- qa/coverage/coverage-final.json | 45 - qa/coverage/favicon.png | Bin 445 -> 0 bytes qa/coverage/index.html | 221 ---- qa/coverage/lib/actions/create.mjs.html | 559 -------- qa/coverage/lib/actions/destroy.mjs.html | 268 ---- qa/coverage/lib/actions/index.html | 161 --- .../lib/create-or-update-dns-records.mjs.html | 250 ---- .../lib/actions/lib/get-credentials.mjs.html | 169 --- qa/coverage/lib/actions/lib/index.html | 191 --- .../actions/lib/sync-site-content.mjs.html | 187 --- .../actions/lib/track-stack-status.mjs.html | 211 --- .../lib/actions/lib/update-site-info.mjs.html | 130 -- .../lib/actions/lib/update-stack.mjs.html | 268 ---- qa/coverage/lib/actions/update.mjs.html | 244 ---- qa/coverage/lib/actions/verify.mjs.html | 628 --------- qa/coverage/lib/plugins/access-logs.mjs.html | 118 -- .../lib/plugins/cloudfront-logs.mjs.html | 160 --- .../contact-handler/lib/constants.mjs.html | 94 -- .../determine-lambda-function-name.mjs.html | 187 --- .../plugins/contact-handler/lib/index.html | 221 ---- .../lib/setup-contact-emailer.mjs.html | 439 ------- .../lib/setup-contact-form-table.mjs.html | 160 --- .../lib/setup-contact-handler.mjs.html | 454 ------- .../lib/setup-request-signer.mjs.html | 352 ----- .../stage-lambda-function-zip-files.mjs.html | 325 ----- .../update-cloud-front-distribution.mjs.html | 217 ---- qa/coverage/lib/plugins/index.html | 131 -- .../convert-domain-to-bucket-name.js.html | 94 -- .../lib/shared/determine-bucket-name.mjs.html | 247 ---- .../lib/shared/determine-oac-name.mjs.html | 235 ---- qa/coverage/lib/shared/index.html | 176 --- .../lib/shared/progress-logger.mjs.html | 94 -- qa/coverage/lib/shared/site-template.mjs.html | 802 ------------ qa/coverage/prettify.css | 1 - qa/coverage/prettify.js | 2 - qa/coverage/sort-arrow-sprite.png | Bin 138 -> 0 bytes qa/coverage/sorter.js | 196 --- qa/lint.txt | 1 - qa/unit-test.txt | 67 - 64 files changed, 14722 deletions(-) delete mode 100644 qa/coverage/base.css delete mode 100644 qa/coverage/block-navigation.js delete mode 100644 qa/coverage/cli/cloudsite.mjs.html delete mode 100644 qa/coverage/cli/constants.mjs.html delete mode 100644 qa/coverage/cli/index.html delete mode 100644 qa/coverage/cli/lib/configuration/handle-configuration-initialize.mjs.html delete mode 100644 qa/coverage/cli/lib/configuration/handle-configuration-show.mjs.html delete mode 100644 qa/coverage/cli/lib/configuration/index.html delete mode 100644 qa/coverage/cli/lib/error-out.mjs.html delete mode 100644 qa/coverage/cli/lib/format-output.mjs.html delete mode 100644 qa/coverage/cli/lib/get-site-info.mjs.html delete mode 100644 qa/coverage/cli/lib/get-value-container-and-key.mjs.html delete mode 100644 qa/coverage/cli/lib/handle-configuration.mjs.html delete mode 100644 qa/coverage/cli/lib/handle-create.mjs.html delete mode 100644 qa/coverage/cli/lib/handle-destroy.mjs.html delete mode 100644 qa/coverage/cli/lib/handle-detail.mjs.html delete mode 100644 qa/coverage/cli/lib/handle-get-iam-policy.mjs.html delete mode 100644 qa/coverage/cli/lib/handle-list.mjs.html delete mode 100644 qa/coverage/cli/lib/handle-plugin-settings.mjs.html delete mode 100644 qa/coverage/cli/lib/handle-update.mjs.html delete mode 100644 qa/coverage/cli/lib/handle-verify.mjs.html delete mode 100644 qa/coverage/cli/lib/index.html delete mode 100644 qa/coverage/cli/lib/options.mjs.html delete mode 100644 qa/coverage/cli/lib/smart-convert.mjs.html delete mode 100644 qa/coverage/clover.xml delete mode 100644 qa/coverage/coverage-final.json delete mode 100644 qa/coverage/favicon.png delete mode 100644 qa/coverage/index.html delete mode 100644 qa/coverage/lib/actions/create.mjs.html delete mode 100644 qa/coverage/lib/actions/destroy.mjs.html delete mode 100644 qa/coverage/lib/actions/index.html delete mode 100644 qa/coverage/lib/actions/lib/create-or-update-dns-records.mjs.html delete mode 100644 qa/coverage/lib/actions/lib/get-credentials.mjs.html delete mode 100644 qa/coverage/lib/actions/lib/index.html delete mode 100644 qa/coverage/lib/actions/lib/sync-site-content.mjs.html delete mode 100644 qa/coverage/lib/actions/lib/track-stack-status.mjs.html delete mode 100644 qa/coverage/lib/actions/lib/update-site-info.mjs.html delete mode 100644 qa/coverage/lib/actions/lib/update-stack.mjs.html delete mode 100644 qa/coverage/lib/actions/update.mjs.html delete mode 100644 qa/coverage/lib/actions/verify.mjs.html delete mode 100644 qa/coverage/lib/plugins/access-logs.mjs.html delete mode 100644 qa/coverage/lib/plugins/cloudfront-logs.mjs.html delete mode 100644 qa/coverage/lib/plugins/contact-handler/lib/constants.mjs.html delete mode 100644 qa/coverage/lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs.html delete mode 100644 qa/coverage/lib/plugins/contact-handler/lib/index.html delete mode 100644 qa/coverage/lib/plugins/contact-handler/lib/setup-contact-emailer.mjs.html delete mode 100644 qa/coverage/lib/plugins/contact-handler/lib/setup-contact-form-table.mjs.html delete mode 100644 qa/coverage/lib/plugins/contact-handler/lib/setup-contact-handler.mjs.html delete mode 100644 qa/coverage/lib/plugins/contact-handler/lib/setup-request-signer.mjs.html delete mode 100644 qa/coverage/lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs.html delete mode 100644 qa/coverage/lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs.html delete mode 100644 qa/coverage/lib/plugins/index.html delete mode 100644 qa/coverage/lib/shared/convert-domain-to-bucket-name.js.html delete mode 100644 qa/coverage/lib/shared/determine-bucket-name.mjs.html delete mode 100644 qa/coverage/lib/shared/determine-oac-name.mjs.html delete mode 100644 qa/coverage/lib/shared/index.html delete mode 100644 qa/coverage/lib/shared/progress-logger.mjs.html delete mode 100644 qa/coverage/lib/shared/site-template.mjs.html delete mode 100644 qa/coverage/prettify.css delete mode 100644 qa/coverage/prettify.js delete mode 100644 qa/coverage/sort-arrow-sprite.png delete mode 100644 qa/coverage/sorter.js delete mode 100644 qa/lint.txt delete mode 100644 qa/unit-test.txt diff --git a/qa/coverage/base.css b/qa/coverage/base.css deleted file mode 100644 index f418035b..00000000 --- a/qa/coverage/base.css +++ /dev/null @@ -1,224 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* yellow */ -.cbranch-no { background: yellow !important; color: #111; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -.highlighted, -.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ - background: #C21F39 !important; -} -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } -/* dark yellow (gold) */ -.status-line.medium, .medium .cover-fill { background: #f9cd0b; } -.medium .chart { border:1px solid #f9cd0b; } -/* light yellow */ -.medium { background: #fff4c2; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } - -.coverage-summary td.empty { - opacity: .5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/qa/coverage/block-navigation.js b/qa/coverage/block-navigation.js deleted file mode 100644 index cc121302..00000000 --- a/qa/coverage/block-navigation.js +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; - - // Elements to highlight in the file listing view - var fileListingElements = ['td.pct.low']; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` - - // Selecter that finds elements on the page to which we can jump - var selector = - fileListingElements.join(', ') + - ', ' + - notSelector + - missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements - .item(currentIndex) - .classList.remove('highlighted'); - missingCoverageElements.item(index).classList.add('highlighted'); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: 'smooth', - block: 'center', - inline: 'center' - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== 'number' || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === 'number' && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - if ( - document.getElementById('fileSearch') === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener('keydown', jumpToCode); diff --git a/qa/coverage/cli/cloudsite.mjs.html b/qa/coverage/cli/cloudsite.mjs.html deleted file mode 100644 index b0f0eec8..00000000 --- a/qa/coverage/cli/cloudsite.mjs.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - Code coverage report for cli/cloudsite.mjs - - - - - - - - - -
-
-

All files / cli cloudsite.mjs

-
- -
- 0% - Statements - 0/75 -
- - -
- 0% - Branches - 0/28 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/65 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import * as fs from 'node:fs/promises'
- 
-import commandLineArgs from 'command-line-args'
-import { commandLineDocumentation } from 'command-line-documentation'
-import isEqual from 'lodash/isEqual'
- 
-import { cliSpec, GLOBAL_OPTIONS_PATH, SITES_INFO_PATH } from './constants'
-import { handleConfiguration } from './lib/handle-configuration'
-import { handleCreate } from './lib/handle-create'
-import { handleDestroy } from './lib/handle-destroy'
-import { handleDetail } from './lib/handle-detail'
-import { handleGetIAMPolicy } from './lib/handle-get-iam-policy'
-import { handleList } from './lib/handle-list'
-import { handlePluginSettings } from './lib/handle-plugin-settings'
-import { handleUpdate } from './lib/handle-update'
-import { handleVerify } from './lib/handle-verify'I
- 
-const cloudsite = async () => {
-  const mainOptions = commandLineArgs(cliSpec.mainOptions, { stopAtFirstUnknown : true })
-  const argv = mainOptions._unknown || []
- 
-  const { command/*, quiet */ } = mainOptions
-  const throwError = mainOptions['throw-error']
- 
-  let globalOptions
-  try {
-    const globalOptionsContent = await fs.readFile(GLOBAL_OPTIONS_PATH, { encoding : 'utf8' })
-    globalOptions = JSON.parse(globalOptionsContent)
-  } catch (e) {
-    Iif (e.code !== 'ENOENT') {
-      throw e
-    }
-    // otherwise, it's fine, there just are no options
-    globalOptions = {}
-  }
-  let sitesInfo
-  Iif (command !== 'configuration') {
-    try {
-      const sitesInfoContent = await fs.readFile(SITES_INFO_PATH, { encoding : 'utf8' })
-      sitesInfo = JSON.parse(sitesInfoContent)
-    } catch (e) {
-      Iif (e.code !== 'ENOENT') {
-        throw e
-      }
-      // otherwise it's fine, there's just no sites info file yet
-      sitesInfo = {}
-    }
-  }
-  const origSitesInfo = structuredClone(sitesInfo)
- 
-  try {
-    switch (command) {
-      case 'configuration':
-        await handleConfiguration({ argv, cliSpec, globalOptions }); break
-      case 'create':
-        await handleCreate({ argv, globalOptions, sitesInfo }); break
-      case 'destroy':
-        await handleDestroy({ argv, globalOptions, sitesInfo }); break
-      case 'detail':
-        await handleDetail({ argv, globalOptions, sitesInfo }); break
-      case 'document':
-        console.log(commandLineDocumentation(cliSpec, { sectionDepth : 2, title : 'Command reference' }))
-        break
-      case 'get-iam-policy':
-        await handleGetIAMPolicy({ argv }); break
-      case 'list':
-        await handleList({ argv, globalOptions, sitesInfo }); break
-      case 'plugin-settings':
-        await handlePluginSettings({ argv, globalOptions, sitesInfo }); break
-      case 'update':
-        await handleUpdate({ argv, globalOptions, sitesInfo }); break
-      case 'verify':
-        await handleVerify({ argv, globalOptions, sitesInfo }); break
-      default:
-        process.stderr.write('Uknown command: ' + command + '\n\n')
-      // TODO: handleHelp() (abstriact from cloudcraft)
-    }
-  } catch (e) {
-    await checkAndUpdateSitesInfo({ origSitesInfo, sitesInfo })
-    if (throwError === true) {
-      throw e
-    } else if (e.name === 'CredentialsProviderError') {
-      let message = 'Your AWS login credentials may have expired. Update your credentials or try refreshing with:\n\naws sso login'
-      Iif (globalOptions.ssoProfile !== undefined) {
-        message += ' --profile ' + globalOptions.ssoProfile
-      }
-      message += '\n'
-      process.stderr.write(message)
-      process.exit(2) // eslint-disable-line no-process-exit
-    } else {
-      process.stderr.write(e.message + '\n')
-      process.exit(3) // eslint-disable-line no-process-exit
-    }
-  }
-  await checkAndUpdateSitesInfo({ origSitesInfo, sitesInfo })
-}
- 
-const checkAndUpdateSitesInfo = async ({ origSitesInfo, sitesInfo }) => {
-  Iif (!isEqual(origSitesInfo, sitesInfo)) {
-    const sitesInfoContent = JSON.stringify(sitesInfo, null, '  ')
-    await fs.writeFile(SITES_INFO_PATH, sitesInfoContent, { encoding : 'utf8' })
-  }
-}
- 
-export { cloudsite }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/constants.mjs.html b/qa/coverage/cli/constants.mjs.html deleted file mode 100644 index 78ff2722..00000000 --- a/qa/coverage/cli/constants.mjs.html +++ /dev/null @@ -1,832 +0,0 @@ - - - - - - Code coverage report for cli/constants.mjs - - - - - - - - - -
-
-

All files / cli constants.mjs

-
- -
- 100% - Statements - 7/7 -
- - -
- 100% - Branches - 6/6 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 6/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -25061x -  -1x -  -1x -  -1x -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import * as fsPath from 'node:path'
- 
-const SOURCE_TYPES = ['docusaurus', 'vanilla']
- 
-const GLOBAL_OPTIONS_PATH = fsPath.join(process.env.HOME, '.config', 'cloudsite', 'global-options.json')
- 
-const SITES_INFO_PATH = fsPath.join(process.env.HOME, '.config', 'cloudsite', 'sites.json')
- 
-const optionSpec = {
-  name        : 'option',
-  description : "A combined name-value paid, separated by ':'. Can be used multiple times.",
-  multiple    : true
-}
- 
-const cliSpec = {
-  mainCommand : 'cloudsite',
-  mainOptions : [
-    { name : 'command', defaultOption : true, description : 'The command to run or a sub-command group.' },
-    { name : 'quiet', alias : 'q', type : Boolean, description : 'Makes informational output less chatty.' },
-    {
-      name        : 'throw-error',
-      type        : Boolean,
-      description : 'In the case of an exception, the default is to print the message. When --throw-error is set, the exception is left uncaught.'
-    }
-  ],
-  commands : [
-    {
-      name        : 'configuration',
-      description : 'Command group for managing the Cloudsite CLI configuration.',
-      arguments   : [
-        {
-          name          : 'subcommand',
-          defaultOption : true,
-          required      : true,
-          description   : 'The configuration action to perform.'
-        }
-      ],
-      commands : [
-        {
-          name        : 'initialize',
-          description : 'Runs the initialization wizard and updates all options.'
-        },
-        {
-          name        : 'show',
-          description : 'Displays the current configuration.'
-        }
-      ]
-    },
-    {
-      name        : 'create',
-      description : 'Creates a new website, setting up infrastructure and copying content.',
-      arguments   : [
-        {
-          name          : 'apex-domain',
-          description   : 'The site apex domain.',
-          defaultOption : true,
-          required      : true
-        },
-        {
-          name        : 'bucket-name',
-          description : 'The name of the bucket to be used. If no option is given, cloudsite will generate a bucket name based on the apex domain.'
-        },
-        {
-          name        : 'no-build',
-          description : 'Supresses the default behavior of building before uploading the site content.',
-          type        : Boolean
-        },
-        {
-          name        : 'no-delete-on-failure',
-          description : 'When true, does not delete the site stack after setup failure.',
-          type        : Boolean
-        },
-        optionSpec,
-        {
-          name        : 'region',
-          description : "The region where to create the site resources. Defaults to 'us-east-1'.",
-          default     : 'us-east-1'
-        },
-        {
-          name        : 'source-path',
-          description : 'Local path to the static site root.',
-          required    : true
-        },
-        {
-          name        : 'source-type',
-          description : "May be either 'vanilla' or 'docusaurus', otherwise process will attempt to guess."
-        },
-        {
-          name        : 'stack-name',
-          description : 'Specify the name of the stack to be created and override the default name.'
-        }
-      ]
-    },
-    {
-      name        : 'destroy',
-      description : 'Destroys the named site. I.e., deletes all cloud resources associated with the site.',
-      arguments   : [
-        {
-          name          : 'apex-domain',
-          description   : 'The domain of the site to delete.',
-          defaultOption : true,
-          required      : true
-        },
-        {
-          name        : 'confirmed',
-          description : 'Skips the interactive confirmation and destroys the resources without further confirmation.',
-          type        : Boolean
-        }
-      ]
-    },
-    {
-      name        : 'detail',
-      description : 'Prints details for the indicated site.',
-      arguments   : [
-        {
-          name          : 'apex-domain',
-          description   : 'The domain of the site to detail.',
-          defaultOption : true,
-          required      : true
-        },
-        {
-          name        : 'format',
-          description : "Sets the format for the output. May be 'terminal' (default), 'text', 'json', or 'yaml'."
-        }
-      ]
-    },
-    {
-      name        : 'get-iam-policy',
-      description : 'Prints an IAM policy suitable for operating cloudsite.',
-      arguments   : [
-        {
-          name        : 'with-instructions',
-          description : 'When set, will print instructions for creating the policy along with the policy.',
-          type        : Boolean
-        }
-      ]
-    },
-    {
-      name        : 'list',
-      description : 'Lists the sites registered in the local database.',
-      arguments   : [
-        {
-          name        : 'all-fields',
-          description : 'Includes all fields in the output.',
-          type        : Boolean
-        },
-        {
-          name        : 'format',
-          description : "Sets the format for the output. May be 'terminal' (default), 'text', 'json', or 'yaml'."
-        }
-      ]
-    },
-    {
-      name        : 'plugin-settings',
-      description : 'Sets (or deletes) a site option.',
-      arguments   : [
-        {
-          name          : 'apex-domain',
-          description   : 'The apex domain identifying the site.',
-          defaultOption : true,
-          required      : true
-        },
-        {
-          name        : 'delete',
-          description : "When set, then deletes the setting. Incompatible with the '--value' option.",
-          type        : Boolean
-        },
-        {
-          name        : 'name',
-          description : 'The option name.'
-        },
-        optionSpec,
-        {
-          name        : 'value',
-          description : "The setting value. Incompatible with the '--delete' option."
-        }
-      ]
-    },
-    {
-      name      : 'update',
-      summary   : 'Updates a website content and/or infrastructure.',
-      arguments : [
-        {
-          name          : 'apex-domain',
-          description   : 'The apex domain identifying the site.',
-          defaultOption : true,
-          required      : true
-        },
-        {
-          name        : 'do-content',
-          description : 'Limits update to site content and any other specified updates.',
-          type        : Boolean
-        },
-        {
-          name        : 'do-dns',
-          description : 'Limits update to DNS entries and any other specified updates.',
-          type        : Boolean
-        },
-        {
-          name        : 'do-stack',
-          description : 'Limits update to stack infrastructure and any other specified updates.',
-          type        : Boolean
-        },
-        {
-          name        : 'no-build',
-          description : 'Supresses the default behavior of building before updating the site.',
-          type        : Boolean
-        },
-        {
-          name        : 'no-cache-invalidation',
-          description : 'Suppresses the default behavior of invalidating the CloudFront cache after the files are updated. Note that invalidation events are chargeable thought at the time of this writing, each account gets 1,000 free requests per year.'
-        }
-      ]
-    },
-    {
-      name      : 'verify',
-      summary   : 'Verifies the site is up and running and that the stack and content are up-to-date.',
-      arguments : [
-        {
-          name          : 'apex-domain',
-          description   : 'The domain of the site to verify.',
-          defaultOption : true,
-          required      : true
-        },
-        {
-          name        : 'check-content',
-          description : 'If set, then checks content and skips other checks unless also specifically specified.',
-          type        : Boolean
-        },
-        {
-          name        : 'check-site-up',
-          description : 'If set, then checks that the site is up and skips other checks unless also specifically specified.',
-          type        : Boolean
-        },
-        {
-          name        : 'check-stack',
-          description : 'If set, then checks for stack drift and skips other checks unless also specifically specified.',
-          type        : Boolean
-        },
-        {
-          name        : 'format',
-          description : "Sets the format for the output. May be 'terminal' (default), 'text', 'json', or 'yaml'."
-        }
-      ]
-    }
-  ]
-}
- 
-export { cliSpec, GLOBAL_OPTIONS_PATH, SITES_INFO_PATH, SOURCE_TYPES }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/index.html b/qa/coverage/cli/index.html deleted file mode 100644 index c1f61ce9..00000000 --- a/qa/coverage/cli/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for cli - - - - - - - - - -
-
-

All files cli

-
- -
- 8.53% - Statements - 7/82 -
- - -
- 17.64% - Branches - 6/34 -
- - -
- 25% - Functions - 1/4 -
- - -
- 8.45% - Lines - 6/71 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
cloudsite.mjs -
-
0%0/750%0/280%0/30%0/65
constants.mjs -
-
100%7/7100%6/6100%1/1100%6/6
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/configuration/handle-configuration-initialize.mjs.html b/qa/coverage/cli/lib/configuration/handle-configuration-initialize.mjs.html deleted file mode 100644 index 4c40c25b..00000000 --- a/qa/coverage/cli/lib/configuration/handle-configuration-initialize.mjs.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - Code coverage report for cli/lib/configuration/handle-configuration-initialize.mjs - - - - - - - - - -
-
-

All files / cli/lib/configuration handle-configuration-initialize.mjs

-
- -
- 0% - Statements - 0/17 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/15 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import * as fs from 'node:fs/promises'
-import * as fsPath from 'node:path'
- 
-import { Questioner } from 'question-and-answer'
- 
-import { GLOBAL_OPTIONS_PATH } from '../../constants'I
- 
-const handleConfigurationInitialize = async () => {
-  const interrogationBundle = {
-    actions : [
-      {
-        prompt    : 'Set the SSO profile:',
-        parameter : 'ssoProfile'
-      },
-      { review : 'questions' }
-    ]
-  }
- 
-  const questioner = new Questioner({ interrogationBundle })
-  await questioner.question()
- 
-  const results = questioner.results
-    .reduce((acc, { parameter, value }) => { acc[parameter] = value; return acc }, {})
- 
-  const globalOptionsPath = GLOBAL_OPTIONS_PATH
-  const globalOptionsContents = JSON.stringify(results, null, '  ')
- 
-  await fs.mkdir(fsPath.dirname(globalOptionsPath), { recursive : true })
-  await fs.writeFile(globalOptionsPath, globalOptionsContents, { encoding : 'utf8' })
-}
- 
-export { handleConfigurationInitialize }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/configuration/handle-configuration-show.mjs.html b/qa/coverage/cli/lib/configuration/handle-configuration-show.mjs.html deleted file mode 100644 index 4f19dfe4..00000000 --- a/qa/coverage/cli/lib/configuration/handle-configuration-show.mjs.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - Code coverage report for cli/lib/configuration/handle-configuration-show.mjs - - - - - - - - - -
-
-

All files / cli/lib/configuration handle-configuration-show.mjs

-
- -
- 100% - Statements - 8/8 -
- - -
- 100% - Branches - 6/6 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 7/7 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -121x -  -16x -  -1x -1x -1x -1x -1x -  -  - 
import * as fs from 'node:fs/promises'
- 
-import { GLOBAL_OPTIONS_PATH } from '../../constants'
- 
-const handleConfigurationShow = async () => {
-  const globalOptionsPath = GLOBAL_OPTIONS_PATH
-  const globalOptionsContents = await fs.readFile(globalOptionsPath, { encoding : 'utf8' })
-  process.stdout.write(globalOptionsContents)
-}
- 
-export { handleConfigurationShow }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/configuration/index.html b/qa/coverage/cli/lib/configuration/index.html deleted file mode 100644 index 0e1429cd..00000000 --- a/qa/coverage/cli/lib/configuration/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for cli/lib/configuration - - - - - - - - - -
-
-

All files cli/lib/configuration

-
- -
- 32% - Statements - 8/25 -
- - -
- 50% - Branches - 6/12 -
- - -
- 40% - Functions - 2/5 -
- - -
- 31.81% - Lines - 7/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
handle-configuration-initialize.mjs -
-
0%0/170%0/60%0/30%0/15
handle-configuration-show.mjs -
-
100%8/8100%6/6100%2/2100%7/7
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/error-out.mjs.html b/qa/coverage/cli/lib/error-out.mjs.html deleted file mode 100644 index 0d411787..00000000 --- a/qa/coverage/cli/lib/error-out.mjs.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - Code coverage report for cli/lib/error-out.mjs - - - - - - - - - -
-
-

All files / cli/lib error-out.mjs

-
- -
- 0% - Statements - 0/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7  -  -  -  -  -  - 
const errorOut = (msg, code) => {
-  process.stderr.write(msg)
-  process.exit(code) // eslint-disable-line no-process-exit
-}
- 
-export { errorOut }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/format-output.mjs.html b/qa/coverage/cli/lib/format-output.mjs.html deleted file mode 100644 index c46b9ad2..00000000 --- a/qa/coverage/cli/lib/format-output.mjs.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - Code coverage report for cli/lib/format-output.mjs - - - - - - - - - -
-
-

All files / cli/lib format-output.mjs

-
- -
- 0% - Statements - 0/11 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import yaml from 'js-yaml'
-import { jsonToPlainText } from 'json-to-plain-text'
- 
-const formatOutput = ({ output, format }) => {
-  if (format === 'json') {
-    process.stdout.write(JSON.stringify(output, null, '  ') + '\n')
-  } else if (format === 'yaml') {
-    process.stdout.write(yaml.dump(output))
-  } else {
-    const options = { color : format !== 'text' }
-    const text = jsonToPlainText(output, options)
- 
-    process.stdout.write(text + '\n')
-  }
-}
- 
-export { formatOutput }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/get-site-info.mjs.html b/qa/coverage/cli/lib/get-site-info.mjs.html deleted file mode 100644 index 9b27cfa2..00000000 --- a/qa/coverage/cli/lib/get-site-info.mjs.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - Code coverage report for cli/lib/get-site-info.mjs - - - - - - - - - -
-
-

All files / cli/lib get-site-info.mjs

-
- -
- 0% - Statements - 0/9 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { errorOut } from './error-out'
- 
-const getSiteInfo = ({ apexDomain, sitesInfo }) => {
-  Iif (apexDomain === undefined) {
-    errorOut('Must specify site domain.\n')
-  }
- 
-  const siteInfo = sitesInfo[apexDomain]
-  Iif (siteInfo === undefined) {
-    errorOut(`No such site '${apexDomain}' found.\n`)
-  }
- 
-  return siteInfo
-}
- 
-export { getSiteInfo }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/get-value-container-and-key.mjs.html b/qa/coverage/cli/lib/get-value-container-and-key.mjs.html deleted file mode 100644 index 7c7dfe07..00000000 --- a/qa/coverage/cli/lib/get-value-container-and-key.mjs.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - Code coverage report for cli/lib/get-value-container-and-key.mjs - - - - - - - - - -
-
-

All files / cli/lib get-value-container-and-key.mjs

-
- -
- 0% - Statements - 0/23 -
- - -
- 0% - Branches - 0/20 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/23 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { errorOut } from './error-out'
- 
-const getValueContainerAndKey = ({ path, rootContainer, spec, value }) => {
-  const pathBits = path.split('.')
- 
-  // walks the path, creating new containers along the way as necessary
-  return pathBits.reduce(([currContainer, spec], bit, i) => {
-    // then we're at the terminal path bit; let's analyze whether it's valid and if value passes validation
-    if (i === pathBits.length - 1) {
-      spec = spec?.[bit]
-      Iif (spec !== undefined) {
-        const { matches, validation } = spec
-        Iif (validation === undefined && matches === undefined) {
-          throw new Error(`'${path}' does not appear to be a terminal path.`)
-        }
-        Iif (matches !== undefined && value.match(matches) === null) {
-          throw new Error(`Invalid value '${value}' for '${path}'; must match ${matches.toString()}.`)
-        }
- 
-        Iif (validation !== undefined && !validation(value)) {
-          throw new Error(`Value '${value}' for '${path}' failed validation.`)
-        }
-      }
- 
-      return { valueKey : pathBits[i], valueContainer : currContainer }
-    } else {
-      const currSpec = spec[bit]
-      Iif (currSpec === undefined && i > 0) {
-        errorOut(`Invalid option path '${path}'; no such element '${bit}'.\n`)
-      }
-      const container = currContainer[bit]
-      Iif (container === undefined) {
-        currContainer[bit] = {}
-      }
-      return [currContainer[bit], currSpec]
-    }
-  }, [rootContainer, spec])
-}
- 
-export { getValueContainerAndKey }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-configuration.mjs.html b/qa/coverage/cli/lib/handle-configuration.mjs.html deleted file mode 100644 index a4117ac0..00000000 --- a/qa/coverage/cli/lib/handle-configuration.mjs.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - Code coverage report for cli/lib/handle-configuration.mjs - - - - - - - - - -
-
-

All files / cli/lib handle-configuration.mjs

-
- -
- 0% - Statements - 0/17 -
- - -
- 0% - Branches - 0/5 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/14 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import commandLineArgs from 'command-line-args'
- 
-import { handleConfigurationInitialize } from './configuration/handle-configuration-initialize'
-import { handleConfigurationShow } from './configuration/handle-configuration-show'
- 
-const handleConfiguration = async ({ argv, cliSpec, globalOptions }) => {
-  const configurationCLISpec = cliSpec.commands.find(({ name }) => name === 'configuration')
-  const configurationOptionsSpec = configurationCLISpec.arguments
-  const configurationOptions = commandLineArgs(configurationOptionsSpec, { argv, stopAtFirstUnknown : true })
-  const { subcommand } = configurationOptions
-  argv = configurationOptions._unknown || []
- 
-  switch (subcommand) {
-    case 'initialize':
-      await handleConfigurationInitialize({ argv, configurationCLISpec, globalOptions }); break
-    case 'show':
-      await handleConfigurationShow({ argv, configurationCLISpec, globalOptions }); break
-    default:
-      throw new Error('Unknown configuration command: ' + subcommand)
-  }
-}
- 
-export { handleConfiguration }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-create.mjs.html b/qa/coverage/cli/lib/handle-create.mjs.html deleted file mode 100644 index a76589cf..00000000 --- a/qa/coverage/cli/lib/handle-create.mjs.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - Code coverage report for cli/lib/handle-create.mjs - - - - - - - - - -
-
-

All files / cli/lib handle-create.mjs

-
- -
- 0% - Statements - 0/45 -
- - -
- 0% - Branches - 0/22 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/43 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { existsSync as fileExists } from 'node:fs'
-import * as fsPath from 'node:path'
- 
-import commandLineArgs from 'command-line-args'
-import { awsS3TABucketNameRE, awsS3TABucketNameREString } from 'regex-repo'
- 
-import { cliSpec, SOURCE_TYPES } from '../constants'
-import { create } from '../../lib/actions/create'
-import * as optionsLib from './options'I
- 
-const handleCreate = async ({ argv, globalOptions, sitesInfo }) => {
-  const createOptionsSpec = cliSpec.commands.find(({ name }) => name === 'create').arguments
-  const createOptions = commandLineArgs(createOptionsSpec, { argv })
-  // action behavior options
-  const noDeleteOnFailure = createOptions['no-delete-on-failure']
-  // siteInfo options
-  const apexDomain = createOptions['apex-domain']
-  const bucketName = createOptions['bucket-name']
-  const noBuild = createOptions['no-build']
-  // switch any relative sourcePath to absolute
-  const sourcePath = fsPath.resolve(createOptions['source-path'])
-  let sourceType = createOptions['source-type']
-  const stackName = createOptions['stack-name']
-  const options = optionsLib.mapRawOptions(createOptions.option)
-  console.log('options A:', options) // DEBUG
- 
-  const siteInfo = sitesInfo[apexDomain] || { apexDomain, bucketName, sourcePath, sourceType }
-  siteInfo.region = createOptions.region || siteInfo.region || 'us-east-1'
-  Iif (stackName !== undefined) {
-    siteInfo.stackName = stackName
-  }
- 
-  sitesInfo[apexDomain] = siteInfo
- 
-  // verify the parameters/options
-  for (const option of ['apex-domain', 'source-path']) {
-    Iif (createOptions[option] === undefined) {
-      process.stderr.write(`Missing required '${option}' option.\n`)
-      // TODO: handleHelp({ argv : ['create'] })
-      process.exit(2) // eslint-disable-line no-process-exit
-    }
-  }
-  // TODO: verify apex domain matches apex domain RE
- 
-  if (sourceType === undefined) {
-    const docusaurusConfigPath = fsPath.resolve(sourcePath, '..', 'docusaurus.config.js')
-    sourceType = fileExists(docusaurusConfigPath) ? 'docusaurus' : 'vanilla'
-  } else Iif (!SOURCE_TYPES.includes(sourceType)) {
-    process.stderr(`Invalid site source type '${sourceType}'; must be one of ${SOURCE_TYPES.join(', ')}.\n`)
-    process.exit(2) // eslint-disable-line no-process-exit
-  }
- 
-  Iif (bucketName !== undefined && !awsS3TABucketNameRE.test(bucketName)) {
-    process.stderr(`Invalid bucket name. Must be valid AWS S3 Transfer Accelerated bucket name matching: ${awsS3TABucketNameREString}`)
-    process.exit(2) // eslint-disable-line no-process-exit
-  }
- 
-  optionsLib.updatePluginSettings({ options, siteInfo })
- 
-  // update siteInfo in case these were manually specified
-  for (const [value, field] of [[bucketName, 'bucketName'], [sourcePath, 'sourcePath'], [sourceType, 'sourceType']]) {
-    Iif (value !== undefined) {
-      siteInfo[field] = value
-    }
-  }
- 
-  await create({ noBuild, noDeleteOnFailure, siteInfo, ...globalOptions })
-}
- 
-export { handleCreate }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-destroy.mjs.html b/qa/coverage/cli/lib/handle-destroy.mjs.html deleted file mode 100644 index a0d83c02..00000000 --- a/qa/coverage/cli/lib/handle-destroy.mjs.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - Code coverage report for cli/lib/handle-destroy.mjs - - - - - - - - - -
-
-

All files / cli/lib handle-destroy.mjs

-
- -
- 0% - Statements - 0/19 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import commandLineArgs from 'command-line-args'
- 
-import { cliSpec } from '../constants'
-import { destroy } from '../../lib/actions/destroy'
-import { getSiteInfo } from './get-site-info'
- 
-const handleDestroy = async ({ argv, globalOptions, sitesInfo }) => {
-  const destroyOptionsSpec = cliSpec.commands.find(({ name }) => name === 'destroy').arguments
-  const destroyOptions = commandLineArgs(destroyOptionsSpec, { argv })
-  const apexDomain = destroyOptions['apex-domain']
-  const { confirmed } = destroyOptions
- 
-  const siteInfo = getSiteInfo({ apexDomain, sitesInfo })
- 
-  Iif (confirmed !== true) {
-    process.stderr.write("Interactive mode not yet implement. You must include the '--confirmed' option.\n")
-    process.exit(3) // eslint-disable-line no-process-exit
-  }
- 
-  const deleted = await destroy({ globalOptions, siteInfo, verbose : true })
- 
-  Iif (deleted === true) {
-    process.stdout.write(`Removing ${apexDomain} from local DB.\n`)
-    delete sitesInfo[apexDomain]
-  }
-}
- 
-export { handleDestroy }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-detail.mjs.html b/qa/coverage/cli/lib/handle-detail.mjs.html deleted file mode 100644 index e43335ec..00000000 --- a/qa/coverage/cli/lib/handle-detail.mjs.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - Code coverage report for cli/lib/handle-detail.mjs - - - - - - - - - -
-
-

All files / cli/lib handle-detail.mjs

-
- -
- 0% - Statements - 0/16 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/15 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import commandLineArgs from 'command-line-args'
- 
-import { cliSpec } from '../constants'
-import { errorOut } from './error-out'
-import { formatOutput } from './format-output'
-import { getSiteInfo } from './get-site-info'
- 
-const handleDetail = ({ argv, sitesInfo }) => {
-  const detailOptionsSpec = cliSpec.commands.find(({ name }) => name === 'detail').arguments
-  const detailOptions = commandLineArgs(detailOptionsSpec, { argv })
-  const apexDomain = detailOptions['apex-domain']
-  const { format } = detailOptions
- 
-  Iif (apexDomain === undefined) {
-    errorOut('Apex domain must be specified.')
-  }
- 
-  const output = getSiteInfo({ apexDomain, sitesInfo })
- 
-  formatOutput({ output, format })
-}
- 
-export { handleDetail }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-get-iam-policy.mjs.html b/qa/coverage/cli/lib/handle-get-iam-policy.mjs.html deleted file mode 100644 index db78a2cb..00000000 --- a/qa/coverage/cli/lib/handle-get-iam-policy.mjs.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - Code coverage report for cli/lib/handle-get-iam-policy.mjs - - - - - - - - - -
-
-

All files / cli/lib handle-get-iam-policy.mjs

-
- -
- 0% - Statements - 0/13 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import commandLineArgs from 'command-line-args'
- 
-import { cliSpec } from '../constants'
- 
-const iamPolicy = {
-  Version   : '2012-10-17',
-  Statement : [
-    {
-      Sid    : 'VisualEditor0',
-      Effect : 'Allow',
-      Action : [
-        'acm:ListCertificates',
-        'acm:RequestCertificate',
-        'cloudformation:DescribeStackDriftDetectionStatus',
-        'cloudformation:DescribeStackEvents',
-        'cloudformation:DescribeStacks',
-        'cloudformation:ListChangeSets',
-        'cloudformation:DetectStackDrift',
-        'cloudformation:GetTemplate',
-        'cloudformation:CreateStack',
-        'cloudformation:DeleteStack',
-        'cloudformation:UpdateStack',
-        'cloudfront:CreateDistribution',
-        'cloudfront:CreateInvalidation',
-        'cloudfront:CreateOriginAccessControl',
-        'cloudfront:DeleteDistribution',
-        'cloudfront:DeleteOriginAccessControl',
-        'cloudfront:GetDistribution',
-        'cloudfront:GetOriginAccessControl',
-        'cloudfront:ListDistributions',
-        'cloudfront:ListOriginAccessControls',
-        'cloudfront:TagResource',
-        'cloudfront:UpdateDistribution',
-        'cloudfront:UpdateOriginAccessControl',
-        'dynamodb:CreateTable',
-        'dynamodb:DeleteTable',
-        'dynamodb:DescribeTable',
-        'dynamodb:UpdateTable',
-        'iam:AttachRolePolicy',
-        'iam:CreateRole',
-        'iam:DeleteRole',
-        'iam:DetachRolePolicy',
-        'iam:DeleteRolePolicy',
-        'iam:GetRole',
-        'iam:PutRolePolicy',
-        'iam:UpdateRole',
-        'lambda:AddPermission',
-        'lambda:CreateFunction',
-        'lambda:CreateEventSourceMapping',
-        'lambda:CreateFunctionUrlConfig',
-        'lambda:DeleteEventSourceMapping',
-        'lambda:DeleteFunction',
-        'lambda:DeleteFunctionUrlConfig',
-        'lambda:EnableReplication',
-        'lambda:GetEventSourceMapping',
-        'lambda:GetFunction',
-        'lambda:GetFunctionConfiguration',
-        'lambda:GetFunctionUrlConfig',
-        'lambda:ListFunctions',
-        'lambda:ListFunctionUrlConfigs',
-        'lambda:ListVersionsByFunction',
-        'iam:PassRole',
-        'lambda:PublishVersion',
-        'lambda:RemovePermission',
-        'lambda:UpdateFunctionUrlConfig',
-        'logs:CreateLogGroup',
-        'logs:DeleteLogGroup',
-        'logs:DeleteRetentionPolicy',
-        'logs:PutRetentionPolicy',
-        'route53:ListHostedZones',
-        'route53:ChangeResourceRecordSets',
-        'route53:ListResourceRecordSets',
-        's3:CreateBucket',
-        's3:PutObject',
-        's3:DeleteObject',
-        's3:DeleteBucket',
-        's3:DeleteBucketPolicy',
-        's3:GetObject',
-        's3:ListBucket',
-        's3:PutBucketAcl',
-        's3:PutBucketPolicy',
-        's3:*'
-      ],
-      Resource : [
-        '*'
-      ]
-    }
-  ]
-}
- 
-const instructions =
-`1. Log into the AWS console.
-2. Select/navigate to the IAM service.
-3. Select 'Policies' from the left hand menu options.
-4. Select 'Create policy'.
-5. Select the 'JSON' option.
-6. Replace the JSON with the text below.`
- 
-const handleGetIAMPolicy = ({ argv }) => {
-  const getIAMPolicyOptionsSpec = cliSpec.commands.find(({ name }) => name === 'get-iam-policy').arguments
-  const getIAMPolicyOptions = commandLineArgs(getIAMPolicyOptionsSpec, { argv })
-  const withInstructions = getIAMPolicyOptions['with-instructions']
- 
-  Iif (withInstructions === true) {
-    process.stdout.write(instructions + '\n\n')
-  }
-  process.stdout.write(JSON.stringify(iamPolicy, null, '  ') + '\n')
-}
- 
-export { handleGetIAMPolicy }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-list.mjs.html b/qa/coverage/cli/lib/handle-list.mjs.html deleted file mode 100644 index 02a85481..00000000 --- a/qa/coverage/cli/lib/handle-list.mjs.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - Code coverage report for cli/lib/handle-list.mjs - - - - - - - - - -
-
-

All files / cli/lib handle-list.mjs

-
- -
- 0% - Statements - 0/17 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import commandLineArgs from 'command-line-args'
-import pick from 'lodash/pick'
- 
-import { cliSpec } from '../constants'
-import { formatOutput } from './format-output'
- 
-const handleList = ({ argv, sitesInfo }) => {
-  const listOptionsSpec = cliSpec.commands.find(({ name }) => name === 'list').arguments
-  const listOptions = commandLineArgs(listOptionsSpec, { argv })
-  const allFields = listOptions['all-fields']
-  const { format } = listOptions
- 
-  const sitesInfoArray = Object.values(sitesInfo)
-  const output = allFields === true
-    ? sitesInfoArray
-    : sitesInfoArray.map((siteInfo) => {
-      const trimmed = pick(siteInfo, ['apexDomain', 'region', 'sourcePath'])
-      trimmed.plugins = Object.keys(siteInfo.pluginSettings)
-      return trimmed
-    })
- 
-  formatOutput({ output, format })
-}
- 
-export { handleList }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-plugin-settings.mjs.html b/qa/coverage/cli/lib/handle-plugin-settings.mjs.html deleted file mode 100644 index 66cfc5bd..00000000 --- a/qa/coverage/cli/lib/handle-plugin-settings.mjs.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - Code coverage report for cli/lib/handle-plugin-settings.mjs - - - - - - - - - -
-
-

All files / cli/lib handle-plugin-settings.mjs

-
- -
- 0% - Statements - 0/38 -
- - -
- 0% - Branches - 0/34 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/36 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import commandLineArgs from 'command-line-args'
- 
-import { cliSpec } from '../constants'
-import { errorOut } from './error-out'
-import { getSiteInfo } from './get-site-info'
-import { getValueContainerAndKey } from './get-value-container-and-key'
-import * as optionsLib from './options'
-import { smartConvert } from './smart-convert'I
- 
-const handlePluginSettings = async ({ argv, sitesInfo }) => {
-  const setOptionOptionsSpec = cliSpec.commands.find(({ name }) => name === 'plugin-settings').arguments
-  const setOptionOptions = commandLineArgs(setOptionOptionsSpec, { argv })
-  const apexDomain = setOptionOptions['apex-domain']
-  const options = optionsLib.mapRawOptions(setOptionOptions.option)
- 
-  const { delete: doDelete, name, value } = setOptionOptions
- 
-  // validate options
-  const siteInfo = getSiteInfo({ apexDomain, sitesInfo })
- 
-  if (doDelete === true && (value !== undefined || options.length > 0)) {
-    errorOut("The '--delete' option is incompatible with the '--value' and --name-value options.\n")
-  } else if (doDelete === true && name === undefined) {
-    errorOut("You must specify a '--name' when '--delete' is set.\n")
-  } else Iif (doDelete !== true) {
-    if (name !== undefined && value !== undefined) {
-      options.push({ name, value : smartConvert(value) }) // the 'option' values are already converted
-    } else if (name !== undefined && value === undefined) {
-      errorOut("You must specify a '--value' or '--delete' when '--name' is set.\n")
-    } else Iif (name === undefined && value !== undefined) {
-      errorOut("You must specify a '--name' when '--value' is set.\n")
-    }
-  }
- 
-  Iif (doDelete !== true && options.length === 0) {
-    errorOut("Invalid options; specify '--name'+'--value', '--delete'/'--name', or one or more '--option' options.\n")
-  }
- 
-  // take actions and update the options
-  const { pluginSettings = {} } = siteInfo
- 
-  if (doDelete === true) {
-    const { valueContainer, valueKey } = getValueContainerAndKey({ path : name, rootContainer : pluginSettings })
-    delete valueContainer[valueKey]
- 
-    Iif (Object.keys(pluginSettings).length === 0) {
-      delete siteInfo.options
-    }
-  } else {
-    optionsLib.updatePluginSettings({ options, siteInfo })
-  }
- 
-  siteInfo.pluginSettings = pluginSettings
-}
- 
-export { handlePluginSettings }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-update.mjs.html b/qa/coverage/cli/lib/handle-update.mjs.html deleted file mode 100644 index c9d15f0e..00000000 --- a/qa/coverage/cli/lib/handle-update.mjs.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for cli/lib/handle-update.mjs - - - - - - - - - -
-
-

All files / cli/lib handle-update.mjs

-
- -
- 0% - Statements - 0/17 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import commandLineArgs from 'command-line-args'
- 
-import { cliSpec } from '../constants'
-import { getSiteInfo } from './get-site-info'
-import { update } from '../../lib/actions/update'
- 
-const handleUpdate = async ({ argv, globalOptions, sitesInfo }) => {
-  const updateOptionsSpec = cliSpec.commands.find(({ name }) => name === 'update').arguments
-  const updateOptions = commandLineArgs(updateOptionsSpec, { argv })
-  const apexDomain = updateOptions['apex-domain']
-  const doContent = updateOptions['do-content']
-  const doDNS = updateOptions['do-dns']
-  const doStack = updateOptions['do-stack']
-  const noBuild = updateOptions['no-build']
-  const noCacheInvalidation = updateOptions['no-cache-invalidation']
- 
-  const siteInfo = getSiteInfo({ apexDomain, sitesInfo })
- 
-  await update({ doContent, doDNS, doStack, noBuild, noCacheInvalidation, siteInfo, globalOptions })
-}
- 
-export { handleUpdate }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/handle-verify.mjs.html b/qa/coverage/cli/lib/handle-verify.mjs.html deleted file mode 100644 index 3ddcdcdc..00000000 --- a/qa/coverage/cli/lib/handle-verify.mjs.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - Code coverage report for cli/lib/handle-verify.mjs - - - - - - - - - -
-
-

All files / cli/lib handle-verify.mjs

-
- -
- 0% - Statements - 0/25 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import commandLineArgs from 'command-line-args'
- 
-import { cliSpec } from '../constants'
-import { formatOutput } from './format-output'
-import { getSiteInfo } from './get-site-info'
-import { verify } from '../../lib/actions/verify'
- 
-const handleVerify = async ({ argv, sitesInfo, globalOptions }) => {
-  const verifyOptionsSpec = cliSpec.commands.find(({ name }) => name === 'verify').arguments
-  const verifyOptions = commandLineArgs(verifyOptionsSpec, { argv })
-  const { format } = verifyOptions
-  const apexDomain = verifyOptions['apex-domain']
-  const checkContent = verifyOptions['check-content']
-  const checkSiteUp = verifyOptions['check-site-up']
-  const checkStack = verifyOptions['check-stack']
- 
-  const siteInfo = getSiteInfo({ apexDomain, sitesInfo })
- 
-  const results =
-    await verify({ checkContent, checkSiteUp, checkStack, globalOptions, progressLogger : process.stdout, siteInfo })
-  const summaryStatus = results.reduce((acc, { status : s }) => {
-    if (s === 'error') { return 'error' } else if (s === 'failed') { return 'failed' } else { return acc }
-  }, 'success')
- 
-  const output = { 'overall status' : summaryStatus, checks : results }
-  formatOutput({ output, format })
-}
- 
-export { handleVerify }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/index.html b/qa/coverage/cli/lib/index.html deleted file mode 100644 index ba413785..00000000 --- a/qa/coverage/cli/lib/index.html +++ /dev/null @@ -1,326 +0,0 @@ - - - - - - Code coverage report for cli/lib - - - - - - - - - -
-
-

All files cli/lib

-
- -
- 0% - Statements - 0/296 -
- - -
- 0% - Branches - 0/132 -
- - -
- 0% - Functions - 0/32 -
- - -
- 0% - Lines - 0/278 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
error-out.mjs -
-
0%0/4100%0/00%0/10%0/4
format-output.mjs -
-
0%0/110%0/40%0/10%0/11
get-site-info.mjs -
-
0%0/90%0/20%0/10%0/9
get-value-container-and-key.mjs -
-
0%0/230%0/200%0/20%0/23
handle-configuration.mjs -
-
0%0/170%0/50%0/20%0/14
handle-create.mjs -
-
0%0/450%0/220%0/30%0/43
handle-destroy.mjs -
-
0%0/190%0/20%0/20%0/18
handle-detail.mjs -
-
0%0/160%0/10%0/20%0/15
handle-get-iam-policy.mjs -
-
0%0/130%0/10%0/20%0/12
handle-list.mjs -
-
0%0/170%0/20%0/30%0/16
handle-plugin-settings.mjs -
-
0%0/380%0/340%0/30%0/36
handle-update.mjs -
-
0%0/17100%0/00%0/20%0/16
handle-verify.mjs -
-
0%0/250%0/40%0/30%0/20
options.mjs -
-
0%0/260%0/190%0/40%0/25
smart-convert.mjs -
-
0%0/160%0/160%0/10%0/16
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/options.mjs.html b/qa/coverage/cli/lib/options.mjs.html deleted file mode 100644 index bd563c5a..00000000 --- a/qa/coverage/cli/lib/options.mjs.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - Code coverage report for cli/lib/options.mjs - - - - - - - - - -
-
-

All files / cli/lib options.mjs

-
- -
- 0% - Statements - 0/26 -
- - -
- 0% - Branches - 0/19 -
- - -
- 0% - Functions - 0/4 -
- - -
- 0% - Lines - 0/25 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { errorOut } from './error-out'
-import { getValueContainerAndKey } from './get-value-container-and-key'
-import * as plugins from '../../lib/plugins'
-import { smartConvert } from './smart-convert'I
- 
-const mapRawOptions = (rawOptions = []) =>
-  rawOptions.map((spec) => {
-    let [name, value] = spec.split(/(?!\\):/)
-    value = value?.replaceAll(/\\:/g, ':') || 'true'
-    value = smartConvert(value)
- 
-    return { name, value }
-  })
- 
-const updatePluginSettings = ({ options, siteInfo }) => {
-  const { pluginSettings = {} } = siteInfo
- 
-  for (const { name, value } of options) {
-    console.log('processing option:', name, '/', value) // DEBUG
-    const [option] = name.split('.')
- 
-    Iif (!(option in plugins)) {
-      errorOut(`No such plugin '${option}'; use one of: ${Object.keys(plugins).join(', ')}.\n`)
-    }
- 
-    const optionsSpec = plugins[option].config?.options
- 
-    const wrappedSpec = { [option] : optionsSpec } // so our option spec matches our path
-    const { valueContainer, valueKey } =
-      getValueContainerAndKey({ path : name, rootContainer : pluginSettings, spec : wrappedSpec, value })
-    valueContainer[valueKey] = value
-  }
- 
-  console.log('pluginSettings:', pluginSettings) // DEBUG
-  siteInfo.pluginSettings = pluginSettings
-}
- 
-export { mapRawOptions, updatePluginSettings }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/cli/lib/smart-convert.mjs.html b/qa/coverage/cli/lib/smart-convert.mjs.html deleted file mode 100644 index 656d468b..00000000 --- a/qa/coverage/cli/lib/smart-convert.mjs.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for cli/lib/smart-convert.mjs - - - - - - - - - -
-
-

All files / cli/lib smart-convert.mjs

-
- -
- 0% - Statements - 0/16 -
- - -
- 0% - Branches - 0/16 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
const smartConvert = (value) => {
-  if (value === undefined) {
-    return ''
-  } else if (value === 'true' || value === 'TRUE') {
-    return true
-  } else if (value === 'false' || value === 'FALSE') {
-    return false
-  } else if (value.match(/^\s*\d+\s*$/)) {
-    return parseInt(value)
-  } else if (value.match(/^\s*(?:\d+(?:\.\d+)|\.\d+)\s*$/)) {
-    return parseFloat(value)
-  } else {
-    value = value.trim()
-    if (value.startsWith('\\')) {
-      return value.slice(1)
-    } else {
-      return value
-    }
-  }
-}
- 
-export { smartConvert }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/clover.xml b/qa/coverage/clover.xml deleted file mode 100644 index 147420af..00000000 --- a/qa/coverage/clover.xml +++ /dev/null @@ -1,1137 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/qa/coverage/coverage-final.json b/qa/coverage/coverage-final.json deleted file mode 100644 index 2eca5aae..00000000 --- a/qa/coverage/coverage-final.json +++ /dev/null @@ -1,45 +0,0 @@ -{"/Users/zane/playground/cloudsite/src/cli/cloudsite.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/cloudsite.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"7":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"8":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"9":{"start":{"line":12,"column":0},"end":{"line":12,"column":null}},"10":{"start":{"line":13,"column":0},"end":{"line":13,"column":null}},"11":{"start":{"line":14,"column":0},"end":{"line":14,"column":null}},"12":{"start":{"line":15,"column":0},"end":{"line":15,"column":null}},"13":{"start":{"line":16,"column":0},"end":{"line":16,"column":50}},"14":{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},"15":{"start":{"line":18,"column":18},"end":{"line":96,"column":1}},"16":{"start":{"line":19,"column":22},"end":{"line":19,"column":89}},"17":{"start":{"line":20,"column":15},"end":{"line":20,"column":41}},"18":{"start":{"line":22,"column":34},"end":{"line":22,"column":45}},"19":{"start":{"line":23,"column":21},"end":{"line":23,"column":47}},"20":{"start":{"line":26,"column":2},"end":{"line":35,"column":null}},"21":{"start":{"line":27,"column":33},"end":{"line":27,"column":94}},"22":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"23":{"start":{"line":30,"column":4},"end":{"line":32,"column":null}},"24":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"25":{"start":{"line":34,"column":4},"end":{"line":34,"column":null}},"26":{"start":{"line":37,"column":2},"end":{"line":48,"column":null}},"27":{"start":{"line":38,"column":4},"end":{"line":47,"column":null}},"28":{"start":{"line":39,"column":31},"end":{"line":39,"column":88}},"29":{"start":{"line":40,"column":6},"end":{"line":40,"column":null}},"30":{"start":{"line":42,"column":6},"end":{"line":44,"column":null}},"31":{"start":{"line":43,"column":8},"end":{"line":43,"column":null}},"32":{"start":{"line":46,"column":6},"end":{"line":46,"column":null}},"33":{"start":{"line":49,"column":24},"end":{"line":49,"column":50}},"34":{"start":{"line":51,"column":2},"end":{"line":94,"column":null}},"35":{"start":{"line":52,"column":4},"end":{"line":77,"column":null}},"36":{"start":{"line":54,"column":8},"end":{"line":54,"column":69}},"37":{"start":{"line":54,"column":69},"end":{"line":54,"column":null}},"38":{"start":{"line":56,"column":8},"end":{"line":56,"column":64}},"39":{"start":{"line":56,"column":64},"end":{"line":56,"column":null}},"40":{"start":{"line":58,"column":8},"end":{"line":58,"column":65}},"41":{"start":{"line":58,"column":65},"end":{"line":58,"column":null}},"42":{"start":{"line":60,"column":8},"end":{"line":60,"column":64}},"43":{"start":{"line":60,"column":64},"end":{"line":60,"column":null}},"44":{"start":{"line":62,"column":8},"end":{"line":62,"column":null}},"45":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"46":{"start":{"line":65,"column":8},"end":{"line":65,"column":44}},"47":{"start":{"line":65,"column":44},"end":{"line":65,"column":null}},"48":{"start":{"line":67,"column":8},"end":{"line":67,"column":62}},"49":{"start":{"line":67,"column":62},"end":{"line":67,"column":null}},"50":{"start":{"line":69,"column":8},"end":{"line":69,"column":72}},"51":{"start":{"line":69,"column":72},"end":{"line":69,"column":null}},"52":{"start":{"line":71,"column":8},"end":{"line":71,"column":64}},"53":{"start":{"line":71,"column":64},"end":{"line":71,"column":null}},"54":{"start":{"line":73,"column":8},"end":{"line":73,"column":64}},"55":{"start":{"line":73,"column":64},"end":{"line":73,"column":null}},"56":{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},"57":{"start":{"line":79,"column":4},"end":{"line":79,"column":null}},"58":{"start":{"line":80,"column":4},"end":{"line":93,"column":null}},"59":{"start":{"line":81,"column":6},"end":{"line":81,"column":null}},"60":{"start":{"line":82,"column":11},"end":{"line":93,"column":null}},"61":{"start":{"line":83,"column":20},"end":{"line":83,"column":131}},"62":{"start":{"line":84,"column":6},"end":{"line":86,"column":null}},"63":{"start":{"line":85,"column":8},"end":{"line":85,"column":null}},"64":{"start":{"line":87,"column":6},"end":{"line":87,"column":null}},"65":{"start":{"line":88,"column":6},"end":{"line":88,"column":null}},"66":{"start":{"line":89,"column":6},"end":{"line":89,"column":22}},"67":{"start":{"line":91,"column":6},"end":{"line":91,"column":null}},"68":{"start":{"line":92,"column":6},"end":{"line":92,"column":22}},"69":{"start":{"line":95,"column":2},"end":{"line":95,"column":null}},"70":{"start":{"line":96,"column":1},"end":{"line":96,"column":null}},"71":{"start":{"line":98,"column":32},"end":{"line":103,"column":1}},"72":{"start":{"line":99,"column":2},"end":{"line":102,"column":null}},"73":{"start":{"line":100,"column":29},"end":{"line":100,"column":66}},"74":{"start":{"line":101,"column":4},"end":{"line":101,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},"loc":{"start":{"line":16,"column":50},"end":{"line":16,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":18,"column":18},"end":{"line":18,"column":30}},"loc":{"start":{"line":18,"column":30},"end":{"line":96,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":98,"column":32},"end":{"line":98,"column":39}},"loc":{"start":{"line":98,"column":72},"end":{"line":103,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":50},"end":{"line":16,"column":null}}]},"1":{"loc":{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},"type":"cond-expr","locations":[{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},{"start":{"line":16,"column":50},"end":{"line":16,"column":null}}]},"2":{"loc":{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},"type":"binary-expr","locations":[{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},{"start":{"line":16,"column":50},"end":{"line":16,"column":null}},{"start":{"line":16,"column":50},"end":{"line":16,"column":null}}]},"3":{"loc":{"start":{"line":20,"column":15},"end":{"line":20,"column":41}},"type":"binary-expr","locations":[{"start":{"line":20,"column":15},"end":{"line":20,"column":35}},{"start":{"line":20,"column":39},"end":{"line":20,"column":41}}]},"4":{"loc":{"start":{"line":30,"column":4},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":30,"column":4},"end":{"line":32,"column":null}}]},"5":{"loc":{"start":{"line":37,"column":2},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":48,"column":null}}]},"6":{"loc":{"start":{"line":42,"column":6},"end":{"line":44,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":6},"end":{"line":44,"column":null}}]},"7":{"loc":{"start":{"line":52,"column":4},"end":{"line":77,"column":null}},"type":"switch","locations":[{"start":{"line":53,"column":6},"end":{"line":54,"column":null}},{"start":{"line":55,"column":6},"end":{"line":56,"column":null}},{"start":{"line":57,"column":6},"end":{"line":58,"column":null}},{"start":{"line":59,"column":6},"end":{"line":60,"column":null}},{"start":{"line":61,"column":6},"end":{"line":63,"column":null}},{"start":{"line":64,"column":6},"end":{"line":65,"column":null}},{"start":{"line":66,"column":6},"end":{"line":67,"column":null}},{"start":{"line":68,"column":6},"end":{"line":69,"column":null}},{"start":{"line":70,"column":6},"end":{"line":71,"column":null}},{"start":{"line":72,"column":6},"end":{"line":73,"column":null}},{"start":{"line":74,"column":6},"end":{"line":75,"column":null}}]},"8":{"loc":{"start":{"line":80,"column":4},"end":{"line":93,"column":null}},"type":"if","locations":[{"start":{"line":80,"column":4},"end":{"line":93,"column":null}},{"start":{"line":82,"column":11},"end":{"line":93,"column":null}}]},"9":{"loc":{"start":{"line":82,"column":11},"end":{"line":93,"column":null}},"type":"if","locations":[{"start":{"line":82,"column":11},"end":{"line":93,"column":null}},{"start":{"line":90,"column":11},"end":{"line":93,"column":null}}]},"10":{"loc":{"start":{"line":84,"column":6},"end":{"line":86,"column":null}},"type":"if","locations":[{"start":{"line":84,"column":6},"end":{"line":86,"column":null}}]},"11":{"loc":{"start":{"line":99,"column":2},"end":{"line":102,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":2},"end":{"line":102,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0,0],"4":[0],"5":[0],"6":[0],"7":[0,0,0,0,0,0,0,0,0,0,0],"8":[0,0],"9":[0,0],"10":[0],"11":[0]}} -,"/Users/zane/playground/cloudsite/src/cli/constants.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/constants.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}},"1":{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},"2":{"start":{"line":3,"column":18},"end":{"line":3,"column":46}},"3":{"start":{"line":5,"column":25},"end":{"line":5,"column":104}},"4":{"start":{"line":7,"column":21},"end":{"line":7,"column":91}},"5":{"start":{"line":9,"column":19},"end":{"line":13,"column":1}},"6":{"start":{"line":15,"column":13},"end":{"line":247,"column":1}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},"loc":{"start":{"line":1,"column":35},"end":{"line":1,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},"type":"if","locations":[{"start":{"line":1,"column":35},"end":{"line":1,"column":null}}]},"1":{"loc":{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},"type":"cond-expr","locations":[{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},{"start":{"line":1,"column":35},"end":{"line":1,"column":null}}]},"2":{"loc":{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},{"start":{"line":1,"column":35},"end":{"line":1,"column":null}},{"start":{"line":1,"column":35},"end":{"line":1,"column":null}}]}},"s":{"0":1,"1":61,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{"0":3},"b":{"0":[16],"1":[35,36],"2":[18,18,17]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/error-out.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/error-out.mjs","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":4,"column":1}},"1":{"start":{"line":2,"column":2},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":2},"end":{"line":3,"column":21}},"3":{"start":{"line":4,"column":1},"end":{"line":4,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":17},"end":{"line":1,"column":18}},"loc":{"start":{"line":1,"column":32},"end":{"line":4,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0},"f":{"0":0},"b":{}} -,"/Users/zane/playground/cloudsite/src/cli/lib/format-output.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/format-output.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":21},"end":{"line":15,"column":1}},"3":{"start":{"line":5,"column":2},"end":{"line":14,"column":null}},"4":{"start":{"line":6,"column":4},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":9},"end":{"line":14,"column":null}},"6":{"start":{"line":8,"column":4},"end":{"line":8,"column":null}},"7":{"start":{"line":10,"column":20},"end":{"line":10,"column":49}},"8":{"start":{"line":11,"column":17},"end":{"line":11,"column":49}},"9":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"10":{"start":{"line":15,"column":1},"end":{"line":15,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":21},"end":{"line":4,"column":22}},"loc":{"start":{"line":4,"column":45},"end":{"line":15,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":2},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":5,"column":2},"end":{"line":14,"column":null}},{"start":{"line":7,"column":9},"end":{"line":14,"column":null}}]},"1":{"loc":{"start":{"line":7,"column":9},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":7,"column":9},"end":{"line":14,"column":null}},{"start":{"line":9,"column":9},"end":{"line":14,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/get-site-info.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/get-site-info.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":20},"end":{"line":14,"column":1}},"2":{"start":{"line":4,"column":2},"end":{"line":6,"column":null}},"3":{"start":{"line":5,"column":4},"end":{"line":5,"column":null}},"4":{"start":{"line":8,"column":19},"end":{"line":8,"column":40}},"5":{"start":{"line":9,"column":2},"end":{"line":11,"column":null}},"6":{"start":{"line":10,"column":4},"end":{"line":10,"column":null}},"7":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"8":{"start":{"line":14,"column":1},"end":{"line":14,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":20},"end":{"line":3,"column":21}},"loc":{"start":{"line":3,"column":51},"end":{"line":14,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":2},"end":{"line":6,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":2},"end":{"line":6,"column":null}}]},"1":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"f":{"0":0},"b":{"0":[0],"1":[0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/get-value-container-and-key.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/get-value-container-and-key.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":32},"end":{"line":38,"column":1}},"2":{"start":{"line":4,"column":19},"end":{"line":4,"column":34}},"3":{"start":{"line":7,"column":2},"end":{"line":37,"column":null}},"4":{"start":{"line":9,"column":4},"end":{"line":36,"column":null}},"5":{"start":{"line":10,"column":6},"end":{"line":10,"column":null}},"6":{"start":{"line":11,"column":6},"end":{"line":23,"column":null}},"7":{"start":{"line":12,"column":40},"end":{"line":12,"column":44}},"8":{"start":{"line":13,"column":8},"end":{"line":15,"column":null}},"9":{"start":{"line":14,"column":10},"end":{"line":14,"column":null}},"10":{"start":{"line":16,"column":8},"end":{"line":18,"column":null}},"11":{"start":{"line":17,"column":10},"end":{"line":17,"column":null}},"12":{"start":{"line":20,"column":8},"end":{"line":22,"column":null}},"13":{"start":{"line":21,"column":10},"end":{"line":21,"column":null}},"14":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"15":{"start":{"line":27,"column":23},"end":{"line":27,"column":32}},"16":{"start":{"line":28,"column":6},"end":{"line":30,"column":null}},"17":{"start":{"line":29,"column":8},"end":{"line":29,"column":null}},"18":{"start":{"line":31,"column":24},"end":{"line":31,"column":42}},"19":{"start":{"line":32,"column":6},"end":{"line":34,"column":null}},"20":{"start":{"line":33,"column":8},"end":{"line":33,"column":null}},"21":{"start":{"line":35,"column":6},"end":{"line":35,"column":null}},"22":{"start":{"line":38,"column":1},"end":{"line":38,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":32},"end":{"line":3,"column":33}},"loc":{"start":{"line":3,"column":74},"end":{"line":38,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":25},"end":{"line":7,"column":26}},"loc":{"start":{"line":7,"column":60},"end":{"line":37,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":4},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":9,"column":4},"end":{"line":36,"column":null}},{"start":{"line":26,"column":11},"end":{"line":36,"column":null}}]},"1":{"loc":{"start":{"line":10,"column":10},"end":{"line":10,"column":24}},"type":"cond-expr","locations":[{"start":{"line":10,"column":17},"end":{"line":10,"column":20}},{"start":{"line":10,"column":13},"end":{"line":10,"column":24}}]},"2":{"loc":{"start":{"line":10,"column":10},"end":{"line":10,"column":20}},"type":"binary-expr","locations":[{"start":{"line":10,"column":10},"end":{"line":10,"column":20}},{"start":{"line":10,"column":17},"end":{"line":10,"column":20}}]},"3":{"loc":{"start":{"line":11,"column":6},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":11,"column":6},"end":{"line":23,"column":null}}]},"4":{"loc":{"start":{"line":13,"column":8},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":13,"column":8},"end":{"line":15,"column":null}}]},"5":{"loc":{"start":{"line":13,"column":12},"end":{"line":13,"column":61}},"type":"binary-expr","locations":[{"start":{"line":13,"column":12},"end":{"line":13,"column":36}},{"start":{"line":13,"column":40},"end":{"line":13,"column":61}}]},"6":{"loc":{"start":{"line":16,"column":8},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":8},"end":{"line":18,"column":null}}]},"7":{"loc":{"start":{"line":16,"column":12},"end":{"line":16,"column":66}},"type":"binary-expr","locations":[{"start":{"line":16,"column":12},"end":{"line":16,"column":33}},{"start":{"line":16,"column":37},"end":{"line":16,"column":66}}]},"8":{"loc":{"start":{"line":20,"column":8},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":8},"end":{"line":22,"column":null}}]},"9":{"loc":{"start":{"line":20,"column":12},"end":{"line":20,"column":58}},"type":"binary-expr","locations":[{"start":{"line":20,"column":12},"end":{"line":20,"column":36}},{"start":{"line":20,"column":40},"end":{"line":20,"column":58}}]},"10":{"loc":{"start":{"line":28,"column":6},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":6},"end":{"line":30,"column":null}}]},"11":{"loc":{"start":{"line":28,"column":10},"end":{"line":28,"column":41}},"type":"binary-expr","locations":[{"start":{"line":28,"column":10},"end":{"line":28,"column":32}},{"start":{"line":28,"column":36},"end":{"line":28,"column":41}}]},"12":{"loc":{"start":{"line":32,"column":6},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":32,"column":6},"end":{"line":34,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0],"4":[0],"5":[0,0],"6":[0],"7":[0,0],"8":[0],"9":[0,0],"10":[0],"11":[0,0],"12":[0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/handle-configuration.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-configuration.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":28},"end":{"line":21,"column":1}},"4":{"start":{"line":7,"column":31},"end":{"line":7,"column":92}},"5":{"start":{"line":7,"column":67},"end":{"line":7,"column":91}},"6":{"start":{"line":8,"column":35},"end":{"line":8,"column":65}},"7":{"start":{"line":9,"column":31},"end":{"line":9,"column":109}},"8":{"start":{"line":10,"column":25},"end":{"line":10,"column":45}},"9":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"10":{"start":{"line":13,"column":2},"end":{"line":20,"column":null}},"11":{"start":{"line":15,"column":6},"end":{"line":15,"column":90}},"12":{"start":{"line":15,"column":90},"end":{"line":15,"column":null}},"13":{"start":{"line":17,"column":6},"end":{"line":17,"column":84}},"14":{"start":{"line":17,"column":84},"end":{"line":17,"column":null}},"15":{"start":{"line":19,"column":6},"end":{"line":19,"column":null}},"16":{"start":{"line":21,"column":1},"end":{"line":21,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":28},"end":{"line":6,"column":35}},"loc":{"start":{"line":6,"column":72},"end":{"line":21,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":53},"end":{"line":7,"column":54}},"loc":{"start":{"line":7,"column":67},"end":{"line":7,"column":91}}}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":9},"end":{"line":11,"column":44}},"type":"binary-expr","locations":[{"start":{"line":11,"column":9},"end":{"line":11,"column":38}},{"start":{"line":11,"column":42},"end":{"line":11,"column":44}}]},"1":{"loc":{"start":{"line":13,"column":2},"end":{"line":20,"column":null}},"type":"switch","locations":[{"start":{"line":14,"column":4},"end":{"line":15,"column":null}},{"start":{"line":16,"column":4},"end":{"line":17,"column":null}},{"start":{"line":18,"column":4},"end":{"line":19,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0,0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/handle-create.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-create.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":9,"column":0},"end":{"line":9,"column":39}},"7":{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},"8":{"start":{"line":11,"column":21},"end":{"line":68,"column":1}},"9":{"start":{"line":12,"column":28},"end":{"line":12,"column":92}},"10":{"start":{"line":12,"column":64},"end":{"line":12,"column":81}},"11":{"start":{"line":13,"column":24},"end":{"line":13,"column":68}},"12":{"start":{"line":15,"column":28},"end":{"line":15,"column":65}},"13":{"start":{"line":17,"column":21},"end":{"line":17,"column":49}},"14":{"start":{"line":18,"column":21},"end":{"line":18,"column":49}},"15":{"start":{"line":19,"column":18},"end":{"line":19,"column":43}},"16":{"start":{"line":21,"column":21},"end":{"line":21,"column":65}},"17":{"start":{"line":22,"column":19},"end":{"line":22,"column":47}},"18":{"start":{"line":23,"column":20},"end":{"line":23,"column":47}},"19":{"start":{"line":24,"column":18},"end":{"line":24,"column":64}},"20":{"start":{"line":25,"column":2},"end":{"line":25,"column":37}},"21":{"start":{"line":27,"column":19},"end":{"line":27,"column":94}},"22":{"start":{"line":28,"column":2},"end":{"line":28,"column":null}},"23":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"24":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"25":{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},"26":{"start":{"line":36,"column":2},"end":{"line":42,"column":null}},"27":{"start":{"line":37,"column":4},"end":{"line":41,"column":null}},"28":{"start":{"line":38,"column":6},"end":{"line":38,"column":null}},"29":{"start":{"line":40,"column":6},"end":{"line":40,"column":22}},"30":{"start":{"line":45,"column":2},"end":{"line":51,"column":null}},"31":{"start":{"line":46,"column":33},"end":{"line":46,"column":89}},"32":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"33":{"start":{"line":48,"column":9},"end":{"line":51,"column":null}},"34":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"35":{"start":{"line":50,"column":4},"end":{"line":50,"column":20}},"36":{"start":{"line":53,"column":2},"end":{"line":56,"column":null}},"37":{"start":{"line":54,"column":4},"end":{"line":54,"column":null}},"38":{"start":{"line":55,"column":4},"end":{"line":55,"column":20}},"39":{"start":{"line":58,"column":2},"end":{"line":58,"column":null}},"40":{"start":{"line":61,"column":2},"end":{"line":65,"column":null}},"41":{"start":{"line":62,"column":4},"end":{"line":64,"column":null}},"42":{"start":{"line":63,"column":6},"end":{"line":63,"column":null}},"43":{"start":{"line":67,"column":2},"end":{"line":67,"column":null}},"44":{"start":{"line":68,"column":1},"end":{"line":68,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},"loc":{"start":{"line":9,"column":39},"end":{"line":9,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":11,"column":21},"end":{"line":11,"column":28}},"loc":{"start":{"line":11,"column":67},"end":{"line":68,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":12,"column":50},"end":{"line":12,"column":51}},"loc":{"start":{"line":12,"column":64},"end":{"line":12,"column":81}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},"type":"if","locations":[{"start":{"line":9,"column":39},"end":{"line":9,"column":null}}]},"1":{"loc":{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},"type":"cond-expr","locations":[{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},{"start":{"line":9,"column":39},"end":{"line":9,"column":null}}]},"2":{"loc":{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},"type":"binary-expr","locations":[{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},{"start":{"line":9,"column":39},"end":{"line":9,"column":null}},{"start":{"line":9,"column":39},"end":{"line":9,"column":null}}]},"3":{"loc":{"start":{"line":27,"column":19},"end":{"line":27,"column":94}},"type":"binary-expr","locations":[{"start":{"line":27,"column":19},"end":{"line":27,"column":40}},{"start":{"line":27,"column":44},"end":{"line":27,"column":94}}]},"4":{"loc":{"start":{"line":28,"column":20},"end":{"line":28,"column":74}},"type":"binary-expr","locations":[{"start":{"line":28,"column":20},"end":{"line":28,"column":40}},{"start":{"line":28,"column":44},"end":{"line":28,"column":59}},{"start":{"line":28,"column":63},"end":{"line":28,"column":74}}]},"5":{"loc":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":31,"column":null}}]},"6":{"loc":{"start":{"line":37,"column":4},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":41,"column":null}}]},"7":{"loc":{"start":{"line":45,"column":2},"end":{"line":51,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":2},"end":{"line":51,"column":null}},{"start":{"line":48,"column":9},"end":{"line":51,"column":null}}]},"8":{"loc":{"start":{"line":47,"column":17},"end":{"line":47,"column":76}},"type":"cond-expr","locations":[{"start":{"line":47,"column":52},"end":{"line":47,"column":64}},{"start":{"line":47,"column":67},"end":{"line":47,"column":76}}]},"9":{"loc":{"start":{"line":48,"column":9},"end":{"line":51,"column":null}},"type":"if","locations":[{"start":{"line":48,"column":9},"end":{"line":51,"column":null}}]},"10":{"loc":{"start":{"line":53,"column":2},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":56,"column":null}}]},"11":{"loc":{"start":{"line":53,"column":6},"end":{"line":53,"column":71}},"type":"binary-expr","locations":[{"start":{"line":53,"column":6},"end":{"line":53,"column":30}},{"start":{"line":53,"column":34},"end":{"line":53,"column":71}}]},"12":{"loc":{"start":{"line":62,"column":4},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":4},"end":{"line":64,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0,0],"4":[0,0,0],"5":[0],"6":[0],"7":[0,0],"8":[0,0],"9":[0],"10":[0],"11":[0,0],"12":[0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/handle-destroy.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-destroy.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":22},"end":{"line":26,"column":1}},"5":{"start":{"line":8,"column":29},"end":{"line":8,"column":94}},"6":{"start":{"line":8,"column":65},"end":{"line":8,"column":83}},"7":{"start":{"line":9,"column":25},"end":{"line":9,"column":70}},"8":{"start":{"line":10,"column":21},"end":{"line":10,"column":50}},"9":{"start":{"line":11,"column":24},"end":{"line":11,"column":38}},"10":{"start":{"line":13,"column":19},"end":{"line":13,"column":57}},"11":{"start":{"line":15,"column":2},"end":{"line":18,"column":null}},"12":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"13":{"start":{"line":17,"column":4},"end":{"line":17,"column":20}},"14":{"start":{"line":20,"column":18},"end":{"line":20,"column":76}},"15":{"start":{"line":22,"column":2},"end":{"line":25,"column":null}},"16":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"17":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"18":{"start":{"line":26,"column":1},"end":{"line":26,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":22},"end":{"line":7,"column":29}},"loc":{"start":{"line":7,"column":68},"end":{"line":26,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":51},"end":{"line":8,"column":52}},"loc":{"start":{"line":8,"column":65},"end":{"line":8,"column":83}}}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":2},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":2},"end":{"line":18,"column":null}}]},"1":{"loc":{"start":{"line":22,"column":2},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":25,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"f":{"0":0,"1":0},"b":{"0":[0],"1":[0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/handle-detail.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-detail.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":8,"column":21},"end":{"line":21,"column":1}},"6":{"start":{"line":9,"column":28},"end":{"line":9,"column":92}},"7":{"start":{"line":9,"column":64},"end":{"line":9,"column":81}},"8":{"start":{"line":10,"column":24},"end":{"line":10,"column":68}},"9":{"start":{"line":11,"column":21},"end":{"line":11,"column":49}},"10":{"start":{"line":12,"column":21},"end":{"line":12,"column":34}},"11":{"start":{"line":14,"column":2},"end":{"line":16,"column":null}},"12":{"start":{"line":15,"column":4},"end":{"line":15,"column":null}},"13":{"start":{"line":18,"column":17},"end":{"line":18,"column":55}},"14":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"15":{"start":{"line":21,"column":1},"end":{"line":21,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":21},"end":{"line":8,"column":22}},"loc":{"start":{"line":8,"column":46},"end":{"line":21,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":50},"end":{"line":9,"column":51}},"loc":{"start":{"line":9,"column":64},"end":{"line":9,"column":81}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":2},"end":{"line":16,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":16,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0},"f":{"0":0,"1":0},"b":{"0":[0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/handle-get-iam-policy.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-get-iam-policy.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":18},"end":{"line":89,"column":1}},"3":{"start":{"line":92,"column":1},"end":{"line":97,"column":41}},"4":{"start":{"line":99,"column":27},"end":{"line":108,"column":1}},"5":{"start":{"line":100,"column":34},"end":{"line":100,"column":106}},"6":{"start":{"line":100,"column":70},"end":{"line":100,"column":95}},"7":{"start":{"line":101,"column":30},"end":{"line":101,"column":80}},"8":{"start":{"line":102,"column":27},"end":{"line":102,"column":67}},"9":{"start":{"line":104,"column":2},"end":{"line":106,"column":null}},"10":{"start":{"line":105,"column":4},"end":{"line":105,"column":null}},"11":{"start":{"line":107,"column":2},"end":{"line":107,"column":null}},"12":{"start":{"line":108,"column":1},"end":{"line":108,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":99,"column":27},"end":{"line":99,"column":28}},"loc":{"start":{"line":99,"column":41},"end":{"line":108,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":100,"column":56},"end":{"line":100,"column":57}},"loc":{"start":{"line":100,"column":70},"end":{"line":100,"column":95}}}},"branchMap":{"0":{"loc":{"start":{"line":104,"column":2},"end":{"line":106,"column":null}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":106,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"f":{"0":0,"1":0},"b":{"0":[0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/handle-list.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-list.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":19},"end":{"line":23,"column":1}},"5":{"start":{"line":8,"column":26},"end":{"line":8,"column":88}},"6":{"start":{"line":8,"column":62},"end":{"line":8,"column":77}},"7":{"start":{"line":9,"column":22},"end":{"line":9,"column":64}},"8":{"start":{"line":10,"column":20},"end":{"line":10,"column":45}},"9":{"start":{"line":11,"column":21},"end":{"line":11,"column":32}},"10":{"start":{"line":13,"column":25},"end":{"line":13,"column":49}},"11":{"start":{"line":14,"column":17},"end":{"line":20,"column":6}},"12":{"start":{"line":17,"column":22},"end":{"line":17,"column":76}},"13":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"14":{"start":{"line":19,"column":6},"end":{"line":19,"column":null}},"15":{"start":{"line":22,"column":2},"end":{"line":22,"column":null}},"16":{"start":{"line":23,"column":1},"end":{"line":23,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":19},"end":{"line":7,"column":20}},"loc":{"start":{"line":7,"column":44},"end":{"line":23,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":48},"end":{"line":8,"column":49}},"loc":{"start":{"line":8,"column":62},"end":{"line":8,"column":77}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":16,"column":26},"end":{"line":16,"column":34}},"loc":{"start":{"line":16,"column":39},"end":{"line":20,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":17},"end":{"line":20,"column":6}},"type":"cond-expr","locations":[{"start":{"line":15,"column":6},"end":{"line":15,"column":20}},{"start":{"line":16,"column":6},"end":{"line":20,"column":6}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/handle-plugin-settings.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-plugin-settings.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":46}},"7":{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},"8":{"start":{"line":10,"column":29},"end":{"line":54,"column":1}},"9":{"start":{"line":11,"column":31},"end":{"line":11,"column":104}},"10":{"start":{"line":11,"column":67},"end":{"line":11,"column":93}},"11":{"start":{"line":12,"column":27},"end":{"line":12,"column":74}},"12":{"start":{"line":13,"column":21},"end":{"line":13,"column":52}},"13":{"start":{"line":14,"column":18},"end":{"line":14,"column":67}},"14":{"start":{"line":16,"column":44},"end":{"line":16,"column":60}},"15":{"start":{"line":19,"column":19},"end":{"line":19,"column":57}},"16":{"start":{"line":21,"column":2},"end":{"line":33,"column":null}},"17":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"18":{"start":{"line":23,"column":9},"end":{"line":33,"column":null}},"19":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"20":{"start":{"line":25,"column":9},"end":{"line":33,"column":null}},"21":{"start":{"line":26,"column":4},"end":{"line":32,"column":null}},"22":{"start":{"line":27,"column":6},"end":{"line":27,"column":58}},"23":{"start":{"line":28,"column":11},"end":{"line":32,"column":null}},"24":{"start":{"line":29,"column":6},"end":{"line":29,"column":null}},"25":{"start":{"line":30,"column":11},"end":{"line":32,"column":null}},"26":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"27":{"start":{"line":35,"column":2},"end":{"line":37,"column":null}},"28":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"29":{"start":{"line":40,"column":34},"end":{"line":40,"column":42}},"30":{"start":{"line":42,"column":2},"end":{"line":51,"column":null}},"31":{"start":{"line":43,"column":41},"end":{"line":43,"column":113}},"32":{"start":{"line":44,"column":4},"end":{"line":44,"column":null}},"33":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"34":{"start":{"line":47,"column":6},"end":{"line":47,"column":null}},"35":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"36":{"start":{"line":53,"column":2},"end":{"line":53,"column":null}},"37":{"start":{"line":54,"column":1},"end":{"line":54,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},"loc":{"start":{"line":8,"column":46},"end":{"line":8,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":10,"column":29},"end":{"line":10,"column":36}},"loc":{"start":{"line":10,"column":60},"end":{"line":54,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":11,"column":53},"end":{"line":11,"column":54}},"loc":{"start":{"line":11,"column":67},"end":{"line":11,"column":93}}}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":46},"end":{"line":8,"column":null}}]},"1":{"loc":{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},"type":"cond-expr","locations":[{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},{"start":{"line":8,"column":46},"end":{"line":8,"column":null}}]},"2":{"loc":{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},"type":"binary-expr","locations":[{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},{"start":{"line":8,"column":46},"end":{"line":8,"column":null}},{"start":{"line":8,"column":46},"end":{"line":8,"column":null}}]},"3":{"loc":{"start":{"line":21,"column":2},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":33,"column":null}},{"start":{"line":23,"column":9},"end":{"line":33,"column":null}}]},"4":{"loc":{"start":{"line":21,"column":6},"end":{"line":21,"column":70}},"type":"binary-expr","locations":[{"start":{"line":21,"column":6},"end":{"line":21,"column":23}},{"start":{"line":21,"column":28},"end":{"line":21,"column":47}},{"start":{"line":21,"column":51},"end":{"line":21,"column":69}}]},"5":{"loc":{"start":{"line":23,"column":9},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":9},"end":{"line":33,"column":null}},{"start":{"line":25,"column":9},"end":{"line":33,"column":null}}]},"6":{"loc":{"start":{"line":23,"column":13},"end":{"line":23,"column":52}},"type":"binary-expr","locations":[{"start":{"line":23,"column":13},"end":{"line":23,"column":30}},{"start":{"line":23,"column":34},"end":{"line":23,"column":52}}]},"7":{"loc":{"start":{"line":25,"column":9},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":9},"end":{"line":33,"column":null}}]},"8":{"loc":{"start":{"line":26,"column":4},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":32,"column":null}},{"start":{"line":28,"column":11},"end":{"line":32,"column":null}}]},"9":{"loc":{"start":{"line":26,"column":8},"end":{"line":26,"column":49}},"type":"binary-expr","locations":[{"start":{"line":26,"column":8},"end":{"line":26,"column":26}},{"start":{"line":26,"column":30},"end":{"line":26,"column":49}}]},"10":{"loc":{"start":{"line":28,"column":11},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":11},"end":{"line":32,"column":null}},{"start":{"line":30,"column":11},"end":{"line":32,"column":null}}]},"11":{"loc":{"start":{"line":28,"column":15},"end":{"line":28,"column":56}},"type":"binary-expr","locations":[{"start":{"line":28,"column":15},"end":{"line":28,"column":33}},{"start":{"line":28,"column":37},"end":{"line":28,"column":56}}]},"12":{"loc":{"start":{"line":30,"column":11},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":30,"column":11},"end":{"line":32,"column":null}}]},"13":{"loc":{"start":{"line":30,"column":15},"end":{"line":30,"column":56}},"type":"binary-expr","locations":[{"start":{"line":30,"column":15},"end":{"line":30,"column":33}},{"start":{"line":30,"column":37},"end":{"line":30,"column":56}}]},"14":{"loc":{"start":{"line":35,"column":2},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":2},"end":{"line":37,"column":null}}]},"15":{"loc":{"start":{"line":35,"column":6},"end":{"line":35,"column":47}},"type":"binary-expr","locations":[{"start":{"line":35,"column":6},"end":{"line":35,"column":23}},{"start":{"line":35,"column":27},"end":{"line":35,"column":47}}]},"16":{"loc":{"start":{"line":40,"column":10},"end":{"line":40,"column":30}},"type":"default-arg","locations":[{"start":{"line":40,"column":27},"end":{"line":40,"column":30}}]},"17":{"loc":{"start":{"line":42,"column":2},"end":{"line":51,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":51,"column":null}},{"start":{"line":49,"column":9},"end":{"line":51,"column":null}}]},"18":{"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":48,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0,0],"4":[0,0,0],"5":[0,0],"6":[0,0],"7":[0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0],"13":[0,0],"14":[0],"15":[0,0],"16":[0],"17":[0,0],"18":[0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/handle-update.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-update.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":21},"end":{"line":20,"column":1}},"5":{"start":{"line":8,"column":28},"end":{"line":8,"column":92}},"6":{"start":{"line":8,"column":64},"end":{"line":8,"column":81}},"7":{"start":{"line":9,"column":24},"end":{"line":9,"column":68}},"8":{"start":{"line":10,"column":21},"end":{"line":10,"column":49}},"9":{"start":{"line":11,"column":20},"end":{"line":11,"column":47}},"10":{"start":{"line":12,"column":16},"end":{"line":12,"column":39}},"11":{"start":{"line":13,"column":18},"end":{"line":13,"column":43}},"12":{"start":{"line":14,"column":18},"end":{"line":14,"column":43}},"13":{"start":{"line":15,"column":30},"end":{"line":15,"column":68}},"14":{"start":{"line":17,"column":19},"end":{"line":17,"column":57}},"15":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"16":{"start":{"line":20,"column":1},"end":{"line":20,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":21},"end":{"line":7,"column":28}},"loc":{"start":{"line":7,"column":67},"end":{"line":20,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":50},"end":{"line":8,"column":51}},"loc":{"start":{"line":8,"column":64},"end":{"line":8,"column":81}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{"0":0,"1":0},"b":{}} -,"/Users/zane/playground/cloudsite/src/cli/lib/handle-verify.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/handle-verify.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":8,"column":21},"end":{"line":27,"column":1}},"6":{"start":{"line":9,"column":28},"end":{"line":9,"column":92}},"7":{"start":{"line":9,"column":64},"end":{"line":9,"column":81}},"8":{"start":{"line":10,"column":24},"end":{"line":10,"column":68}},"9":{"start":{"line":11,"column":21},"end":{"line":11,"column":34}},"10":{"start":{"line":12,"column":21},"end":{"line":12,"column":49}},"11":{"start":{"line":13,"column":23},"end":{"line":13,"column":53}},"12":{"start":{"line":14,"column":22},"end":{"line":14,"column":52}},"13":{"start":{"line":15,"column":21},"end":{"line":15,"column":49}},"14":{"start":{"line":17,"column":19},"end":{"line":17,"column":57}},"15":{"start":{"line":20,"column":4},"end":{"line":20,"column":117}},"16":{"start":{"line":21,"column":24},"end":{"line":23,"column":15}},"17":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"18":{"start":{"line":22,"column":25},"end":{"line":22,"column":40}},"19":{"start":{"line":22,"column":47},"end":{"line":22,"column":null}},"20":{"start":{"line":22,"column":69},"end":{"line":22,"column":85}},"21":{"start":{"line":22,"column":94},"end":{"line":22,"column":105}},"22":{"start":{"line":25,"column":17},"end":{"line":25,"column":71}},"23":{"start":{"line":26,"column":2},"end":{"line":26,"column":null}},"24":{"start":{"line":27,"column":1},"end":{"line":27,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":21},"end":{"line":8,"column":28}},"loc":{"start":{"line":8,"column":67},"end":{"line":27,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":50},"end":{"line":9,"column":51}},"loc":{"start":{"line":9,"column":64},"end":{"line":9,"column":81}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":21,"column":39},"end":{"line":21,"column":40}},"loc":{"start":{"line":21,"column":64},"end":{"line":23,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},{"start":{"line":22,"column":47},"end":{"line":22,"column":null}}]},"1":{"loc":{"start":{"line":22,"column":47},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":47},"end":{"line":22,"column":null}},{"start":{"line":22,"column":92},"end":{"line":22,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/options.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/options.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":46}},"4":{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},"5":{"start":{"line":6,"column":22},"end":{"line":13,"column":4}},"6":{"start":{"line":7,"column":2},"end":{"line":13,"column":4}},"7":{"start":{"line":8,"column":24},"end":{"line":8,"column":45}},"8":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"9":{"start":{"line":10,"column":4},"end":{"line":10,"column":null}},"10":{"start":{"line":12,"column":4},"end":{"line":12,"column":null}},"11":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"12":{"start":{"line":15,"column":29},"end":{"line":36,"column":1}},"13":{"start":{"line":16,"column":34},"end":{"line":16,"column":42}},"14":{"start":{"line":18,"column":2},"end":{"line":32,"column":null}},"15":{"start":{"line":19,"column":4},"end":{"line":19,"column":56}},"16":{"start":{"line":20,"column":21},"end":{"line":20,"column":36}},"17":{"start":{"line":22,"column":4},"end":{"line":24,"column":null}},"18":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"19":{"start":{"line":26,"column":21},"end":{"line":26,"column":55}},"20":{"start":{"line":28,"column":24},"end":{"line":28,"column":50}},"21":{"start":{"line":30,"column":6},"end":{"line":30,"column":105}},"22":{"start":{"line":31,"column":4},"end":{"line":31,"column":null}},"23":{"start":{"line":34,"column":2},"end":{"line":34,"column":49}},"24":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"25":{"start":{"line":36,"column":1},"end":{"line":36,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},"loc":{"start":{"line":4,"column":46},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":6,"column":22},"end":{"line":6,"column":23}},"loc":{"start":{"line":7,"column":2},"end":{"line":13,"column":4}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":7,"column":18},"end":{"line":7,"column":22}},"loc":{"start":{"line":7,"column":27},"end":{"line":13,"column":3}}},"3":{"name":"(anonymous_5)","decl":{"start":{"line":15,"column":29},"end":{"line":15,"column":30}},"loc":{"start":{"line":15,"column":56},"end":{"line":36,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":46},"end":{"line":4,"column":null}}]},"1":{"loc":{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},"type":"cond-expr","locations":[{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},{"start":{"line":4,"column":46},"end":{"line":4,"column":null}}]},"2":{"loc":{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},"type":"binary-expr","locations":[{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},{"start":{"line":4,"column":46},"end":{"line":4,"column":null}},{"start":{"line":4,"column":46},"end":{"line":4,"column":null}}]},"3":{"loc":{"start":{"line":6,"column":23},"end":{"line":6,"column":38}},"type":"default-arg","locations":[{"start":{"line":6,"column":36},"end":{"line":6,"column":38}}]},"4":{"loc":{"start":{"line":9,"column":12},"end":{"line":9,"column":52}},"type":"binary-expr","locations":[{"start":{"line":9,"column":12},"end":{"line":9,"column":42}},{"start":{"line":9,"column":46},"end":{"line":9,"column":52}}]},"5":{"loc":{"start":{"line":9,"column":12},"end":{"line":9,"column":42}},"type":"cond-expr","locations":[{"start":{"line":9,"column":17},"end":{"line":9,"column":19}},{"start":{"line":9,"column":12},"end":{"line":9,"column":42}}]},"6":{"loc":{"start":{"line":9,"column":12},"end":{"line":9,"column":19}},"type":"binary-expr","locations":[{"start":{"line":9,"column":12},"end":{"line":9,"column":19}},{"start":{"line":9,"column":17},"end":{"line":9,"column":19}}]},"7":{"loc":{"start":{"line":16,"column":10},"end":{"line":16,"column":30}},"type":"default-arg","locations":[{"start":{"line":16,"column":27},"end":{"line":16,"column":30}}]},"8":{"loc":{"start":{"line":22,"column":4},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":24,"column":null}}]},"9":{"loc":{"start":{"line":26,"column":21},"end":{"line":26,"column":55}},"type":"cond-expr","locations":[{"start":{"line":26,"column":46},"end":{"line":26,"column":48}},{"start":{"line":26,"column":24},"end":{"line":26,"column":55}}]},"10":{"loc":{"start":{"line":26,"column":21},"end":{"line":26,"column":48}},"type":"binary-expr","locations":[{"start":{"line":26,"column":21},"end":{"line":26,"column":48}},{"start":{"line":26,"column":46},"end":{"line":26,"column":48}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0],"8":[0],"9":[0,0],"10":[0,0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/smart-convert.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/smart-convert.mjs","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":20,"column":1}},"1":{"start":{"line":2,"column":2},"end":{"line":19,"column":null}},"2":{"start":{"line":3,"column":4},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":9},"end":{"line":19,"column":null}},"4":{"start":{"line":5,"column":4},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":9},"end":{"line":19,"column":null}},"6":{"start":{"line":7,"column":4},"end":{"line":7,"column":null}},"7":{"start":{"line":8,"column":9},"end":{"line":19,"column":null}},"8":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"9":{"start":{"line":10,"column":9},"end":{"line":19,"column":null}},"10":{"start":{"line":11,"column":4},"end":{"line":11,"column":null}},"11":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"12":{"start":{"line":14,"column":4},"end":{"line":18,"column":null}},"13":{"start":{"line":15,"column":6},"end":{"line":15,"column":null}},"14":{"start":{"line":17,"column":6},"end":{"line":17,"column":null}},"15":{"start":{"line":20,"column":1},"end":{"line":20,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":22},"end":{"line":1,"column":27}},"loc":{"start":{"line":1,"column":32},"end":{"line":20,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":2},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":2,"column":2},"end":{"line":19,"column":null}},{"start":{"line":4,"column":9},"end":{"line":19,"column":null}}]},"1":{"loc":{"start":{"line":4,"column":9},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":9},"end":{"line":19,"column":null}},{"start":{"line":6,"column":9},"end":{"line":19,"column":null}}]},"2":{"loc":{"start":{"line":4,"column":13},"end":{"line":4,"column":49}},"type":"binary-expr","locations":[{"start":{"line":4,"column":13},"end":{"line":4,"column":29}},{"start":{"line":4,"column":33},"end":{"line":4,"column":49}}]},"3":{"loc":{"start":{"line":6,"column":9},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":6,"column":9},"end":{"line":19,"column":null}},{"start":{"line":8,"column":9},"end":{"line":19,"column":null}}]},"4":{"loc":{"start":{"line":6,"column":13},"end":{"line":6,"column":51}},"type":"binary-expr","locations":[{"start":{"line":6,"column":13},"end":{"line":6,"column":30}},{"start":{"line":6,"column":34},"end":{"line":6,"column":51}}]},"5":{"loc":{"start":{"line":8,"column":9},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":9},"end":{"line":19,"column":null}},{"start":{"line":10,"column":9},"end":{"line":19,"column":null}}]},"6":{"loc":{"start":{"line":10,"column":9},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":9},"end":{"line":19,"column":null}},{"start":{"line":12,"column":9},"end":{"line":19,"column":null}}]},"7":{"loc":{"start":{"line":14,"column":4},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":4},"end":{"line":18,"column":null}},{"start":{"line":16,"column":11},"end":{"line":18,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/configuration/handle-configuration-initialize.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/configuration/handle-configuration-initialize.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":53}},"4":{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},"5":{"start":{"line":8,"column":38},"end":{"line":30,"column":1}},"6":{"start":{"line":9,"column":30},"end":{"line":17,"column":3}},"7":{"start":{"line":19,"column":21},"end":{"line":19,"column":60}},"8":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"9":{"start":{"line":22,"column":18},"end":{"line":23,"column":86}},"10":{"start":{"line":23,"column":45},"end":{"line":23,"column":69}},"11":{"start":{"line":23,"column":69},"end":{"line":23,"column":80}},"12":{"start":{"line":25,"column":28},"end":{"line":25,"column":47}},"13":{"start":{"line":26,"column":32},"end":{"line":26,"column":67}},"14":{"start":{"line":28,"column":2},"end":{"line":28,"column":null}},"15":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}},"16":{"start":{"line":30,"column":1},"end":{"line":30,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},"loc":{"start":{"line":6,"column":53},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":8,"column":38},"end":{"line":8,"column":50}},"loc":{"start":{"line":8,"column":50},"end":{"line":30,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":23,"column":12},"end":{"line":23,"column":13}},"loc":{"start":{"line":23,"column":43},"end":{"line":23,"column":81}}}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},"type":"if","locations":[{"start":{"line":6,"column":53},"end":{"line":6,"column":null}}]},"1":{"loc":{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},"type":"cond-expr","locations":[{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},{"start":{"line":6,"column":53},"end":{"line":6,"column":null}}]},"2":{"loc":{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},"type":"binary-expr","locations":[{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},{"start":{"line":6,"column":53},"end":{"line":6,"column":null}},{"start":{"line":6,"column":53},"end":{"line":6,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0]}} -,"/Users/zane/playground/cloudsite/src/cli/lib/configuration/handle-configuration-show.mjs": {"path":"/Users/zane/playground/cloudsite/src/cli/lib/configuration/handle-configuration-show.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":53}},"2":{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":32},"end":{"line":9,"column":1}},"4":{"start":{"line":6,"column":28},"end":{"line":6,"column":47}},"5":{"start":{"line":7,"column":32},"end":{"line":7,"column":91}},"6":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"7":{"start":{"line":9,"column":1},"end":{"line":9,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},"loc":{"start":{"line":3,"column":53},"end":{"line":3,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":5,"column":32},"end":{"line":5,"column":44}},"loc":{"start":{"line":5,"column":44},"end":{"line":9,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},"type":"if","locations":[{"start":{"line":3,"column":53},"end":{"line":3,"column":null}}]},"1":{"loc":{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},"type":"cond-expr","locations":[{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},{"start":{"line":3,"column":53},"end":{"line":3,"column":null}}]},"2":{"loc":{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},"type":"binary-expr","locations":[{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},{"start":{"line":3,"column":53},"end":{"line":3,"column":null}},{"start":{"line":3,"column":53},"end":{"line":3,"column":null}}]}},"s":{"0":1,"1":1,"2":16,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{"0":3,"1":1},"b":{"0":[1],"1":[5,6],"2":[3,3,2]}} -,"/Users/zane/playground/cloudsite/src/lib/actions/create.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/create.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"7":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"8":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"9":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"10":{"start":{"line":12,"column":0},"end":{"line":12,"column":null}},"11":{"start":{"line":13,"column":0},"end":{"line":13,"column":55}},"12":{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},"13":{"start":{"line":15,"column":29},"end":{"line":15,"column":31}},"14":{"start":{"line":17,"column":15},"end":{"line":70,"column":1}},"15":{"start":{"line":23,"column":25},"end":{"line":23,"column":33}},"16":{"start":{"line":24,"column":23},"end":{"line":24,"column":31}},"17":{"start":{"line":26,"column":22},"end":{"line":26,"column":55}},"18":{"start":{"line":28,"column":20},"end":{"line":31,"column":4}},"19":{"start":{"line":33,"column":35},"end":{"line":33,"column":83}},"20":{"start":{"line":34,"column":2},"end":{"line":38,"column":null}},"21":{"start":{"line":35,"column":4},"end":{"line":35,"column":null}},"22":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"23":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"24":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"25":{"start":{"line":41,"column":2},"end":{"line":46,"column":null}},"26":{"start":{"line":42,"column":31},"end":{"line":42,"column":74}},"27":{"start":{"line":44,"column":7},"end":{"line":44,"column":110}},"28":{"start":{"line":45,"column":4},"end":{"line":45,"column":null}},"29":{"start":{"line":48,"column":2},"end":{"line":48,"column":null}},"30":{"start":{"line":49,"column":2},"end":{"line":49,"column":null}},"31":{"start":{"line":50,"column":23},"end":{"line":50,"column":90}},"32":{"start":{"line":52,"column":2},"end":{"line":69,"column":null}},"33":{"start":{"line":53,"column":31},"end":{"line":56,"column":73}},"34":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}},"35":{"start":{"line":56,"column":41},"end":{"line":56,"column":72}},"36":{"start":{"line":58,"column":4},"end":{"line":58,"column":52}},"37":{"start":{"line":59,"column":4},"end":{"line":64,"column":null}},"38":{"start":{"line":63,"column":8},"end":{"line":63,"column":76}},"39":{"start":{"line":66,"column":4},"end":{"line":66,"column":null}},"40":{"start":{"line":68,"column":4},"end":{"line":68,"column":null}},"41":{"start":{"line":70,"column":1},"end":{"line":70,"column":null}},"42":{"start":{"line":72,"column":24},"end":{"line":90,"column":1}},"43":{"start":{"line":73,"column":2},"end":{"line":73,"column":null}},"44":{"start":{"line":74,"column":31},"end":{"line":74,"column":89}},"45":{"start":{"line":75,"column":34},"end":{"line":75,"column":83}},"46":{"start":{"line":76,"column":23},"end":{"line":76,"column":68}},"47":{"start":{"line":78,"column":17},"end":{"line":78,"column":34}},"48":{"start":{"line":79,"column":2},"end":{"line":83,"column":null}},"49":{"start":{"line":80,"column":4},"end":{"line":82,"column":null}},"50":{"start":{"line":81,"column":6},"end":{"line":81,"column":null}},"51":{"start":{"line":84,"column":2},"end":{"line":84,"column":null}},"52":{"start":{"line":85,"column":2},"end":{"line":87,"column":null}},"53":{"start":{"line":86,"column":4},"end":{"line":86,"column":null}},"54":{"start":{"line":89,"column":2},"end":{"line":89,"column":null}},"55":{"start":{"line":92,"column":26},"end":{"line":126,"column":1}},"56":{"start":{"line":93,"column":2},"end":{"line":93,"column":null}},"57":{"start":{"line":94,"column":16},"end":{"line":118,"column":3}},"58":{"start":{"line":120,"column":18},"end":{"line":120,"column":54}},"59":{"start":{"line":121,"column":19},"end":{"line":121,"column":48}},"60":{"start":{"line":123,"column":29},"end":{"line":123,"column":37}},"61":{"start":{"line":125,"column":2},"end":{"line":125,"column":null}},"62":{"start":{"line":128,"column":24},"end":{"line":156,"column":1}},"63":{"start":{"line":129,"column":33},"end":{"line":129,"column":41}},"64":{"start":{"line":131,"column":23},"end":{"line":131,"column":66}},"65":{"start":{"line":132,"column":2},"end":{"line":132,"column":null}},"66":{"start":{"line":133,"column":2},"end":{"line":133,"column":null}},"67":{"start":{"line":135,"column":33},"end":{"line":135,"column":54}},"68":{"start":{"line":137,"column":31},"end":{"line":137,"column":80}},"69":{"start":{"line":138,"column":20},"end":{"line":138,"column":90}},"70":{"start":{"line":139,"column":22},"end":{"line":145,"column":3}},"71":{"start":{"line":146,"column":24},"end":{"line":146,"column":59}},"72":{"start":{"line":147,"column":25},"end":{"line":147,"column":71}},"73":{"start":{"line":149,"column":22},"end":{"line":149,"column":36}},"74":{"start":{"line":151,"column":2},"end":{"line":151,"column":null}},"75":{"start":{"line":152,"column":2},"end":{"line":152,"column":null}},"76":{"start":{"line":154,"column":23},"end":{"line":154,"column":101}},"77":{"start":{"line":155,"column":2},"end":{"line":155,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},"loc":{"start":{"line":13,"column":55},"end":{"line":13,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":17,"column":15},"end":{"line":17,"column":22}},"loc":{"start":{"line":22,"column":6},"end":{"line":70,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":79},"end":{"line":53,"column":88}},"loc":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}}},"3":{"name":"(anonymous_5)","decl":{"start":{"line":56,"column":14},"end":{"line":56,"column":15}},"loc":{"start":{"line":56,"column":41},"end":{"line":56,"column":72}}},"4":{"name":"(anonymous_6)","decl":{"start":{"line":62,"column":33},"end":{"line":62,"column":34}},"loc":{"start":{"line":63,"column":8},"end":{"line":63,"column":76}}},"5":{"name":"(anonymous_7)","decl":{"start":{"line":72,"column":24},"end":{"line":72,"column":31}},"loc":{"start":{"line":72,"column":72},"end":{"line":90,"column":1}}},"6":{"name":"(anonymous_8)","decl":{"start":{"line":92,"column":26},"end":{"line":92,"column":33}},"loc":{"start":{"line":92,"column":63},"end":{"line":126,"column":1}}},"7":{"name":"(anonymous_9)","decl":{"start":{"line":128,"column":24},"end":{"line":128,"column":31}},"loc":{"start":{"line":128,"column":80},"end":{"line":156,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},"type":"if","locations":[{"start":{"line":13,"column":55},"end":{"line":13,"column":null}}]},"1":{"loc":{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},"type":"cond-expr","locations":[{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},{"start":{"line":13,"column":55},"end":{"line":13,"column":null}}]},"2":{"loc":{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},"type":"binary-expr","locations":[{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},{"start":{"line":13,"column":55},"end":{"line":13,"column":null}},{"start":{"line":13,"column":55},"end":{"line":13,"column":null}}]},"3":{"loc":{"start":{"line":34,"column":2},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":38,"column":null}}]},"4":{"loc":{"start":{"line":41,"column":2},"end":{"line":46,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":46,"column":null}}]},"5":{"loc":{"start":{"line":52,"column":2},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":69,"column":null}},{"start":{"line":67,"column":9},"end":{"line":69,"column":null}}]},"6":{"loc":{"start":{"line":53,"column":43},"end":{"line":53,"column":72}},"type":"binary-expr","locations":[{"start":{"line":53,"column":43},"end":{"line":53,"column":66}},{"start":{"line":53,"column":70},"end":{"line":53,"column":72}}]},"7":{"loc":{"start":{"line":80,"column":4},"end":{"line":82,"column":null}},"type":"if","locations":[{"start":{"line":80,"column":4},"end":{"line":82,"column":null}}]},"8":{"loc":{"start":{"line":85,"column":2},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":85,"column":2},"end":{"line":87,"column":null}}]},"9":{"loc":{"start":{"line":138,"column":20},"end":{"line":138,"column":90}},"type":"binary-expr","locations":[{"start":{"line":138,"column":20},"end":{"line":138,"column":38}},{"start":{"line":138,"column":42},"end":{"line":138,"column":90}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0],"4":[0],"5":[0,0],"6":[0,0],"7":[0],"8":[0],"9":[0,0]}} -,"/Users/zane/playground/cloudsite/src/lib/actions/destroy.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/destroy.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"7":{"start":{"line":11,"column":16},"end":{"line":59,"column":1}},"8":{"start":{"line":12,"column":36},"end":{"line":12,"column":44}},"9":{"start":{"line":14,"column":22},"end":{"line":14,"column":51}},"10":{"start":{"line":15,"column":19},"end":{"line":15,"column":48}},"11":{"start":{"line":18,"column":2},"end":{"line":27,"column":null}},"12":{"start":{"line":19,"column":4},"end":{"line":19,"column":null}},"13":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"14":{"start":{"line":22,"column":4},"end":{"line":26,"column":null}},"15":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"16":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"17":{"start":{"line":29,"column":23},"end":{"line":29,"column":66}},"18":{"start":{"line":30,"column":2},"end":{"line":30,"column":null}},"19":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"20":{"start":{"line":33,"column":31},"end":{"line":33,"column":72}},"21":{"start":{"line":34,"column":29},"end":{"line":34,"column":78}},"22":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"23":{"start":{"line":38,"column":2},"end":{"line":58,"column":null}},"24":{"start":{"line":39,"column":24},"end":{"line":39,"column":109}},"25":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"26":{"start":{"line":42,"column":4},"end":{"line":47,"column":null}},"27":{"start":{"line":43,"column":6},"end":{"line":43,"column":null}},"28":{"start":{"line":44,"column":6},"end":{"line":44,"column":null}},"29":{"start":{"line":45,"column":11},"end":{"line":47,"column":null}},"30":{"start":{"line":46,"column":6},"end":{"line":46,"column":null}},"31":{"start":{"line":50,"column":4},"end":{"line":55,"column":null}},"32":{"start":{"line":51,"column":6},"end":{"line":51,"column":null}},"33":{"start":{"line":52,"column":6},"end":{"line":52,"column":null}},"34":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}},"35":{"start":{"line":57,"column":4},"end":{"line":57,"column":null}},"36":{"start":{"line":59,"column":1},"end":{"line":59,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":16},"end":{"line":11,"column":23}},"loc":{"start":{"line":11,"column":64},"end":{"line":59,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":4},"end":{"line":19,"column":54}},"type":"binary-expr","locations":[{"start":{"line":19,"column":4},"end":{"line":19,"column":20}},{"start":{"line":19,"column":4},"end":{"line":19,"column":20}},{"start":{"line":19,"column":4},"end":{"line":19,"column":54}}]},"1":{"loc":{"start":{"line":22,"column":4},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":26,"column":null}},{"start":{"line":24,"column":11},"end":{"line":26,"column":null}}]},"2":{"loc":{"start":{"line":23,"column":6},"end":{"line":23,"column":56}},"type":"binary-expr","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":22}},{"start":{"line":23,"column":6},"end":{"line":23,"column":22}},{"start":{"line":23,"column":6},"end":{"line":23,"column":56}}]},"3":{"loc":{"start":{"line":40,"column":4},"end":{"line":40,"column":64}},"type":"binary-expr","locations":[{"start":{"line":40,"column":4},"end":{"line":40,"column":20}},{"start":{"line":40,"column":4},"end":{"line":40,"column":20}},{"start":{"line":40,"column":4},"end":{"line":40,"column":64}}]},"4":{"loc":{"start":{"line":42,"column":4},"end":{"line":47,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":47,"column":null}},{"start":{"line":45,"column":11},"end":{"line":47,"column":null}}]},"5":{"loc":{"start":{"line":42,"column":8},"end":{"line":42,"column":71}},"type":"binary-expr","locations":[{"start":{"line":42,"column":8},"end":{"line":42,"column":39}},{"start":{"line":42,"column":43},"end":{"line":42,"column":71}}]},"6":{"loc":{"start":{"line":45,"column":11},"end":{"line":47,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":11},"end":{"line":47,"column":null}}]},"7":{"loc":{"start":{"line":50,"column":4},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":4},"end":{"line":55,"column":null}},{"start":{"line":53,"column":11},"end":{"line":55,"column":null}}]},"8":{"loc":{"start":{"line":57,"column":4},"end":{"line":57,"column":31}},"type":"binary-expr","locations":[{"start":{"line":57,"column":4},"end":{"line":57,"column":20}},{"start":{"line":57,"column":4},"end":{"line":57,"column":20}},{"start":{"line":57,"column":4},"end":{"line":57,"column":31}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0},"f":{"0":0},"b":{"0":[0,0,0],"1":[0,0],"2":[0,0,0],"3":[0,0,0],"4":[0,0],"5":[0,0],"6":[0],"7":[0,0],"8":[0,0,0]}} -,"/Users/zane/playground/cloudsite/src/lib/actions/update.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/update.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":8,"column":15},"end":{"line":32,"column":1}},"6":{"start":{"line":9,"column":16},"end":{"line":9,"column":87}},"7":{"start":{"line":11,"column":22},"end":{"line":11,"column":51}},"8":{"start":{"line":13,"column":18},"end":{"line":13,"column":20}},"9":{"start":{"line":14,"column":2},"end":{"line":17,"column":null}},"10":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"11":{"start":{"line":19,"column":2},"end":{"line":21,"column":null}},"12":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"13":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"14":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"15":{"start":{"line":27,"column":2},"end":{"line":27,"column":null}},"16":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"17":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"18":{"start":{"line":32,"column":1},"end":{"line":32,"column":null}},"19":{"start":{"line":34,"column":24},"end":{"line":51,"column":1}},"20":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"21":{"start":{"line":37,"column":39},"end":{"line":37,"column":47}},"22":{"start":{"line":39,"column":27},"end":{"line":39,"column":64}},"23":{"start":{"line":40,"column":33},"end":{"line":49,"column":4}},"24":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":15},"end":{"line":8,"column":22}},"loc":{"start":{"line":8,"column":111},"end":{"line":32,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":34,"column":24},"end":{"line":34,"column":31}},"loc":{"start":{"line":34,"column":61},"end":{"line":51,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":16},"end":{"line":9,"column":87}},"type":"binary-expr","locations":[{"start":{"line":9,"column":16},"end":{"line":9,"column":39}},{"start":{"line":9,"column":43},"end":{"line":9,"column":62}},{"start":{"line":9,"column":66},"end":{"line":9,"column":87}}]},"1":{"loc":{"start":{"line":14,"column":2},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":17,"column":null}}]},"2":{"loc":{"start":{"line":14,"column":6},"end":{"line":14,"column":42}},"type":"binary-expr","locations":[{"start":{"line":14,"column":6},"end":{"line":14,"column":20}},{"start":{"line":14,"column":24},"end":{"line":14,"column":42}}]},"3":{"loc":{"start":{"line":19,"column":2},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":2},"end":{"line":21,"column":null}}]},"4":{"loc":{"start":{"line":19,"column":6},"end":{"line":19,"column":38}},"type":"binary-expr","locations":[{"start":{"line":19,"column":6},"end":{"line":19,"column":20}},{"start":{"line":19,"column":24},"end":{"line":19,"column":38}}]},"5":{"loc":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":25,"column":null}}]},"6":{"loc":{"start":{"line":23,"column":6},"end":{"line":23,"column":40}},"type":"binary-expr","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":20}},{"start":{"line":23,"column":24},"end":{"line":23,"column":40}}]},"7":{"loc":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":31,"column":null}}]},"8":{"loc":{"start":{"line":29,"column":6},"end":{"line":29,"column":76}},"type":"binary-expr","locations":[{"start":{"line":29,"column":7},"end":{"line":29,"column":21}},{"start":{"line":29,"column":25},"end":{"line":29,"column":43}},{"start":{"line":29,"column":48},"end":{"line":29,"column":76}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0},"f":{"0":0,"1":0},"b":{"0":[0,0,0],"1":[0],"2":[0,0],"3":[0],"4":[0,0],"5":[0],"6":[0,0],"7":[0],"8":[0,0,0]}} -,"/Users/zane/playground/cloudsite/src/lib/actions/verify.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/verify.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"2":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"3":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"4":{"start":{"line":11,"column":26},"end":{"line":11,"column":30}},"5":{"start":{"line":13,"column":15},"end":{"line":34,"column":1}},"6":{"start":{"line":14,"column":19},"end":{"line":14,"column":102}},"7":{"start":{"line":16,"column":2},"end":{"line":18,"column":null}},"8":{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},"9":{"start":{"line":20,"column":17},"end":{"line":20,"column":19}},"10":{"start":{"line":21,"column":2},"end":{"line":23,"column":null}},"11":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"12":{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},"13":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"14":{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},"15":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"16":{"start":{"line":31,"column":18},"end":{"line":31,"column":43}},"17":{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},"18":{"start":{"line":33,"column":42},"end":{"line":33,"column":62}},"19":{"start":{"line":33,"column":62},"end":{"line":33,"column":73}},"20":{"start":{"line":34,"column":1},"end":{"line":34,"column":null}},"21":{"start":{"line":36,"column":23},"end":{"line":73,"column":1}},"22":{"start":{"line":37,"column":2},"end":{"line":39,"column":null}},"23":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"24":{"start":{"line":40,"column":37},"end":{"line":40,"column":45}},"25":{"start":{"line":42,"column":19},"end":{"line":42,"column":48}},"26":{"start":{"line":43,"column":19},"end":{"line":43,"column":58}},"27":{"start":{"line":45,"column":22},"end":{"line":45,"column":70}},"28":{"start":{"line":46,"column":2},"end":{"line":72,"column":null}},"29":{"start":{"line":47,"column":23},"end":{"line":47,"column":86}},"30":{"start":{"line":49,"column":25},"end":{"line":49,"column":50}},"31":{"start":{"line":50,"column":25},"end":{"line":50,"column":50}},"32":{"start":{"line":51,"column":25},"end":{"line":51,"column":50}},"33":{"start":{"line":52,"column":20},"end":{"line":52,"column":69}},"34":{"start":{"line":53,"column":4},"end":{"line":60,"column":null}},"35":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}},"36":{"start":{"line":55,"column":6},"end":{"line":55,"column":null}},"37":{"start":{"line":57,"column":6},"end":{"line":57,"column":null}},"38":{"start":{"line":58,"column":6},"end":{"line":59,"column":null}},"39":{"start":{"line":62,"column":4},"end":{"line":62,"column":null}},"40":{"start":{"line":64,"column":4},"end":{"line":64,"column":null}},"41":{"start":{"line":65,"column":4},"end":{"line":65,"column":null}},"42":{"start":{"line":67,"column":4},"end":{"line":67,"column":null}},"43":{"start":{"line":69,"column":4},"end":{"line":71,"column":null}},"44":{"start":{"line":70,"column":6},"end":{"line":70,"column":null}},"45":{"start":{"line":75,"column":22},"end":{"line":103,"column":1}},"46":{"start":{"line":76,"column":2},"end":{"line":78,"column":null}},"47":{"start":{"line":77,"column":4},"end":{"line":77,"column":null}},"48":{"start":{"line":79,"column":25},"end":{"line":79,"column":33}},"49":{"start":{"line":81,"column":2},"end":{"line":102,"column":null}},"50":{"start":{"line":82,"column":27},"end":{"line":85,"column":6}},"51":{"start":{"line":87,"column":20},"end":{"line":89,"column":null}},"52":{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},"53":{"start":{"line":94,"column":4},"end":{"line":97,"column":null}},"54":{"start":{"line":99,"column":4},"end":{"line":101,"column":null}},"55":{"start":{"line":100,"column":6},"end":{"line":100,"column":null}},"56":{"start":{"line":105,"column":21},"end":{"line":164,"column":1}},"57":{"start":{"line":106,"column":2},"end":{"line":108,"column":null}},"58":{"start":{"line":107,"column":4},"end":{"line":107,"column":null}},"59":{"start":{"line":110,"column":22},"end":{"line":110,"column":53}},"60":{"start":{"line":112,"column":2},"end":{"line":161,"column":null}},"61":{"start":{"line":113,"column":26},"end":{"line":113,"column":34}},"62":{"start":{"line":114,"column":21},"end":{"line":114,"column":62}},"63":{"start":{"line":115,"column":31},"end":{"line":115,"column":85}},"64":{"start":{"line":116,"column":34},"end":{"line":116,"column":97}},"65":{"start":{"line":118,"column":47},"end":{"line":120,"column":6}},"66":{"start":{"line":123,"column":4},"end":{"line":131,"column":null}},"67":{"start":{"line":124,"column":6},"end":{"line":126,"column":null}},"68":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"69":{"start":{"line":127,"column":6},"end":{"line":127,"column":null}},"70":{"start":{"line":127,"column":35},"end":{"line":127,"column":73}},"71":{"start":{"line":129,"column":6},"end":{"line":129,"column":null}},"72":{"start":{"line":130,"column":6},"end":{"line":130,"column":null}},"73":{"start":{"line":133,"column":29},"end":{"line":133,"column":72}},"74":{"start":{"line":134,"column":4},"end":{"line":153,"column":null}},"75":{"start":{"line":135,"column":6},"end":{"line":135,"column":null}},"76":{"start":{"line":136,"column":6},"end":{"line":139,"column":null}},"77":{"start":{"line":140,"column":11},"end":{"line":153,"column":null}},"78":{"start":{"line":141,"column":6},"end":{"line":141,"column":null}},"79":{"start":{"line":142,"column":6},"end":{"line":142,"column":null}},"80":{"start":{"line":143,"column":11},"end":{"line":153,"column":null}},"81":{"start":{"line":144,"column":6},"end":{"line":144,"column":null}},"82":{"start":{"line":145,"column":6},"end":{"line":145,"column":null}},"83":{"start":{"line":146,"column":11},"end":{"line":153,"column":null}},"84":{"start":{"line":147,"column":6},"end":{"line":147,"column":null}},"85":{"start":{"line":148,"column":6},"end":{"line":149,"column":null}},"86":{"start":{"line":151,"column":6},"end":{"line":151,"column":null}},"87":{"start":{"line":152,"column":6},"end":{"line":152,"column":null}},"88":{"start":{"line":155,"column":4},"end":{"line":155,"column":null}},"89":{"start":{"line":156,"column":4},"end":{"line":156,"column":null}},"90":{"start":{"line":158,"column":4},"end":{"line":160,"column":null}},"91":{"start":{"line":159,"column":6},"end":{"line":159,"column":null}},"92":{"start":{"line":163,"column":2},"end":{"line":163,"column":null}},"93":{"start":{"line":166,"column":28},"end":{"line":179,"column":1}},"94":{"start":{"line":167,"column":17},"end":{"line":170,"column":3}},"95":{"start":{"line":172,"column":2},"end":{"line":176,"column":null}},"96":{"start":{"line":173,"column":4},"end":{"line":173,"column":null}},"97":{"start":{"line":175,"column":4},"end":{"line":175,"column":null}},"98":{"start":{"line":178,"column":2},"end":{"line":178,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":13,"column":15},"end":{"line":13,"column":22}},"loc":{"start":{"line":13,"column":109},"end":{"line":34,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":33,"column":24},"end":{"line":33,"column":25}},"loc":{"start":{"line":33,"column":40},"end":{"line":33,"column":74}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":36,"column":23},"end":{"line":36,"column":30}},"loc":{"start":{"line":36,"column":76},"end":{"line":73,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":75,"column":22},"end":{"line":75,"column":29}},"loc":{"start":{"line":75,"column":62},"end":{"line":103,"column":1}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":105,"column":21},"end":{"line":105,"column":28}},"loc":{"start":{"line":105,"column":74},"end":{"line":164,"column":1}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":127,"column":24},"end":{"line":127,"column":31}},"loc":{"start":{"line":127,"column":35},"end":{"line":127,"column":73}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":166,"column":28},"end":{"line":166,"column":29}},"loc":{"start":{"line":166,"column":59},"end":{"line":179,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":19},"end":{"line":14,"column":102}},"type":"binary-expr","locations":[{"start":{"line":14,"column":19},"end":{"line":14,"column":45}},{"start":{"line":14,"column":49},"end":{"line":14,"column":74}},{"start":{"line":14,"column":78},"end":{"line":14,"column":102}}]},"1":{"loc":{"start":{"line":16,"column":2},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":2},"end":{"line":18,"column":null}}]},"2":{"loc":{"start":{"line":16,"column":6},"end":{"line":16,"column":44}},"type":"binary-expr","locations":[{"start":{"line":16,"column":6},"end":{"line":16,"column":14}},{"start":{"line":16,"column":18},"end":{"line":16,"column":30}},{"start":{"line":16,"column":34},"end":{"line":16,"column":44}}]},"3":{"loc":{"start":{"line":21,"column":2},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":23,"column":null}}]},"4":{"loc":{"start":{"line":21,"column":6},"end":{"line":21,"column":29}},"type":"binary-expr","locations":[{"start":{"line":21,"column":6},"end":{"line":21,"column":14}},{"start":{"line":21,"column":18},"end":{"line":21,"column":29}}]},"5":{"loc":{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":26,"column":null}}]},"6":{"loc":{"start":{"line":24,"column":6},"end":{"line":24,"column":30}},"type":"binary-expr","locations":[{"start":{"line":24,"column":6},"end":{"line":24,"column":14}},{"start":{"line":24,"column":18},"end":{"line":24,"column":30}}]},"7":{"loc":{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":29,"column":null}}]},"8":{"loc":{"start":{"line":27,"column":6},"end":{"line":27,"column":28}},"type":"binary-expr","locations":[{"start":{"line":27,"column":6},"end":{"line":27,"column":14}},{"start":{"line":27,"column":18},"end":{"line":27,"column":28}}]},"9":{"loc":{"start":{"line":37,"column":2},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":39,"column":null}}]},"10":{"loc":{"start":{"line":53,"column":4},"end":{"line":60,"column":null}},"type":"if","locations":[{"start":{"line":53,"column":4},"end":{"line":60,"column":null}},{"start":{"line":56,"column":11},"end":{"line":60,"column":null}}]},"11":{"loc":{"start":{"line":69,"column":4},"end":{"line":71,"column":null}},"type":"if","locations":[{"start":{"line":69,"column":4},"end":{"line":71,"column":null}}]},"12":{"loc":{"start":{"line":76,"column":2},"end":{"line":78,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":2},"end":{"line":78,"column":null}}]},"13":{"loc":{"start":{"line":99,"column":4},"end":{"line":101,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":101,"column":null}}]},"14":{"loc":{"start":{"line":106,"column":2},"end":{"line":108,"column":null}},"type":"if","locations":[{"start":{"line":106,"column":2},"end":{"line":108,"column":null}}]},"15":{"loc":{"start":{"line":124,"column":6},"end":{"line":126,"column":null}},"type":"if","locations":[{"start":{"line":124,"column":6},"end":{"line":126,"column":null}}]},"16":{"loc":{"start":{"line":134,"column":4},"end":{"line":153,"column":null}},"type":"if","locations":[{"start":{"line":134,"column":4},"end":{"line":153,"column":null}},{"start":{"line":140,"column":11},"end":{"line":153,"column":null}}]},"17":{"loc":{"start":{"line":136,"column":29},"end":{"line":138,"column":35}},"type":"cond-expr","locations":[{"start":{"line":137,"column":10},"end":{"line":137,"column":43}},{"start":{"line":138,"column":10},"end":{"line":138,"column":35}}]},"18":{"loc":{"start":{"line":140,"column":11},"end":{"line":153,"column":null}},"type":"if","locations":[{"start":{"line":140,"column":11},"end":{"line":153,"column":null}},{"start":{"line":143,"column":11},"end":{"line":153,"column":null}}]},"19":{"loc":{"start":{"line":143,"column":11},"end":{"line":153,"column":null}},"type":"if","locations":[{"start":{"line":143,"column":11},"end":{"line":153,"column":null}},{"start":{"line":146,"column":11},"end":{"line":153,"column":null}}]},"20":{"loc":{"start":{"line":146,"column":11},"end":{"line":153,"column":null}},"type":"if","locations":[{"start":{"line":146,"column":11},"end":{"line":153,"column":null}},{"start":{"line":150,"column":11},"end":{"line":153,"column":null}}]},"21":{"loc":{"start":{"line":158,"column":4},"end":{"line":160,"column":null}},"type":"if","locations":[{"start":{"line":158,"column":4},"end":{"line":160,"column":null}}]},"22":{"loc":{"start":{"line":172,"column":2},"end":{"line":176,"column":null}},"type":"if","locations":[{"start":{"line":172,"column":2},"end":{"line":176,"column":null}},{"start":{"line":174,"column":9},"end":{"line":176,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0,0,0],"1":[0],"2":[0,0,0],"3":[0],"4":[0,0],"5":[0],"6":[0,0],"7":[0],"8":[0,0],"9":[0],"10":[0,0],"11":[0],"12":[0],"13":[0],"14":[0],"15":[0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0],"22":[0,0]}} -,"/Users/zane/playground/cloudsite/src/lib/actions/lib/create-or-update-dns-records.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/lib/create-or-update-dns-records.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":33},"end":{"line":38,"column":1}},"3":{"start":{"line":5,"column":59},"end":{"line":5,"column":67}},"4":{"start":{"line":7,"column":27},"end":{"line":7,"column":72}},"5":{"start":{"line":8,"column":33},"end":{"line":8,"column":94}},"6":{"start":{"line":9,"column":31},"end":{"line":9,"column":82}},"7":{"start":{"line":10,"column":33},"end":{"line":10,"column":77}},"8":{"start":{"line":12,"column":24},"end":{"line":12,"column":66}},"9":{"start":{"line":14,"column":23},"end":{"line":14,"column":73}},"10":{"start":{"line":16,"column":18},"end":{"line":16,"column":51}},"11":{"start":{"line":18,"column":41},"end":{"line":35,"column":4}},"12":{"start":{"line":22,"column":39},"end":{"line":33,"column":7}},"13":{"start":{"line":36,"column":2},"end":{"line":36,"column":null}},"14":{"start":{"line":37,"column":2},"end":{"line":37,"column":null}},"15":{"start":{"line":38,"column":1},"end":{"line":38,"column":null}},"16":{"start":{"line":40,"column":24},"end":{"line":53,"column":1}},"17":{"start":{"line":41,"column":33},"end":{"line":41,"column":85}},"18":{"start":{"line":42,"column":34},"end":{"line":42,"column":82}},"19":{"start":{"line":44,"column":2},"end":{"line":48,"column":null}},"20":{"start":{"line":45,"column":4},"end":{"line":47,"column":null}},"21":{"start":{"line":46,"column":6},"end":{"line":46,"column":47}},"22":{"start":{"line":50,"column":2},"end":{"line":52,"column":null}},"23":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":33},"end":{"line":4,"column":40}},"loc":{"start":{"line":4,"column":70},"end":{"line":38,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":22,"column":29},"end":{"line":22,"column":33}},"loc":{"start":{"line":22,"column":39},"end":{"line":33,"column":7}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":40,"column":24},"end":{"line":40,"column":31}},"loc":{"start":{"line":40,"column":76},"end":{"line":53,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":45,"column":4},"end":{"line":47,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":4},"end":{"line":47,"column":null}}]},"1":{"loc":{"start":{"line":50,"column":2},"end":{"line":52,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":2},"end":{"line":52,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0]}} -,"/Users/zane/playground/cloudsite/src/lib/actions/lib/get-credentials.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/lib/get-credentials.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":23},"end":{"line":26,"column":1}},"2":{"start":{"line":4,"column":2},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":22},"end":{"line":23,"column":4}},"4":{"start":{"line":25,"column":2},"end":{"line":25,"column":null}},"5":{"start":{"line":26,"column":1},"end":{"line":26,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":23},"end":{"line":3,"column":24}},"loc":{"start":{"line":3,"column":43},"end":{"line":26,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":15},"end":{"line":4,"column":65}},"type":"binary-expr","locations":[{"start":{"line":4,"column":15},"end":{"line":4,"column":25}},{"start":{"line":4,"column":29},"end":{"line":4,"column":52}},{"start":{"line":4,"column":56},"end":{"line":4,"column":65}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"f":{"0":0},"b":{"0":[0,0,0]}} -,"/Users/zane/playground/cloudsite/src/lib/actions/lib/sync-site-content.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/lib/sync-site-content.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":45}},"6":{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},"7":{"start":{"line":9,"column":24},"end":{"line":32,"column":1}},"8":{"start":{"line":10,"column":49},"end":{"line":10,"column":57}},"9":{"start":{"line":12,"column":2},"end":{"line":20,"column":null}},"10":{"start":{"line":13,"column":24},"end":{"line":13,"column":56}},"11":{"start":{"line":14,"column":24},"end":{"line":14,"column":64}},"12":{"start":{"line":15,"column":4},"end":{"line":19,"column":null}},"13":{"start":{"line":16,"column":6},"end":{"line":16,"column":null}},"14":{"start":{"line":17,"column":6},"end":{"line":17,"column":null}},"15":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"16":{"start":{"line":22,"column":2},"end":{"line":22,"column":null}},"17":{"start":{"line":24,"column":19},"end":{"line":24,"column":48}},"18":{"start":{"line":25,"column":19},"end":{"line":25,"column":58}},"19":{"start":{"line":27,"column":2},"end":{"line":31,"column":null}},"20":{"start":{"line":28,"column":41},"end":{"line":28,"column":111}},"21":{"start":{"line":32,"column":1},"end":{"line":32,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},"loc":{"start":{"line":7,"column":45},"end":{"line":7,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":9,"column":24},"end":{"line":9,"column":31}},"loc":{"start":{"line":9,"column":70},"end":{"line":32,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":28,"column":30},"end":{"line":28,"column":35}},"loc":{"start":{"line":28,"column":41},"end":{"line":28,"column":111}}}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},"type":"if","locations":[{"start":{"line":7,"column":45},"end":{"line":7,"column":null}}]},"1":{"loc":{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},"type":"cond-expr","locations":[{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},{"start":{"line":7,"column":45},"end":{"line":7,"column":null}}]},"2":{"loc":{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},"type":"binary-expr","locations":[{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},{"start":{"line":7,"column":45},"end":{"line":7,"column":null}},{"start":{"line":7,"column":45},"end":{"line":7,"column":null}}]},"3":{"loc":{"start":{"line":12,"column":2},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":2},"end":{"line":20,"column":null}}]},"4":{"loc":{"start":{"line":12,"column":6},"end":{"line":12,"column":53}},"type":"binary-expr","locations":[{"start":{"line":12,"column":6},"end":{"line":12,"column":22}},{"start":{"line":12,"column":26},"end":{"line":12,"column":53}}]},"5":{"loc":{"start":{"line":15,"column":4},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":4},"end":{"line":19,"column":null}}]},"6":{"loc":{"start":{"line":28,"column":57},"end":{"line":28,"column":110}},"type":"binary-expr","locations":[{"start":{"line":28,"column":57},"end":{"line":28,"column":79}},{"start":{"line":28,"column":83},"end":{"line":28,"column":110}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0],"4":[0,0],"5":[0],"6":[0,0]}} -,"/Users/zane/playground/cloudsite/src/lib/actions/lib/track-stack-status.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/lib/track-stack-status.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":26},"end":{"line":3,"column":30}},"2":{"start":{"line":5,"column":25},"end":{"line":40,"column":1}},"3":{"start":{"line":7,"column":2},"end":{"line":26,"column":null}},"4":{"start":{"line":8,"column":26},"end":{"line":8,"column":51}},"5":{"start":{"line":9,"column":28},"end":{"line":9,"column":68}},"6":{"start":{"line":10,"column":29},"end":{"line":10,"column":77}},"7":{"start":{"line":12,"column":4},"end":{"line":12,"column":null}},"8":{"start":{"line":14,"column":4},"end":{"line":22,"column":null}},"9":{"start":{"line":15,"column":6},"end":{"line":15,"column":null}},"10":{"start":{"line":16,"column":11},"end":{"line":22,"column":null}},"11":{"start":{"line":17,"column":6},"end":{"line":17,"column":null}},"12":{"start":{"line":18,"column":11},"end":{"line":22,"column":null}},"13":{"start":{"line":19,"column":6},"end":{"line":19,"column":null}},"14":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"15":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"16":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"17":{"start":{"line":25,"column":33},"end":{"line":25,"column":71}},"18":{"start":{"line":28,"column":2},"end":{"line":37,"column":null}},"19":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"20":{"start":{"line":30,"column":24},"end":{"line":30,"column":49}},"21":{"start":{"line":31,"column":26},"end":{"line":31,"column":61}},"22":{"start":{"line":32,"column":4},"end":{"line":32,"column":null}},"23":{"start":{"line":34,"column":4},"end":{"line":34,"column":null}},"24":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"25":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"26":{"start":{"line":40,"column":1},"end":{"line":40,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":25},"end":{"line":5,"column":32}},"loc":{"start":{"line":5,"column":91},"end":{"line":40,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":25,"column":22},"end":{"line":25,"column":29}},"loc":{"start":{"line":25,"column":33},"end":{"line":25,"column":71}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":4},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":4},"end":{"line":22,"column":null}},{"start":{"line":16,"column":11},"end":{"line":22,"column":null}}]},"1":{"loc":{"start":{"line":14,"column":8},"end":{"line":14,"column":76}},"type":"binary-expr","locations":[{"start":{"line":14,"column":8},"end":{"line":14,"column":44}},{"start":{"line":14,"column":48},"end":{"line":14,"column":76}}]},"2":{"loc":{"start":{"line":16,"column":11},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":11},"end":{"line":22,"column":null}},{"start":{"line":18,"column":11},"end":{"line":22,"column":null}}]},"3":{"loc":{"start":{"line":16,"column":15},"end":{"line":16,"column":83}},"type":"binary-expr","locations":[{"start":{"line":16,"column":15},"end":{"line":16,"column":51}},{"start":{"line":16,"column":55},"end":{"line":16,"column":83}}]},"4":{"loc":{"start":{"line":18,"column":11},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":11},"end":{"line":22,"column":null}},{"start":{"line":20,"column":11},"end":{"line":22,"column":null}}]},"5":{"loc":{"start":{"line":18,"column":15},"end":{"line":18,"column":98}},"type":"binary-expr","locations":[{"start":{"line":18,"column":15},"end":{"line":18,"column":53}},{"start":{"line":18,"column":57},"end":{"line":18,"column":98}}]},"6":{"loc":{"start":{"line":28,"column":2},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":37,"column":null}},{"start":{"line":35,"column":9},"end":{"line":37,"column":null}}]},"7":{"loc":{"start":{"line":28,"column":6},"end":{"line":28,"column":71}},"type":"binary-expr","locations":[{"start":{"line":28,"column":6},"end":{"line":28,"column":41}},{"start":{"line":28,"column":45},"end":{"line":28,"column":71}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0]}} -,"/Users/zane/playground/cloudsite/src/lib/actions/lib/update-site-info.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/lib/update-site-info.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":23},"end":{"line":13,"column":1}},"2":{"start":{"line":4,"column":32},"end":{"line":4,"column":40}},"3":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":31},"end":{"line":6,"column":80}},"5":{"start":{"line":7,"column":26},"end":{"line":7,"column":78}},"6":{"start":{"line":8,"column":27},"end":{"line":8,"column":75}},"7":{"start":{"line":9,"column":35},"end":{"line":10,"column":102}},"8":{"start":{"line":10,"column":47},"end":{"line":10,"column":89}},"9":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"10":{"start":{"line":13,"column":1},"end":{"line":13,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":23},"end":{"line":3,"column":30}},"loc":{"start":{"line":3,"column":60},"end":{"line":13,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":28},"end":{"line":10,"column":29}},"loc":{"start":{"line":10,"column":47},"end":{"line":10,"column":89}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"f":{"0":0,"1":0},"b":{}} -,"/Users/zane/playground/cloudsite/src/lib/actions/lib/update-stack.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/actions/lib/update-stack.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":51}},"6":{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},"7":{"start":{"line":9,"column":20},"end":{"line":59,"column":1}},"8":{"start":{"line":10,"column":32},"end":{"line":10,"column":40}},"9":{"start":{"line":12,"column":23},"end":{"line":12,"column":66}},"10":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"11":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"12":{"start":{"line":16,"column":22},"end":{"line":16,"column":43}},"13":{"start":{"line":18,"column":31},"end":{"line":18,"column":80}},"14":{"start":{"line":19,"column":29},"end":{"line":22,"column":4}},"15":{"start":{"line":23,"column":30},"end":{"line":23,"column":81}},"16":{"start":{"line":24,"column":26},"end":{"line":24,"column":58}},"17":{"start":{"line":26,"column":2},"end":{"line":29,"column":null}},"18":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"19":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"20":{"start":{"line":32,"column":29},"end":{"line":38,"column":4}},"21":{"start":{"line":40,"column":2},"end":{"line":40,"column":null}},"22":{"start":{"line":42,"column":2},"end":{"line":42,"column":null}},"23":{"start":{"line":44,"column":2},"end":{"line":44,"column":50}},"24":{"start":{"line":46,"column":29},"end":{"line":49,"column":71}},"25":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"26":{"start":{"line":49,"column":39},"end":{"line":49,"column":70}},"27":{"start":{"line":51,"column":2},"end":{"line":56,"column":null}},"28":{"start":{"line":52,"column":4},"end":{"line":55,"column":null}},"29":{"start":{"line":54,"column":8},"end":{"line":54,"column":76}},"30":{"start":{"line":58,"column":2},"end":{"line":58,"column":null}},"31":{"start":{"line":59,"column":1},"end":{"line":59,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},"loc":{"start":{"line":7,"column":51},"end":{"line":7,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":9,"column":20},"end":{"line":9,"column":27}},"loc":{"start":{"line":9,"column":57},"end":{"line":59,"column":1}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":46,"column":77},"end":{"line":46,"column":86}},"loc":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}}},"3":{"name":"(anonymous_5)","decl":{"start":{"line":49,"column":12},"end":{"line":49,"column":13}},"loc":{"start":{"line":49,"column":39},"end":{"line":49,"column":70}}},"4":{"name":"(anonymous_6)","decl":{"start":{"line":53,"column":33},"end":{"line":53,"column":34}},"loc":{"start":{"line":54,"column":8},"end":{"line":54,"column":76}}}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},"type":"if","locations":[{"start":{"line":7,"column":51},"end":{"line":7,"column":null}}]},"1":{"loc":{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},"type":"cond-expr","locations":[{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},{"start":{"line":7,"column":51},"end":{"line":7,"column":null}}]},"2":{"loc":{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},"type":"binary-expr","locations":[{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},{"start":{"line":7,"column":51},"end":{"line":7,"column":null}},{"start":{"line":7,"column":51},"end":{"line":7,"column":null}}]},"3":{"loc":{"start":{"line":26,"column":2},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":2},"end":{"line":29,"column":null}}]},"4":{"loc":{"start":{"line":46,"column":41},"end":{"line":46,"column":70}},"type":"binary-expr","locations":[{"start":{"line":46,"column":41},"end":{"line":46,"column":64}},{"start":{"line":46,"column":68},"end":{"line":46,"column":70}}]},"5":{"loc":{"start":{"line":51,"column":2},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":51,"column":2},"end":{"line":56,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0],"4":[0,0],"5":[0]}} -,"/Users/zane/playground/cloudsite/src/lib/plugins/access-logs.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/access-logs.mjs","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":3,"column":1}},"1":{"start":{"line":2,"column":50},"end":{"line":2,"column":73}},"2":{"start":{"line":5,"column":16},"end":{"line":7,"column":1}},"3":{"start":{"line":6,"column":2},"end":{"line":6,"column":null}},"4":{"start":{"line":9,"column":16},"end":{"line":9,"column":38}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":44},"end":{"line":2,"column":45}},"loc":{"start":{"line":2,"column":50},"end":{"line":2,"column":73}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":5,"column":16},"end":{"line":5,"column":22}},"loc":{"start":{"line":5,"column":22},"end":{"line":7,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{"0":0,"1":0},"b":{}} -,"/Users/zane/playground/cloudsite/src/lib/plugins/cloudfront-logs.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/cloudfront-logs.mjs","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":5,"column":1}},"1":{"start":{"line":3,"column":60},"end":{"line":3,"column":83}},"2":{"start":{"line":7,"column":31},"end":{"line":9,"column":1}},"3":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"4":{"start":{"line":11,"column":20},"end":{"line":21,"column":1}},"5":{"start":{"line":12,"column":28},"end":{"line":12,"column":40}},"6":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"7":{"start":{"line":16,"column":2},"end":{"line":20,"column":null}},"8":{"start":{"line":23,"column":20},"end":{"line":23,"column":70}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":54},"end":{"line":3,"column":55}},"loc":{"start":{"line":3,"column":60},"end":{"line":3,"column":83}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":31},"end":{"line":7,"column":38}},"loc":{"start":{"line":7,"column":59},"end":{"line":9,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":11,"column":20},"end":{"line":11,"column":27}},"loc":{"start":{"line":11,"column":58},"end":{"line":21,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"f":{"0":0,"1":0,"2":0},"b":{}} -,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/constants.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/constants.mjs","statementMap":{"0":{"start":{"line":1,"column":37},"end":{"line":1,"column":68}},"1":{"start":{"line":2,"column":37},"end":{"line":2,"column":68}},"2":{"start":{"line":3,"column":36},"end":{"line":3,"column":66}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0},"f":{},"b":{}} -,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"3":{"start":{"line":7,"column":36},"end":{"line":32,"column":1}},"4":{"start":{"line":8,"column":23},"end":{"line":8,"column":35}},"5":{"start":{"line":9,"column":21},"end":{"line":9,"column":29}},"6":{"start":{"line":10,"column":20},"end":{"line":10,"column":28}},"7":{"start":{"line":12,"column":23},"end":{"line":12,"column":64}},"8":{"start":{"line":13,"column":2},"end":{"line":31,"column":null}},"9":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"10":{"start":{"line":15,"column":31},"end":{"line":15,"column":85}},"11":{"start":{"line":16,"column":4},"end":{"line":26,"column":null}},"12":{"start":{"line":17,"column":6},"end":{"line":17,"column":null}},"13":{"start":{"line":19,"column":6},"end":{"line":25,"column":null}},"14":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"15":{"start":{"line":21,"column":8},"end":{"line":21,"column":null}},"16":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"17":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"18":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"19":{"start":{"line":28,"column":21},"end":{"line":28,"column":41}},"20":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"21":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"22":{"start":{"line":32,"column":1},"end":{"line":32,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":36},"end":{"line":7,"column":43}},"loc":{"start":{"line":7,"column":87},"end":{"line":32,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":4},"end":{"line":14,"column":89}},"type":"binary-expr","locations":[{"start":{"line":14,"column":4},"end":{"line":14,"column":20}},{"start":{"line":14,"column":4},"end":{"line":14,"column":20}},{"start":{"line":14,"column":4},"end":{"line":14,"column":89}}]},"1":{"loc":{"start":{"line":19,"column":6},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":6},"end":{"line":25,"column":null}},{"start":{"line":22,"column":13},"end":{"line":25,"column":null}}]},"2":{"loc":{"start":{"line":19,"column":10},"end":{"line":19,"column":70}},"type":"binary-expr","locations":[{"start":{"line":19,"column":10},"end":{"line":19,"column":31}},{"start":{"line":19,"column":35},"end":{"line":19,"column":70}}]},"3":{"loc":{"start":{"line":19,"column":35},"end":{"line":19,"column":62}},"type":"cond-expr","locations":[{"start":{"line":19,"column":46},"end":{"line":19,"column":48}},{"start":{"line":19,"column":35},"end":{"line":19,"column":62}}]},"4":{"loc":{"start":{"line":19,"column":35},"end":{"line":19,"column":48}},"type":"binary-expr","locations":[{"start":{"line":19,"column":35},"end":{"line":19,"column":48}},{"start":{"line":19,"column":46},"end":{"line":19,"column":48}}]},"5":{"loc":{"start":{"line":20,"column":8},"end":{"line":20,"column":39}},"type":"binary-expr","locations":[{"start":{"line":20,"column":8},"end":{"line":20,"column":24}},{"start":{"line":20,"column":8},"end":{"line":20,"column":24}},{"start":{"line":20,"column":8},"end":{"line":20,"column":39}}]},"6":{"loc":{"start":{"line":23,"column":8},"end":{"line":23,"column":35}},"type":"binary-expr","locations":[{"start":{"line":23,"column":8},"end":{"line":23,"column":24}},{"start":{"line":23,"column":8},"end":{"line":23,"column":24}},{"start":{"line":23,"column":8},"end":{"line":23,"column":35}}]},"7":{"loc":{"start":{"line":27,"column":4},"end":{"line":27,"column":39}},"type":"binary-expr","locations":[{"start":{"line":27,"column":4},"end":{"line":27,"column":20}},{"start":{"line":27,"column":4},"end":{"line":27,"column":20}},{"start":{"line":27,"column":4},"end":{"line":27,"column":39}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0},"f":{"0":0},"b":{"0":[0,0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0,0],"6":[0,0,0],"7":[0,0,0]}} -,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-contact-emailer.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-contact-emailer.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":28},"end":{"line":116,"column":1}},"3":{"start":{"line":5,"column":28},"end":{"line":5,"column":40}},"4":{"start":{"line":6,"column":34},"end":{"line":6,"column":52}},"5":{"start":{"line":7,"column":36},"end":{"line":7,"column":52}},"6":{"start":{"line":9,"column":2},"end":{"line":11,"column":null}},"7":{"start":{"line":10,"column":4},"end":{"line":10,"column":null}},"8":{"start":{"line":14,"column":2},"end":{"line":16,"column":null}},"9":{"start":{"line":18,"column":30},"end":{"line":22,"column":4}},"10":{"start":{"line":23,"column":38},"end":{"line":23,"column":57}},"11":{"start":{"line":25,"column":2},"end":{"line":32,"column":null}},"12":{"start":{"line":34,"column":2},"end":{"line":72,"column":null}},"13":{"start":{"line":74,"column":2},"end":{"line":100,"column":null}},"14":{"start":{"line":102,"column":2},"end":{"line":110,"column":null}},"15":{"start":{"line":112,"column":2},"end":{"line":115,"column":null}},"16":{"start":{"line":113,"column":4},"end":{"line":114,"column":null}},"17":{"start":{"line":116,"column":1},"end":{"line":116,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":28},"end":{"line":4,"column":35}},"loc":{"start":{"line":4,"column":106},"end":{"line":116,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":null}}]},"1":{"loc":{"start":{"line":9,"column":6},"end":{"line":9,"column":86}},"type":"binary-expr","locations":[{"start":{"line":9,"column":6},"end":{"line":9,"column":43}},{"start":{"line":9,"column":47},"end":{"line":9,"column":86}}]},"2":{"loc":{"start":{"line":112,"column":2},"end":{"line":115,"column":null}},"type":"if","locations":[{"start":{"line":112,"column":2},"end":{"line":115,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"f":{"0":0},"b":{"0":[0],"1":[0,0],"2":[0]}} -,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-contact-form-table.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-contact-form-table.mjs","statementMap":{"0":{"start":{"line":1,"column":30},"end":{"line":23,"column":1}},"1":{"start":{"line":2,"column":43},"end":{"line":2,"column":55}},"2":{"start":{"line":3,"column":25},"end":{"line":3,"column":33}},"3":{"start":{"line":5,"column":2},"end":{"line":19,"column":null}},"4":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}},"5":{"start":{"line":22,"column":2},"end":{"line":22,"column":null}},"6":{"start":{"line":23,"column":1},"end":{"line":23,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":30},"end":{"line":1,"column":31}},"loc":{"start":{"line":1,"column":62},"end":{"line":23,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"f":{"0":0},"b":{}} -,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-contact-handler.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-contact-handler.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":28},"end":{"line":121,"column":1}},"3":{"start":{"line":5,"column":36},"end":{"line":5,"column":44}},"4":{"start":{"line":6,"column":43},"end":{"line":6,"column":55}},"5":{"start":{"line":8,"column":37},"end":{"line":12,"column":4}},"6":{"start":{"line":14,"column":37},"end":{"line":14,"column":63}},"7":{"start":{"line":15,"column":35},"end":{"line":15,"column":61}},"8":{"start":{"line":17,"column":2},"end":{"line":49,"column":null}},"9":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}},"10":{"start":{"line":51,"column":2},"end":{"line":51,"column":null}},"11":{"start":{"line":53,"column":2},"end":{"line":60,"column":null}},"12":{"start":{"line":62,"column":2},"end":{"line":87,"column":null}},"13":{"start":{"line":88,"column":2},"end":{"line":88,"column":null}},"14":{"start":{"line":89,"column":2},"end":{"line":89,"column":null}},"15":{"start":{"line":91,"column":2},"end":{"line":103,"column":null}},"16":{"start":{"line":105,"column":2},"end":{"line":118,"column":null}},"17":{"start":{"line":119,"column":2},"end":{"line":119,"column":null}},"18":{"start":{"line":120,"column":2},"end":{"line":120,"column":null}},"19":{"start":{"line":121,"column":1},"end":{"line":121,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":28},"end":{"line":4,"column":35}},"loc":{"start":{"line":4,"column":106},"end":{"line":121,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},"f":{"0":0},"b":{}} -,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-request-signer.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/setup-request-signer.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":27},"end":{"line":87,"column":1}},"3":{"start":{"line":5,"column":28},"end":{"line":5,"column":40}},"4":{"start":{"line":7,"column":2},"end":{"line":40,"column":null}},"5":{"start":{"line":42,"column":34},"end":{"line":46,"column":4}},"6":{"start":{"line":48,"column":2},"end":{"line":55,"column":null}},"7":{"start":{"line":57,"column":2},"end":{"line":78,"column":null}},"8":{"start":{"line":80,"column":2},"end":{"line":86,"column":null}},"9":{"start":{"line":87,"column":1},"end":{"line":87,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":27},"end":{"line":4,"column":34}},"loc":{"start":{"line":4,"column":95},"end":{"line":87,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"f":{"0":0},"b":{}} -,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":20,"column":36},"end":{"line":63,"column":1}},"7":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}},"8":{"start":{"line":23,"column":34},"end":{"line":23,"column":42}},"9":{"start":{"line":24,"column":33},"end":{"line":24,"column":41}},"10":{"start":{"line":26,"column":19},"end":{"line":26,"column":56}},"11":{"start":{"line":28,"column":2},"end":{"line":44,"column":null}},"12":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"13":{"start":{"line":30,"column":4},"end":{"line":37,"column":null}},"14":{"start":{"line":39,"column":32},"end":{"line":42,"column":6}},"15":{"start":{"line":43,"column":4},"end":{"line":43,"column":null}},"16":{"start":{"line":45,"column":2},"end":{"line":45,"column":null}},"17":{"start":{"line":47,"column":22},"end":{"line":49,"column":null}},"18":{"start":{"line":52,"column":2},"end":{"line":58,"column":null}},"19":{"start":{"line":53,"column":4},"end":{"line":57,"column":null}},"20":{"start":{"line":60,"column":2},"end":{"line":60,"column":null}},"21":{"start":{"line":62,"column":2},"end":{"line":62,"column":null}},"22":{"start":{"line":63,"column":1},"end":{"line":63,"column":null}},"23":{"start":{"line":65,"column":19},"end":{"line":78,"column":1}},"24":{"start":{"line":67,"column":18},"end":{"line":67,"column":47}},"25":{"start":{"line":68,"column":21},"end":{"line":68,"column":46}},"26":{"start":{"line":70,"column":27},"end":{"line":75,"column":4}},"27":{"start":{"line":77,"column":2},"end":{"line":77,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":20,"column":36},"end":{"line":20,"column":43}},"loc":{"start":{"line":20,"column":96},"end":{"line":63,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":65,"column":19},"end":{"line":65,"column":26}},"loc":{"start":{"line":65,"column":65},"end":{"line":78,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":2},"end":{"line":44,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":44,"column":null}}]},"1":{"loc":{"start":{"line":52,"column":2},"end":{"line":58,"column":null}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":58,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0},"f":{"0":0,"1":0},"b":{"0":[0],"1":[0]}} -,"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs","statementMap":{"0":{"start":{"line":1,"column":37},"end":{"line":42,"column":1}},"1":{"start":{"line":2,"column":28},"end":{"line":2,"column":40}},"2":{"start":{"line":3,"column":29},"end":{"line":3,"column":42}},"3":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":20},"end":{"line":7,"column":108}},"5":{"start":{"line":8,"column":2},"end":{"line":17,"column":null}},"6":{"start":{"line":19,"column":27},"end":{"line":19,"column":128}},"7":{"start":{"line":20,"column":2},"end":{"line":38,"column":null}},"8":{"start":{"line":40,"column":2},"end":{"line":40,"column":null}},"9":{"start":{"line":41,"column":2},"end":{"line":41,"column":null}},"10":{"start":{"line":42,"column":1},"end":{"line":42,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":37},"end":{"line":1,"column":38}},"loc":{"start":{"line":1,"column":69},"end":{"line":42,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":27},"end":{"line":19,"column":128}},"type":"binary-expr","locations":[{"start":{"line":19,"column":27},"end":{"line":19,"column":122}},{"start":{"line":19,"column":126},"end":{"line":19,"column":128}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"f":{"0":0},"b":{"0":[0,0]}} -,"/Users/zane/playground/cloudsite/src/lib/shared/convert-domain-to-bucket-name.js": {"path":"/Users/zane/playground/cloudsite/src/lib/shared/convert-domain-to-bucket-name.js","statementMap":{"0":{"start":{"line":1,"column":35},"end":{"line":1,"column":106}},"1":{"start":{"line":1,"column":46},"end":{"line":1,"column":106}},"2":{"start":{"line":1,"column":106},"end":{"line":1,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":35},"end":{"line":1,"column":41}},"loc":{"start":{"line":1,"column":46},"end":{"line":1,"column":106}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0},"f":{"0":0},"b":{}} -,"/Users/zane/playground/cloudsite/src/lib/shared/determine-bucket-name.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/shared/determine-bucket-name.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":9,"column":28},"end":{"line":52,"column":1}},"6":{"start":{"line":10,"column":66},"end":{"line":10,"column":70}},"7":{"start":{"line":11,"column":33},"end":{"line":11,"column":37}},"8":{"start":{"line":13,"column":2},"end":{"line":15,"column":null}},"9":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"10":{"start":{"line":17,"column":22},"end":{"line":17,"column":30}},"11":{"start":{"line":18,"column":2},"end":{"line":23,"column":null}},"12":{"start":{"line":19,"column":4},"end":{"line":19,"column":null}},"13":{"start":{"line":20,"column":21},"end":{"line":20,"column":96}},"14":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"15":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"16":{"start":{"line":25,"column":2},"end":{"line":25,"column":null}},"17":{"start":{"line":27,"column":2},"end":{"line":51,"column":null}},"18":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"19":{"start":{"line":30,"column":18},"end":{"line":30,"column":74}},"20":{"start":{"line":32,"column":20},"end":{"line":32,"column":48}},"21":{"start":{"line":33,"column":4},"end":{"line":46,"column":null}},"22":{"start":{"line":34,"column":6},"end":{"line":34,"column":null}},"23":{"start":{"line":35,"column":6},"end":{"line":37,"column":null}},"24":{"start":{"line":36,"column":8},"end":{"line":36,"column":null}},"25":{"start":{"line":39,"column":6},"end":{"line":45,"column":null}},"26":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"27":{"start":{"line":41,"column":8},"end":{"line":41,"column":null}},"28":{"start":{"line":42,"column":13},"end":{"line":45,"column":null}},"29":{"start":{"line":43,"column":8},"end":{"line":43,"column":null}},"30":{"start":{"line":44,"column":8},"end":{"line":44,"column":null}},"31":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"32":{"start":{"line":48,"column":23},"end":{"line":48,"column":43}},"33":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"34":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"35":{"start":{"line":52,"column":1},"end":{"line":52,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":9,"column":28},"end":{"line":9,"column":35}},"loc":{"start":{"line":9,"column":44},"end":{"line":52,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":35},"end":{"line":10,"column":51}},"type":"default-arg","locations":[{"start":{"line":10,"column":46},"end":{"line":10,"column":51}}]},"1":{"loc":{"start":{"line":13,"column":2},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":13,"column":2},"end":{"line":15,"column":null}}]},"2":{"loc":{"start":{"line":14,"column":17},"end":{"line":14,"column":77}},"type":"binary-expr","locations":[{"start":{"line":14,"column":17},"end":{"line":14,"column":36}},{"start":{"line":14,"column":40},"end":{"line":14,"column":77}}]},"3":{"loc":{"start":{"line":18,"column":2},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":2},"end":{"line":23,"column":null}}]},"4":{"loc":{"start":{"line":25,"column":13},"end":{"line":25,"column":54}},"type":"binary-expr","locations":[{"start":{"line":25,"column":13},"end":{"line":25,"column":21}},{"start":{"line":25,"column":25},"end":{"line":25,"column":54}}]},"5":{"loc":{"start":{"line":35,"column":6},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":6},"end":{"line":37,"column":null}}]},"6":{"loc":{"start":{"line":39,"column":6},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":6},"end":{"line":45,"column":null}},{"start":{"line":42,"column":13},"end":{"line":45,"column":null}}]},"7":{"loc":{"start":{"line":42,"column":13},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":13},"end":{"line":45,"column":null}}]},"8":{"loc":{"start":{"line":42,"column":17},"end":{"line":42,"column":75}},"type":"binary-expr","locations":[{"start":{"line":42,"column":17},"end":{"line":42,"column":34}},{"start":{"line":42,"column":38},"end":{"line":42,"column":75}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0},"f":{"0":0},"b":{"0":[0],"1":[0],"2":[0,0],"3":[0],"4":[0,0],"5":[0],"6":[0,0],"7":[0],"8":[0,0]}} -,"/Users/zane/playground/cloudsite/src/lib/shared/determine-oac-name.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/shared/determine-oac-name.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"3":{"start":{"line":7,"column":25},"end":{"line":27,"column":1}},"4":{"start":{"line":8,"column":21},"end":{"line":8,"column":29}},"5":{"start":{"line":9,"column":20},"end":{"line":9,"column":28}},"6":{"start":{"line":13,"column":22},"end":{"line":13,"column":67}},"7":{"start":{"line":15,"column":2},"end":{"line":26,"column":null}},"8":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"9":{"start":{"line":17,"column":4},"end":{"line":25,"column":null}},"10":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"11":{"start":{"line":19,"column":23},"end":{"line":19,"column":43}},"12":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"13":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"14":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"15":{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},"16":{"start":{"line":27,"column":1},"end":{"line":27,"column":null}},"17":{"start":{"line":29,"column":23},"end":{"line":48,"column":1}},"18":{"start":{"line":30,"column":27},"end":{"line":30,"column":72}},"19":{"start":{"line":32,"column":17},"end":{"line":32,"column":19}},"20":{"start":{"line":33,"column":2},"end":{"line":47,"column":null}},"21":{"start":{"line":34,"column":27},"end":{"line":36,"column":6}},"22":{"start":{"line":38,"column":28},"end":{"line":38,"column":71}},"23":{"start":{"line":39,"column":18},"end":{"line":39,"column":63}},"24":{"start":{"line":41,"column":4},"end":{"line":41,"column":null}},"25":{"start":{"line":41,"column":50},"end":{"line":41,"column":54}},"26":{"start":{"line":43,"column":4},"end":{"line":43,"column":null}},"27":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"28":{"start":{"line":45,"column":6},"end":{"line":45,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":25},"end":{"line":7,"column":32}},"loc":{"start":{"line":7,"column":72},"end":{"line":27,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":29,"column":23},"end":{"line":29,"column":30}},"loc":{"start":{"line":29,"column":58},"end":{"line":48,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":41,"column":29},"end":{"line":41,"column":30}},"loc":{"start":{"line":41,"column":50},"end":{"line":41,"column":54}}}},"branchMap":{"0":{"loc":{"start":{"line":16,"column":4},"end":{"line":16,"column":78}},"type":"binary-expr","locations":[{"start":{"line":16,"column":4},"end":{"line":16,"column":20}},{"start":{"line":16,"column":4},"end":{"line":16,"column":20}},{"start":{"line":16,"column":4},"end":{"line":16,"column":78}}]},"1":{"loc":{"start":{"line":17,"column":4},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":25,"column":null}},{"start":{"line":22,"column":11},"end":{"line":25,"column":null}}]},"2":{"loc":{"start":{"line":18,"column":6},"end":{"line":18,"column":41}},"type":"binary-expr","locations":[{"start":{"line":18,"column":6},"end":{"line":18,"column":22}},{"start":{"line":18,"column":6},"end":{"line":18,"column":22}},{"start":{"line":18,"column":6},"end":{"line":18,"column":41}}]},"3":{"loc":{"start":{"line":23,"column":6},"end":{"line":23,"column":37}},"type":"binary-expr","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":22}},{"start":{"line":23,"column":6},"end":{"line":23,"column":22}},{"start":{"line":23,"column":6},"end":{"line":23,"column":37}}]},"4":{"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":46,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0,0],"1":[0,0],"2":[0,0,0],"3":[0,0,0],"4":[0]}} -,"/Users/zane/playground/cloudsite/src/lib/shared/progress-logger.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/shared/progress-logger.mjs","statementMap":{"0":{"start":{"line":1,"column":20},"end":{"line":1,"column":37}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{}} -,"/Users/zane/playground/cloudsite/src/lib/shared/site-template.mjs": {"path":"/Users/zane/playground/cloudsite/src/lib/shared/site-template.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":50}},"6":{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},"7":{"start":{"line":14,"column":21},"end":{"line":237,"column":1}},"8":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"9":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"10":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"11":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"12":{"start":{"line":44,"column":74},"end":{"line":44,"column":87}},"13":{"start":{"line":46,"column":20},"end":{"line":50,"column":6}},"14":{"start":{"line":52,"column":4},"end":{"line":150,"column":null}},"15":{"start":{"line":154,"column":25},"end":{"line":154,"column":29}},"16":{"start":{"line":155,"column":36},"end":{"line":155,"column":44}},"17":{"start":{"line":157,"column":4},"end":{"line":157,"column":null}},"18":{"start":{"line":158,"column":21},"end":{"line":158,"column":69}},"19":{"start":{"line":159,"column":32},"end":{"line":159,"column":89}},"20":{"start":{"line":160,"column":4},"end":{"line":160,"column":null}},"21":{"start":{"line":161,"column":4},"end":{"line":161,"column":null}},"22":{"start":{"line":165,"column":27},"end":{"line":165,"column":40}},"23":{"start":{"line":166,"column":64},"end":{"line":166,"column":77}},"24":{"start":{"line":168,"column":4},"end":{"line":175,"column":null}},"25":{"start":{"line":169,"column":6},"end":{"line":174,"column":null}},"26":{"start":{"line":176,"column":4},"end":{"line":176,"column":null}},"27":{"start":{"line":178,"column":4},"end":{"line":187,"column":null}},"28":{"start":{"line":189,"column":4},"end":{"line":189,"column":null}},"29":{"start":{"line":193,"column":25},"end":{"line":193,"column":29}},"30":{"start":{"line":194,"column":43},"end":{"line":194,"column":51}},"31":{"start":{"line":196,"column":4},"end":{"line":206,"column":null}},"32":{"start":{"line":197,"column":21},"end":{"line":197,"column":39}},"33":{"start":{"line":198,"column":6},"end":{"line":200,"column":null}},"34":{"start":{"line":199,"column":8},"end":{"line":199,"column":null}},"35":{"start":{"line":202,"column":41},"end":{"line":202,"column":47}},"36":{"start":{"line":203,"column":6},"end":{"line":205,"column":null}},"37":{"start":{"line":204,"column":8},"end":{"line":204,"column":null}},"38":{"start":{"line":210,"column":25},"end":{"line":210,"column":29}},"39":{"start":{"line":211,"column":43},"end":{"line":211,"column":51}},"40":{"start":{"line":213,"column":4},"end":{"line":220,"column":null}},"41":{"start":{"line":214,"column":21},"end":{"line":214,"column":39}},"42":{"start":{"line":215,"column":6},"end":{"line":217,"column":null}},"43":{"start":{"line":216,"column":8},"end":{"line":216,"column":null}},"44":{"start":{"line":219,"column":6},"end":{"line":219,"column":null}},"45":{"start":{"line":224,"column":27},"end":{"line":224,"column":40}},"46":{"start":{"line":225,"column":26},"end":{"line":225,"column":64}},"47":{"start":{"line":227,"column":27},"end":{"line":232,"column":5}},"48":{"start":{"line":234,"column":19},"end":{"line":234,"column":63}},"49":{"start":{"line":235,"column":4},"end":{"line":235,"column":null}},"50":{"start":{"line":237,"column":1},"end":{"line":237,"column":null}}},"fnMap":{"0":{"name":"_getRequireWildcardCache","decl":{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},"loc":{"start":{"line":8,"column":50},"end":{"line":8,"column":null}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":35,"column":2},"end":{"line":35,"column":13}},"loc":{"start":{"line":35,"column":42},"end":{"line":41,"column":null}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":43,"column":2},"end":{"line":43,"column":8}},"loc":{"start":{"line":43,"column":30},"end":{"line":151,"column":null}}},"3":{"name":"(anonymous_5)","decl":{"start":{"line":153,"column":2},"end":{"line":153,"column":8}},"loc":{"start":{"line":153,"column":38},"end":{"line":162,"column":null}}},"4":{"name":"(anonymous_6)","decl":{"start":{"line":164,"column":2},"end":{"line":164,"column":8}},"loc":{"start":{"line":164,"column":37},"end":{"line":190,"column":null}}},"5":{"name":"(anonymous_7)","decl":{"start":{"line":192,"column":2},"end":{"line":192,"column":8}},"loc":{"start":{"line":192,"column":26},"end":{"line":207,"column":null}}},"6":{"name":"(anonymous_8)","decl":{"start":{"line":209,"column":2},"end":{"line":209,"column":8}},"loc":{"start":{"line":209,"column":23},"end":{"line":221,"column":null}}},"7":{"name":"(anonymous_9)","decl":{"start":{"line":223,"column":2},"end":{"line":223,"column":8}},"loc":{"start":{"line":223,"column":12},"end":{"line":236,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":50},"end":{"line":8,"column":null}}]},"1":{"loc":{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},"type":"cond-expr","locations":[{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},{"start":{"line":8,"column":50},"end":{"line":8,"column":null}}]},"2":{"loc":{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},"type":"binary-expr","locations":[{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},{"start":{"line":8,"column":50},"end":{"line":8,"column":null}},{"start":{"line":8,"column":50},"end":{"line":8,"column":null}}]},"3":{"loc":{"start":{"line":166,"column":10},"end":{"line":166,"column":60}},"type":"default-arg","locations":[{"start":{"line":166,"column":32},"end":{"line":166,"column":60}}]},"4":{"loc":{"start":{"line":168,"column":4},"end":{"line":175,"column":null}},"type":"if","locations":[{"start":{"line":168,"column":4},"end":{"line":175,"column":null}}]},"5":{"loc":{"start":{"line":198,"column":6},"end":{"line":200,"column":null}},"type":"if","locations":[{"start":{"line":198,"column":6},"end":{"line":200,"column":null}}]},"6":{"loc":{"start":{"line":203,"column":6},"end":{"line":205,"column":null}},"type":"if","locations":[{"start":{"line":203,"column":6},"end":{"line":205,"column":null}}]},"7":{"loc":{"start":{"line":215,"column":6},"end":{"line":217,"column":null}},"type":"if","locations":[{"start":{"line":215,"column":6},"end":{"line":217,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0],"1":[0,0],"2":[0,0,0],"3":[0],"4":[0],"5":[0],"6":[0],"7":[0]}} -} diff --git a/qa/coverage/favicon.png b/qa/coverage/favicon.png deleted file mode 100644 index c1525b811a167671e9de1fa78aab9f5c0b61cef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- 1.47% - Statements - 15/1018 -
- - -
- 3.2% - Branches - 12/375 -
- - -
- 2.97% - Functions - 3/101 -
- - -
- 1.33% - Lines - 13/975 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
cli -
-
8.53%7/8217.64%6/3425%1/48.45%6/71
cli/lib -
-
0%0/2960%0/1320%0/320%0/278
cli/lib/configuration -
-
32%8/2550%6/1240%2/531.81%7/22
lib/actions -
-
0%0/2390%0/900%0/180%0/235
lib/actions/lib -
-
0%0/1220%0/430%0/160%0/119
lib/plugins -
-
0%0/14100%0/00%0/50%0/14
lib/plugins/contact-handler/lib -
-
0%0/1200%0/280%0/80%0/120
lib/shared -
-
0%0/1200%0/360%0/130%0/116
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/actions/create.mjs.html b/qa/coverage/lib/actions/create.mjs.html deleted file mode 100644 index 4dc0edfd..00000000 --- a/qa/coverage/lib/actions/create.mjs.html +++ /dev/null @@ -1,559 +0,0 @@ - - - - - - Code coverage report for lib/actions/create.mjs - - - - - - - - - -
-
-

All files / lib/actions create.mjs

-
- -
- 0% - Statements - 0/78 -
- - -
- 0% - Branches - 0/16 -
- - -
- 0% - Functions - 0/8 -
- - -
- 0% - Lines - 0/77 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { ACMClient, ListCertificatesCommand, RequestCertificateCommand } from '@aws-sdk/client-acm'
-import { CloudFormationClient, CreateStackCommand } from '@aws-sdk/client-cloudformation'
- 
-import { convertDomainToBucketName } from '../shared/convert-domain-to-bucket-name'
-import { createOrUpdateDNSRecords } from './lib/create-or-update-dns-records'
-import { determineBucketName } from '../shared/determine-bucket-name'
-import { errorOut } from '../../cli/lib/error-out'
-import { getCredentials } from './lib/get-credentials'
-import * as plugins from '../plugins'
-import { SiteTemplate } from '../shared/site-template'
-import { syncSiteContent } from './lib/sync-site-content'
-import { trackStackStatus } from './lib/track-stack-status'
-import { updateSiteInfo } from './lib/update-site-info'I
- 
-const STACK_CREATE_TIMEOUT = 30 // min
- 
-const create = async ({
-  noBuild,
-  noDeleteOnFailure,
-  siteInfo,
-  ...downstreamOptions
-}) => {
-  const { apexDomain } = siteInfo
-  let { bucketName } = siteInfo
- 
-  const credentials = getCredentials(downstreamOptions)
- 
-  const acmClient = new ACMClient({
-    credentials,
-    region : 'us-east-1' // N. Virginia; required for certificate request
-  })
- 
-  let { certificateArn, status } = await findCertificate({ acmClient, apexDomain })
-  Iif (certificateArn === null) {
-    process.stdout.write(`Creating wildcard certificate for '${apexDomain}'...`)
-    certificateArn = await createCertificate({ acmClient, apexDomain })
-    status = 'PENDING_VALIDATION'
-  }
-  siteInfo.certificateArn = certificateArn
- 
-  Iif (status === 'PENDING_VALIDATION') {
-    const accountLocalCertID = certificateArn.replace(/[^/]+\/(.+)/, '$1')
-    const certificateConsoleURL =
-      `https://us-east-1.console.aws.amazon.com/acm/home?region=us-east-1#/certificates/${accountLocalCertID}`
-    throw new Error(`Wildcard certificate for '${apexDomain}' found, but requires validation. Please validate the certificate. To validate on S3 when using Route 53 for DNS service, try navigating to the folliwng URL and select 'Create records in Route 53'::\n\n${certificateConsoleURL}\n\nSubsequent validation may take up to 30 minutes. For further documentation:\n\nhttps://docs.aws.amazon.com/acm/latest/userguide/dns-validation.html`)
-  }
- 
-  bucketName = await determineBucketName({ apexDomain, bucketName, credentials, findName : true, siteInfo })
-  siteInfo.bucketName = bucketName
-  const stackCreated = await createSiteStack({ credentials, noDeleteOnFailure, siteInfo })
- 
-  if (stackCreated === true) {
-    const postUpdateHandlers = Object.keys(siteInfo.pluginSettings || {}).map((pluginKey) =>
-      [pluginKey, plugins[pluginKey].postUpdateHandler]
-    )
-      .filter(([, postUpdateHandler]) => postUpdateHandler !== undefined)
- 
-    await updateSiteInfo({ credentials, siteInfo }) // needed by createOrUpdateDNSRecords
-    await Promise.all([
-      syncSiteContent({ credentials, noBuild, siteInfo }),
-      createOrUpdateDNSRecords({ credentials, siteInfo }),
-      ...(postUpdateHandlers.map(([pluginKey, handler]) =>
-        handler({ settings : siteInfo.pluginSettings[pluginKey], siteInfo })))
-    ])
- 
-    process.stdout.write('Stack created.\n')
-  } else {
-    errorOut('Stack creation error.\n')
-  }
-}
- 
-const findCertificate = async ({ apexDomain, acmClient, nextToken }) => {
-  process.stdout.write('Searching for existing certificate...\n')
-  const listCertificateInput = { CertificateStatuses : ['PENDING_VALIDATION', 'ISSUED'] }
-  const listCertificatesCommand = new ListCertificatesCommand(listCertificateInput)
-  const listResponse = await acmClient.send(listCertificatesCommand)
- 
-  const domain = '*.' + apexDomain
-  for (const { CertificateArn, DomainName, Status } of listResponse.CertificateSummaryList) {
-    Iif (DomainName === domain) {
-      return { certificateArn : CertificateArn, status : Status }
-    }
-  }
-  nextToken = listResponse.NextToken
-  Iif (nextToken !== undefined) {
-    return await findCertificate({ apexDomain, acmClient, nextToken })
-  }
-  // else
-  return { certificateArn : null, status : null }
-}
- 
-const createCertificate = async ({ acmClient, apexDomain }) => {
-  process.stdout.write(`Creating wildcard certificate for '${apexDomain}'...`)
-  const input = { // RequestCertificateRequest
-    DomainName              : '*.' + apexDomain, // TODO: support more narrow cert?
-    ValidationMethod        : 'DNS', // TODO: support email
-    SubjectAlternativeNames : [
-      apexDomain, 'www.' + apexDomain
-    ], /*
-    // IdempotencyToken: "STRING_VALUE", TODO: should we use this?
-    /* DomainValidationOptions: [ // DomainValidationOptionList : TODO: is this only used for email verification?
-      { // DomainValidationOption
-        DomainName: "STRING_VALUE", // required
-        ValidationDomain: "STRING_VALUE", // required
-      },
-    ], */
-    Options : { // CertificateOptions
-      CertificateTransparencyLoggingPreference : 'ENABLED'
-    },
-    // CertificateAuthorityArn: "STRING_VALUE", TODO: only used for private certs, I think
-    /* Tags: [ // TagList : TODO: support tags? tag with the website
-      { // Tag
-        Key: "STRING_VALUE", // required
-        Value: "STRING_VALUE",
-      },
-    ], */
-    KeyAlgorithm : 'RSA_2048' // TODO: support key options"RSA_1024" || "RSA_2048" || "RSA_3072" || "RSA_4096" || "EC_prime256v1" || "EC_secp384r1" || "EC_secp521r1",
-  }
-  // this method can safely be called multiple times; it'll  match  existing certs (by domain name I'd assume)
-  const command = new RequestCertificateCommand(input)
-  const response = await acmClient.send(command)
- 
-  const { CertificateArn } = response
- 
-  return CertificateArn
-}
- 
-const createSiteStack = async ({ credentials, noDeleteOnFailure, siteInfo }) => {
-  const { apexDomain, region } = siteInfo
- 
-  const siteTemplate = new SiteTemplate({ credentials, siteInfo })
-  await siteTemplate.initializeTemplate()
-  await siteTemplate.loadPlugins()
- 
-  const cloudFormationTemplate = siteTemplate.render()
- 
-  const cloudFormationClient = new CloudFormationClient({ credentials, region })
-  const stackName = siteInfo.stackName || convertDomainToBucketName(apexDomain) + '-stack'
-  const createInput = {
-    StackName        : stackName,
-    TemplateBody     : cloudFormationTemplate,
-    DisableRollback  : false,
-    Capabilities     : ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'],
-    TimeoutInMinutes : STACK_CREATE_TIMEOUT
-  }
-  const createCommand = new CreateStackCommand(createInput)
-  const createResponse = await cloudFormationClient.send(createCommand)
- 
-  const { StackId } = createResponse
- 
-  siteInfo.stackName = stackName
-  siteInfo.stackArn = StackId
- 
-  const stackCreated = await trackStackStatus({ cloudFormationClient, noDeleteOnFailure, stackName })
-  return stackCreated
-}
- 
-export { create }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/actions/destroy.mjs.html b/qa/coverage/lib/actions/destroy.mjs.html deleted file mode 100644 index 82c7b12f..00000000 --- a/qa/coverage/lib/actions/destroy.mjs.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - Code coverage report for lib/actions/destroy.mjs - - - - - - - - - -
-
-

All files / lib/actions destroy.mjs

-
- -
- 0% - Statements - 0/37 -
- - -
- 0% - Branches - 0/21 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/37 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { S3Client } from '@aws-sdk/client-s3'
-import { CloudFormationClient, DeleteStackCommand } from '@aws-sdk/client-cloudformation'
- 
-import { emptyBucket } from 's3-empty-bucket'
- 
-import { getCredentials } from './lib/get-credentials'
-import { progressLogger } from '../shared/progress-logger'
-import { SiteTemplate } from '../shared/site-template'
-import { trackStackStatus } from './lib/track-stack-status'
- 
-const destroy = async ({ globalOptions, siteInfo, verbose }) => {
-  const { bucketName, stackName } = siteInfo
- 
-  const credentials = getCredentials(globalOptions)
-  const s3Client = new S3Client({ credentials })
- 
-  // this method provides user udptaes
-  try {
-    progressLogger?.write('Deleting site bucket...\n')
-    await emptyBucket({ bucketName, s3Client, verbose })
-  } catch (e) {
-    if (e.name === 'NoSuchBucket') {
-      progressLogger?.write('Bucket already deleted.\n')
-    } else {
-      throw e
-    }
-  }
- 
-  const siteTemplate = new SiteTemplate({ credentials, siteInfo })
-  await siteTemplate.destroyPlugins()
- 
-  progressLogger.write('Deleting stack...')
-  const cloudFormationClient = new CloudFormationClient({ credentials })
-  const deleteStackCommand = new DeleteStackCommand({ StackName : stackName })
-  await cloudFormationClient.send(deleteStackCommand)
- 
-  // the delete command is doesn't mind if the bucket doesn't exist, but trackStackStatus does
-  try {
-    const finalStatus = await trackStackStatus({ cloudFormationClient, noDeleteOnFailure : true, stackName })
-    progressLogger?.write('Final status: ' + finalStatus + '\n')
- 
-    if (finalStatus === 'DELETE_FAILED' && progressLogger !== undefined) {
-      progressLogger.write('\nThe delete is expected to fail at first because the \'replicated Lambda functions\' take a while to clear and the stack cannot be fully deleted until AWS clears the replicated functions. Give it at least 30 min and up to a few hours and try again.')
-      return false
-    } else Iif (finalStatus === 'DELETE_COMPLETE') {
-      return true
-    }
-  } catch (e) {
-    // oddly, if the stack does not exist we get a ValidationError; which means it's already deleted
-    if (e.name === 'ValidationError') {
-      progressLogger.write(' already deleted.\n')
-      return true
-    } else {
-      throw e
-    }
-  } finally {
-    progressLogger?.write('\n')
-  }
-}
- 
-export { destroy }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/actions/index.html b/qa/coverage/lib/actions/index.html deleted file mode 100644 index 9b142c06..00000000 --- a/qa/coverage/lib/actions/index.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - Code coverage report for lib/actions - - - - - - - - - -
-
-

All files lib/actions

-
- -
- 0% - Statements - 0/239 -
- - -
- 0% - Branches - 0/90 -
- - -
- 0% - Functions - 0/18 -
- - -
- 0% - Lines - 0/235 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
create.mjs -
-
0%0/780%0/160%0/80%0/77
destroy.mjs -
-
0%0/370%0/210%0/10%0/37
update.mjs -
-
0%0/250%0/160%0/20%0/25
verify.mjs -
-
0%0/990%0/370%0/70%0/96
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/create-or-update-dns-records.mjs.html b/qa/coverage/lib/actions/lib/create-or-update-dns-records.mjs.html deleted file mode 100644 index d883a894..00000000 --- a/qa/coverage/lib/actions/lib/create-or-update-dns-records.mjs.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - Code coverage report for lib/actions/lib/create-or-update-dns-records.mjs - - - - - - - - - -
-
-

All files / lib/actions/lib create-or-update-dns-records.mjs

-
- -
- 0% - Statements - 0/24 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/24 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Route53Client, ChangeResourceRecordSetsCommand, ListHostedZonesCommand } from '@aws-sdk/client-route-53'
-import { CloudFrontClient, GetDistributionCommand } from '@aws-sdk/client-cloudfront'
- 
-const createOrUpdateDNSRecords = async ({ credentials, siteInfo }) => {
-  const { apexDomain, cloudFrontDistributionID, region } = siteInfo
- 
-  const cloudFrontClient = new CloudFrontClient({ credentials, region })
-  const getDistributionCommand = new GetDistributionCommand({ Id : cloudFrontDistributionID })
-  const distributionResponse = await cloudFrontClient.send(getDistributionCommand)
-  const distributionDomainName = distributionResponse.Distribution.DomainName
- 
-  const route53Client = new Route53Client({ credentials, region })
- 
-  const hostedZoneID = await getHostedZoneID({ route53Client, siteInfo })
- 
-  const domains = [apexDomain, 'www.' + apexDomain]
- 
-  const changeResourceRecordSetCommand = new ChangeResourceRecordSetsCommand({
-    HostedZoneId : hostedZoneID,
-    ChangeBatch  : {
-      Comment : `Point '${apexDomain}' and 'www.${apexDomain}' to CloudFront distribution.`,
-      Changes : domains.map((name) => ({
-        Action            : 'UPSERT',
-        ResourceRecordSet : {
-          Name        : name,
-          AliasTarget : {
-            DNSName              : distributionDomainName,
-            EvaluateTargetHealth : false,
-            HostedZoneId         : 'Z2FDTNDATAQYW2' // Static value specified by API for use with CloudFront aliases
-          },
-          Type : 'A'
-        }
-      }))
-    }
-  })
-  process.stdout.write(`Creating/updating Route 53 resource record sets/DNS entries for ${domains.join(', ')}...\n`)
-  await route53Client.send(changeResourceRecordSetCommand)
-}
- 
-const getHostedZoneID = async ({ markerToken, route53Client, siteInfo }) => {
-  const listHostedZonesCommand = new ListHostedZonesCommand({ marker : markerToken })
-  const listHostedZonesResponse = await route53Client.send(listHostedZonesCommand)
- 
-  for (const { Id, Name } of listHostedZonesResponse.HostedZones) {
-    Iif (Name === siteInfo.apexDomain + '.') {
-      return Id.replace(/\/[^/]+\/(.+)/, '$1') // /hostedzone/XXX -> XXX
-    }
-  }
- 
-  Iif (listHostedZonesResponse.IsTruncated === true) {
-    return await getHostedZoneID({ markerToken : listHostedZonesResponse.NewMarker, route53Client, siteInfo })
-  }
-}
- 
-export { createOrUpdateDNSRecords }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/get-credentials.mjs.html b/qa/coverage/lib/actions/lib/get-credentials.mjs.html deleted file mode 100644 index c09a69fd..00000000 --- a/qa/coverage/lib/actions/lib/get-credentials.mjs.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - Code coverage report for lib/actions/lib/get-credentials.mjs - - - - - - - - - -
-
-

All files / lib/actions/lib get-credentials.mjs

-
- -
- 0% - Statements - 0/6 -
- - -
- 0% - Branches - 0/3 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { fromIni } from '@aws-sdk/credential-providers'
- 
-const getCredentials = ({ ssoProfile }) => {
-  ssoProfile = ssoProfile || process.env.AWS_PROFILE || 'default'
- 
-  const credentials = fromIni({
-    profile : ssoProfile
-    // Optional. The path to the shared credentials file. If not specified, the provider will use
-    // the value in the `AWS_SHARED_CREDENTIALS_FILE` environment variable or a default of
-    // `~/.aws/credentials`.
-    // filepath: "~/.aws/credentials",
-    // Optional. The path to the shared config file. If not specified, the provider will use the
-    // value in the `AWS_CONFIG_FILE` environment variable or a default of `~/.aws/config`.
-    // configFilepath: "~/.aws/config",
-    // Optional. A function that returns a a promise fulfilled with an MFA token code for the
-    // provided MFA Serial code. If a profile requires an MFA code and `mfaCodeProvider` is not a
-    // valid function, the credential provider promise will be rejected.
-    /* mfaCodeProvider: async (mfaSerial) => {
-      return "token";
-    }, */
-    // Optional. Custom STS client configurations overriding the default ones.
-    // clientConfig: { region },
-  })
- 
-  return credentials
-}
- 
-export { getCredentials }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/index.html b/qa/coverage/lib/actions/lib/index.html deleted file mode 100644 index d85f4962..00000000 --- a/qa/coverage/lib/actions/lib/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - Code coverage report for lib/actions/lib - - - - - - - - - -
-
-

All files lib/actions/lib

-
- -
- 0% - Statements - 0/122 -
- - -
- 0% - Branches - 0/43 -
- - -
- 0% - Functions - 0/16 -
- - -
- 0% - Lines - 0/119 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
create-or-update-dns-records.mjs -
-
0%0/240%0/20%0/30%0/24
get-credentials.mjs -
-
0%0/60%0/30%0/10%0/6
sync-site-content.mjs -
-
0%0/220%0/120%0/30%0/21
track-stack-status.mjs -
-
0%0/270%0/160%0/20%0/26
update-site-info.mjs -
-
0%0/11100%0/00%0/20%0/11
update-stack.mjs -
-
0%0/320%0/100%0/50%0/31
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/sync-site-content.mjs.html b/qa/coverage/lib/actions/lib/sync-site-content.mjs.html deleted file mode 100644 index 5860cce5..00000000 --- a/qa/coverage/lib/actions/lib/sync-site-content.mjs.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - Code coverage report for lib/actions/lib/sync-site-content.mjs - - - - - - - - - -
-
-

All files / lib/actions/lib sync-site-content.mjs

-
- -
- 0% - Statements - 0/22 -
- - -
- 0% - Branches - 0/12 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/21 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { existsSync as fileExists } from 'node:fs'
-import * as fsPath from 'node:path'
- 
-import { S3Client } from '@aws-sdk/client-s3'
-import { tryExec } from '@liquid-labs/shell-toolkit'
-import mime from 'mime-types'
-import { S3SyncClient } from 's3-sync-client'I
- 
-const syncSiteContent = async ({ credentials, noBuild, siteInfo }) => {
-  const { bucketName, sourcePath, sourceType } = siteInfo
- 
-  Iif (noBuild !== true && sourceType === 'docusaurus') {
-    const packageRoot = fsPath.resolve(sourcePath, '..')
-    const packagePath = fsPath.join(packageRoot, 'package.json')
-    Iif (fileExists(packagePath)) {
-      process.stdout.write('Rebuilding site... ')
-      tryExec(`cd "${packageRoot}" && npm run build`)
-      process.stdout.write('done.\n')
-    }
-  }
- 
-  process.stdout.write(`Syncing files from ${sourcePath}...\n`)
- 
-  const s3Client = new S3Client({ credentials })
-  const { sync } = new S3SyncClient({ client : s3Client })
- 
-  await sync(sourcePath, 's3://' + bucketName, {
-    commandInput           : (input) => ({ ContentType : mime.lookup(input.Key) || 'application/octet-stream' }),
-    del                    : true,
-    maxConcurrentTransfers : 10
-  })
-}
- 
-export { syncSiteContent }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/track-stack-status.mjs.html b/qa/coverage/lib/actions/lib/track-stack-status.mjs.html deleted file mode 100644 index 2777a3a8..00000000 --- a/qa/coverage/lib/actions/lib/track-stack-status.mjs.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - Code coverage report for lib/actions/lib/track-stack-status.mjs - - - - - - - - - -
-
-

All files / lib/actions/lib track-stack-status.mjs

-
- -
- 0% - Statements - 0/27 -
- - -
- 0% - Branches - 0/16 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { DeleteStackCommand, DescribeStacksCommand } from '@aws-sdk/client-cloudformation'
- 
-const RECHECK_WAIT_TIME = 2000 // ms
- 
-const trackStackStatus = async ({ cloudFormationClient, noDeleteOnFailure, stackName }) => {
-  let stackStatus, previousStatus
-  do {
-    const describeInput = { StackName : stackName }
-    const describeCommand = new DescribeStacksCommand(describeInput)
-    const describeResponse = await cloudFormationClient.send(describeCommand)
- 
-    stackStatus = describeResponse.Stacks[0].StackStatus
- 
-    if (stackStatus === 'CREATE_IN_PROGRESS' && previousStatus === undefined) {
-      process.stdout.write('Creating stack')
-    } else if (stackStatus === 'UPDATE_IN_PROGRESS' && previousStatus === undefined) {
-      process.stdout.write('Updating stack')
-    } else if (stackStatus === 'ROLLBACK_IN_PROGRESS' && previousStatus !== 'ROLLBACK_IN_PROGRESS') {
-      process.stdout.write('\nRollback in progress')
-    } else {
-      process.stdout.write('.')
-    }
- 
-    previousStatus = stackStatus
-    await new Promise(resolve => setTimeout(resolve, RECHECK_WAIT_TIME))
-  } while (stackStatus.endsWith('_IN_PROGRESS'))
- 
-  if (stackStatus === 'ROLLBACK_COMPLETE' && noDeleteOnFailure !== true) {
-    process.stdout.write(`\nDeleting stack '${stackName}'... `)
-    const deleteInput = { StackName : stackName }
-    const deleteCommand = new DeleteStackCommand(deleteInput)
-    await cloudFormationClient.send(deleteCommand)
- 
-    process.stdout.write('done.\n')
-  } else {
-    process.stdout.write('\nStack status: ' + stackStatus + '\n')
-  }
- 
-  return stackStatus === 'CREATE_COMPLETE'
-}
- 
-export { trackStackStatus }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/update-site-info.mjs.html b/qa/coverage/lib/actions/lib/update-site-info.mjs.html deleted file mode 100644 index fa5c6d6d..00000000 --- a/qa/coverage/lib/actions/lib/update-site-info.mjs.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - Code coverage report for lib/actions/lib/update-site-info.mjs - - - - - - - - - -
-
-

All files / lib/actions/lib update-site-info.mjs

-
- -
- 0% - Statements - 0/11 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { CloudFormationClient, DescribeStacksCommand } from '@aws-sdk/client-cloudformation'
- 
-const updateSiteInfo = async ({ credentials, siteInfo }) => {
-  const { region, stackName } = siteInfo
-  process.stdout.write('Gathering information from stack...\n')
-  const cloudFormationClient = new CloudFormationClient({ credentials, region })
-  const describeCommand = new DescribeStacksCommand({ StackName : stackName })
-  const describeResponse = await cloudFormationClient.send(describeCommand)
-  const cloudFrontDistributionID = describeResponse
-    .Stacks[0].Outputs.find(({ OutputKey }) => OutputKey === 'SiteCloudFrontDistribution').OutputValue
- 
-  siteInfo.cloudFrontDistributionID = cloudFrontDistributionID
-}
- 
-export { updateSiteInfo }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/actions/lib/update-stack.mjs.html b/qa/coverage/lib/actions/lib/update-stack.mjs.html deleted file mode 100644 index 24f5a37f..00000000 --- a/qa/coverage/lib/actions/lib/update-stack.mjs.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - Code coverage report for lib/actions/lib/update-stack.mjs - - - - - - - - - -
-
-

All files / lib/actions/lib update-stack.mjs

-
- -
- 0% - Statements - 0/32 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/5 -
- - -
- 0% - Lines - 0/31 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { CloudFormationClient, GetTemplateCommand, UpdateStackCommand } from '@aws-sdk/client-cloudformation'
-import isEqual from 'lodash/isEqual'
- 
-import * as plugins from '../../plugins'
-import { SiteTemplate } from '../../shared/site-template'
-import { trackStackStatus } from './track-stack-status'
-import { updateSiteInfo } from './update-site-info'I
- 
-const updateStack = async ({ credentials, siteInfo }) => {
-  const { region, stackName } = siteInfo
- 
-  const siteTemplate = new SiteTemplate({ credentials, siteInfo })
-  await siteTemplate.initializeTemplate()
-  await siteTemplate.loadPlugins()
- 
-  const newTemplate = siteTemplate.render()
- 
-  const cloudFormationClient = new CloudFormationClient({ credentials, region })
-  const getTemplateCommand = new GetTemplateCommand({
-    StackName     : stackName,
-    TemplateStage : 'Original'
-  })
-  const getTemplateResponse = await cloudFormationClient.send(getTemplateCommand)
-  const currentTemplate = getTemplateResponse.TemplateBody
- 
-  Iif (isEqual(currentTemplate, newTemplate)) {
-    process.stdout.write('No change to template; skipping stack update.\n')
-    return
-  }
-  // else, the template has changed
- 
-  const stackUpdateCommand = new UpdateStackCommand({ // UpdateStackInput
-    StackName           : stackName,
-    TemplateBody        : newTemplate,
-    UsePreviousTemplate : false,
-    Capabilities        : ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'],
-    DisableRollback     : false
-  })
- 
-  await cloudFormationClient.send(stackUpdateCommand)
- 
-  await trackStackStatus({ cloudFormationClient, noDeleteOnFailure : true, stackName })
- 
-  await updateSiteInfo({ credentials, siteInfo }) // needed by createOrUpdateDNSRecords
- 
-  const postUpdateHandlers = Object.keys(siteInfo.pluginSettings || {}).map((pluginKey) =>
-    [pluginKey, plugins[pluginKey].postUpdateHandler]
-  )
-    .filter(([, postUpdateHandler]) => postUpdateHandler !== undefined)
- 
-  Iif (postUpdateHandlers.length > 0) {
-    await Promise.all([
-      ...(postUpdateHandlers.map(([pluginKey, handler]) =>
-        handler({ settings : siteInfo.pluginSettings[pluginKey], siteInfo })))
-    ])
-  }
- 
-  process.stdout.write('Stack created.\n')
-}
- 
-export { updateStack }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/actions/update.mjs.html b/qa/coverage/lib/actions/update.mjs.html deleted file mode 100644 index d5a04632..00000000 --- a/qa/coverage/lib/actions/update.mjs.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - Code coverage report for lib/actions/update.mjs - - - - - - - - - -
-
-

All files / lib/actions update.mjs

-
- -
- 0% - Statements - 0/25 -
- - -
- 0% - Branches - 0/16 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/25 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { CloudFrontClient, CreateInvalidationCommand } from '@aws-sdk/client-cloudfront'
- 
-import { createOrUpdateDNSRecords } from './lib/create-or-update-dns-records'
-import { getCredentials } from './lib/get-credentials'
-import { syncSiteContent } from './lib/sync-site-content'
-import { updateStack } from './lib/update-stack'
- 
-const update = async ({ doContent, doDNS, doStack, noBuild, noCacheInvalidation, siteInfo, globalOptions }) => {
-  const doAll = doContent === undefined && doDNS === undefined && doStack === undefined
- 
-  const credentials = getCredentials(globalOptions)
- 
-  const updates = []
-  Iif (doAll === true || doContent === true) {
-    // method will report actions to user
-    updates.push(syncSiteContent({ credentials, noBuild, siteInfo }))
-  }
- 
-  Iif (doAll === true || doDNS === true) {
-    updates.push(createOrUpdateDNSRecords({ credentials, siteInfo }))
-  }
- 
-  Iif (doAll === true || doStack === true) {
-    updates.push(updateStack({ credentials, siteInfo }))
-  }
- 
-  await Promise.all(updates)
- 
-  Iif ((doAll === true || doContent === true) && noCacheInvalidation !== true) {
-    await invalidateCache({ credentials, siteInfo })
-  }
-}
- 
-const invalidateCache = async ({ credentials, siteInfo }) => {
-  process.stdout.write('Invalidating CloudFront cache...\n')
- 
-  const { cloudFrontDistributionID } = siteInfo
- 
-  const cloudFrontClient = new CloudFrontClient({ credentials })
-  const invalidateCacheCommand = new CreateInvalidationCommand({
-    DistributionId    : cloudFrontDistributionID,
-    InvalidationBatch : {
-      Paths : {
-        Quantity : 1,
-        Items    : ['/*']
-      },
-      CallerReference : new Date().getTime() + ''
-    }
-  })
-  await cloudFrontClient.send(invalidateCacheCommand)
-}
- 
-export { update }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/actions/verify.mjs.html b/qa/coverage/lib/actions/verify.mjs.html deleted file mode 100644 index 381bfded..00000000 --- a/qa/coverage/lib/actions/verify.mjs.html +++ /dev/null @@ -1,628 +0,0 @@ - - - - - - Code coverage report for lib/actions/verify.mjs - - - - - - - - - -
-
-

All files / lib/actions verify.mjs

-
- -
- 0% - Statements - 0/99 -
- - -
- 0% - Branches - 0/37 -
- - -
- 0% - Functions - 0/7 -
- - -
- 0% - Lines - 0/96 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  CloudFormationClient,
-  DescribeStackDriftDetectionStatusCommand,
-  DetectStackDriftCommand
-} from '@aws-sdk/client-cloudformation'
-import { S3Client } from '@aws-sdk/client-s3'
-import { S3SyncClient } from 's3-sync-client'
- 
-import { getCredentials } from './lib/get-credentials'
- 
-const RECHECK_WAIT_TIME = 2000 // ms
- 
-const verify = async ({ checkContent, checkSiteUp, checkStack, globalOptions, progressLogger, siteInfo }) => {
-  const checkAll = checkContent === undefined && checkSiteUp === undefined && checkStack === undefined
-  let credentials
-  Iif (checkAll || checkContent || checkStack) {
-    credentials = getCredentials(globalOptions)
-  }
- 
-  const checks = []
-  Iif (checkAll || checkSiteUp) {
-    checks.push(doCheckSiteUp({ progressLogger, siteInfo }))
-  }
-  Iif (checkAll || checkContent) {
-    checks.push(doCheckContent({ credentials, progressLogger, siteInfo }))
-  }
-  Iif (checkAll || checkStack) {
-    checks.push(doCheckStack({ credentials, progressLogger, siteInfo }))
-  }
- 
-  const results = await Promise.all(checks)
- 
-  return results.reduce((acc, array) => { acc.push(...array); return acc }, [])
-}
- 
-const doCheckContent = async ({ credentials, progressLogger, siteInfo }) => {
-  Iif (progressLogger !== undefined) {
-    progressLogger.write('Checking site content in sync...\n')
-  }
-  const { bucketName, sourcePath } = siteInfo
- 
-  const s3Client = new S3Client({ credentials })
-  const { sync } = new S3SyncClient({ client : s3Client })
- 
-  const checkResult = { check : 'S3 bucket and local source in sync' }
-  try {
-    const objectData = await sync(sourcePath, 's3://' + bucketName, { dryRun : true })
- 
-    const createdCount = objectData.created.length
-    const updatedCount = objectData.updated.length
-    const deletedCount = objectData.deleted.length
-    const inSync = (createdCount + updatedCount + deletedCount) === 0
-    if (inSync === true) {
-      checkResult.status = 'success'
-      checkResult.message = 'S3 bucket and local source are up-to-date'
-    } else {
-      checkResult.status = 'failed'
-      checkResult.message =
-        `${createdCount} files to create, ${updatedCount} files to update, and ${deletedCount} files to delete`
-    }
- 
-    return [checkResult]
-  } catch (e) {
-    checkResult.status = 'error'
-    checkResult.message = e.message
- 
-    return [checkResult]
-  } finally {
-    Iif (progressLogger !== undefined) {
-      progressLogger.write('Site content check complete.\n')
-    }
-  }
-}
- 
-const doCheckSiteUp = async ({ progressLogger, siteInfo }) => {
-  Iif (progressLogger !== undefined) {
-    progressLogger.write('Checking site is up...\n')
-  }
-  const { apexDomain } = siteInfo
- 
-  try {
-    const fetchResponses = await Promise.all([
-      fetch('https://' + apexDomain),
-      fetch('https://www.' + apexDomain)
-    ])
- 
-    const results = [
-      processFetchResults({ domain : apexDomain, fetchResponse : fetchResponses[0] }),
-      processFetchResults({ domain : 'www.' + apexDomain, fetchResponse : fetchResponses[1] })
-    ]
- 
-    return results
-  } catch (e) {
-    return [
-      { check : `site ${apexDomain} is up`, status : 'error', message : e.message },
-      { check : `site www.${apexDomain} is up`, status : 'error', message : e.message }
-    ]
-  } finally {
-    Iif (progressLogger !== undefined) {
-      progressLogger.write('Site is up check complete.\n')
-    }
-  }
-}
- 
-const doCheckStack = async ({ credentials, progressLogger, siteInfo }) => {
-  Iif (progressLogger !== undefined) {
-    progressLogger.write('Checking stack drift status...\n')
-  }
- 
-  const checkResult = { check : 'Stack drift check' }
- 
-  try {
-    const { stackName } = siteInfo
-    const cfClient = new CloudFormationClient({ credentials })
-    const detectDriftCommand = new DetectStackDriftCommand({ StackName : stackName })
-    const stackDriftOperationID = (await cfClient.send(detectDriftCommand)).StackDriftDetectionId
- 
-    const describeStackDriftDetectionCommand = new DescribeStackDriftDetectionStatusCommand({
-      StackDriftDetectionId : stackDriftOperationID
-    })
-    let stackDriftDescribeResponse
-    let detectionStatus
-    do {
-      Iif (progressLogger !== undefined) {
-        progressLogger.write('.')
-      }
-      await new Promise(resolve => setTimeout(resolve, RECHECK_WAIT_TIME))
- 
-      stackDriftDescribeResponse = await cfClient.send(describeStackDriftDetectionCommand)
-      detectionStatus = stackDriftDescribeResponse.DetectionStatus
-    } while (detectionStatus === 'DETECTION_IN_PROGRESS')
- 
-    const stackDriftStatus = stackDriftDescribeResponse.StackDriftStatus
-    if (detectionStatus === 'DETECTION_FAILED') {
-      checkResult.status = 'error'
-      checkResult.message = (stackDriftStatus === 'IN_SYNC'
-        ? 'Stack as checked in sync, but: '
-        : 'Stack not in sync and: ') +
-        stackDriftDescribeResponse.DetectionStatusReason
-    } else if (stackDriftStatus === 'IN_SYNC') {
-      checkResult.status = 'success'
-      checkResult.message = stackName + ' is in sync with template'
-    } else if (stackDriftStatus === 'UNKNOWN') {
-      checkResult.status = 'error'
-      checkResult.message = stackName + ' drift status is unknown'
-    } else if (stackDriftStatus === 'DRIFTED') {
-      checkResult.status = 'failed'
-      checkResult.message =
-        `${stackDriftDescribeResponse.DriftedStackResourceCount} resources have drifted on stack ${stackName}`
-    } else {
-      checkResult.status = 'error'
-      checkResult.message = `Unexpected status '${stackDriftStatus} while checking ${stackName}`
-    }
-  } catch (e) {
-    checkResult.status = 'error'
-    checkResult.message = e.message
-  } finally {
-    Iif (progressLogger !== undefined) {
-      progressLogger.write('\nStack drift check complete.\n')
-    }
-  }
- 
-  return [checkResult]
-}
- 
-const processFetchResults = ({ domain, fetchResponse }) => {
-  const result = {
-    check   : `site ${domain} is up`,
-    message : `Got HTTP status ${fetchResponse.status} fetching https://${domain}.`
-  }
- 
-  if (fetchResponse.status === 200) {
-    result.status = 'success'
-  } else {
-    result.status = 'failed'
-  }
- 
-  return result
-}
- 
-export { verify }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/plugins/access-logs.mjs.html b/qa/coverage/lib/plugins/access-logs.mjs.html deleted file mode 100644 index f8d4bcd4..00000000 --- a/qa/coverage/lib/plugins/access-logs.mjs.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - Code coverage report for lib/plugins/access-logs.mjs - - - - - - - - - -
-
-

All files / lib/plugins access-logs.mjs

-
- -
- 0% - Statements - 0/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12  -  -  -  -  -  -  -  -  -  -  - 
const config = {
-  options : { default : true, validation : (v) => typeof v === 'boolean' }
-}
- 
-const handler = () => {
-  throw new Error('Not yet implemented')
-}
- 
-const accessLogs = { config, handler }
- 
-export { accessLogs }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/plugins/cloudfront-logs.mjs.html b/qa/coverage/lib/plugins/cloudfront-logs.mjs.html deleted file mode 100644 index 195e0c16..00000000 --- a/qa/coverage/lib/plugins/cloudfront-logs.mjs.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - Code coverage report for lib/plugins/cloudfront-logs.mjs - - - - - - - - - -
-
-

All files / lib/plugins cloudfront-logs.mjs

-
- -
- 0% - Statements - 0/9 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
const config = {
-  options : {
-    includeCookies : { default : false, validation : (v) => typeof v === 'boolean' }
-  }
-}
- 
-const preStackDestroyHandler = async ({ siteTemplate }) => {
-  await siteTemplate.destroySharedLoggingBucket()
-}
- 
-const stackConfig = async ({ siteTemplate, settings }) => {
-  const { finalTemplate } = siteTemplate
- 
-  await siteTemplate.enableSharedLoggingBucket()
- 
-  finalTemplate.Resources.SiteCloudFrontDistribution.Properties.DistributionConfig.Logging = {
-    Bucket         : { 'Fn::GetAtt' : ['SharedLoggingBucket', 'DomainName'] },
-    IncludeCookies : settings.includeCookies,
-    Prefix         : 'cloudfront-logs/'
-  }
-}
- 
-const cloudfrontLogs = { config, preStackDestroyHandler, stackConfig }
- 
-export { cloudfrontLogs }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/constants.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/constants.mjs.html deleted file mode 100644 index bac96970..00000000 --- a/qa/coverage/lib/plugins/contact-handler/lib/constants.mjs.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - Code coverage report for lib/plugins/contact-handler/lib/constants.mjs - - - - - - - - - -
-
-

All files / lib/plugins/contact-handler/lib constants.mjs

-
- -
- 0% - Statements - 0/3 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/3 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4  -  -  - 
export const CONTACT_EMAILER_ZIP_NAME = 'contact-emailer-lambda.zip'
-export const CONTACT_HANDLER_ZIP_NAME = 'contact-handler-lambda.zip'
-export const REQUEST_SIGNER_ZIP_NAME = 'request-signer-lambda.zip'
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs.html deleted file mode 100644 index a029be7f..00000000 --- a/qa/coverage/lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - Code coverage report for lib/plugins/contact-handler/lib/determine-lambda-function-name.mjs - - - - - - - - - -
-
-

All files / lib/plugins/contact-handler/lib determine-lambda-function-name.mjs

-
- -
- 0% - Statements - 0/23 -
- - -
- 0% - Branches - 0/20 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/23 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { v4 as uuidv4 } from 'uuid'
- 
-import { LambdaClient, GetFunctionCommand } from '@aws-sdk/client-lambda'
- 
-import { progressLogger } from '../../../shared/progress-logger'
- 
-const determineLambdaFunctionName = async ({ baseName, credentials, siteTemplate }) => {
-  const { siteInfo } = siteTemplate
-  const { region } = siteInfo
-  let currentName = baseName
- 
-  const lambdaClient = new LambdaClient({ credentials, region })
-  while (true) {
-    progressLogger?.write(`Checking if lambda function name '${currentName}' is free...`)
-    const getFunctionCommand = new GetFunctionCommand({ FunctionName : currentName })
-    try {
-      await lambdaClient.send(getFunctionCommand)
-    } catch (e) {
-      if (e.name === 'NotFound' || e.$metadata?.httpStatusCode === 404) {
-        progressLogger?.write('FREE\n')
-        return currentName
-      } else {
-        progressLogger?.write('\n')
-        throw e
-      }
-    }
-    progressLogger?.write('NOT free\n')
-    const nameSalt = uuidv4().slice(0, 8)
-    currentName = currentName.replace(/-[A-F0-9]{8}$/i, '')
-    currentName += '-' + nameSalt
-  }
-}
- 
-export { determineLambdaFunctionName }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/index.html b/qa/coverage/lib/plugins/contact-handler/lib/index.html deleted file mode 100644 index 79f3404f..00000000 --- a/qa/coverage/lib/plugins/contact-handler/lib/index.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - Code coverage report for lib/plugins/contact-handler/lib - - - - - - - - - -
-
-

All files lib/plugins/contact-handler/lib

-
- -
- 0% - Statements - 0/120 -
- - -
- 0% - Branches - 0/28 -
- - -
- 0% - Functions - 0/8 -
- - -
- 0% - Lines - 0/120 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
constants.mjs -
-
0%0/3100%0/0100%0/00%0/3
determine-lambda-function-name.mjs -
-
0%0/230%0/200%0/10%0/23
setup-contact-emailer.mjs -
-
0%0/180%0/40%0/10%0/18
setup-contact-form-table.mjs -
-
0%0/7100%0/00%0/10%0/7
setup-contact-handler.mjs -
-
0%0/20100%0/00%0/10%0/20
setup-request-signer.mjs -
-
0%0/10100%0/00%0/10%0/10
stage-lambda-function-zip-files.mjs -
-
0%0/280%0/20%0/20%0/28
update-cloud-front-distribution.mjs -
-
0%0/110%0/20%0/10%0/11
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-emailer.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-emailer.mjs.html deleted file mode 100644 index 29754e28..00000000 --- a/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-emailer.mjs.html +++ /dev/null @@ -1,439 +0,0 @@ - - - - - - Code coverage report for lib/plugins/contact-handler/lib/setup-contact-emailer.mjs - - - - - - - - - -
-
-

All files / lib/plugins/contact-handler/lib setup-contact-emailer.mjs

-
- -
- 0% - Statements - 0/18 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { CONTACT_EMAILER_ZIP_NAME } from './constants'
-import { determineLambdaFunctionName } from './determine-lambda-function-name'
- 
-const setupContactEmailer = async ({ credentials, lambdaFunctionsBucketName, settings, siteTemplate }) => {
-  const { finalTemplate } = siteTemplate
-  const contactHandlerFromEmail = settings.emailFrom
-  const contactHandlerTargetEmail = settings.emailTo
- 
-  Iif (contactHandlerFromEmail === undefined && contactHandlerTargetEmail !== undefined) {
-    throw new Error("Found site setting for 'emailTo', but no 'emailFrom'; 'emailFrom' must be set to activate email functionality.")
-  }
- 
-  // setup stream on table
-  finalTemplate.Resources.ContactHandlerDynamoDB.Properties.StreamSpecification = {
-    StreamViewType : 'NEW_IMAGE'
-  }
- 
-  const emailerFunctionName = await determineLambdaFunctionName({
-    baseName : lambdaFunctionsBucketName + '-contact-emailer',
-    credentials,
-    siteTemplate
-  })
-  const emailerFunctionLogGroupName = emailerFunctionName
- 
-  finalTemplate.Resources.ContactEmailerLogGroup = {
-    Type       : 'AWS::Logs::LogGroup',
-    Properties : {
-      LogGroupClass   : 'STANDARD', // TODO: support option for INFREQUENT_ACCESS
-      LogGroupName    : emailerFunctionLogGroupName,
-      RetentionInDays : 180 // TODO: support options
-    }
-  }
- 
-  finalTemplate.Resources.ContactEmailerRole = {
-    Type       : 'AWS::IAM::Role',
-    Properties : {
-      AssumeRolePolicyDocument : {
-        Version   : '2012-10-17',
-        Statement : [
-          {
-            Effect    : 'Allow',
-            Principal : {
-              Service : ['lambda.amazonaws.com']
-            },
-            Action : ['sts:AssumeRole']
-          }
-        ]
-      },
-      Path     : '/',
-      Policies : [
-        {
-          PolicyName     : emailerFunctionName,
-          PolicyDocument : {
-            Version   : '2012-10-17',
-            Statement : [
-              {
-                Effect   : 'Allow',
-                Action   : ['ses:SendEmail', 'ses:SendEmailRaw', 'ses:GetSendQuota', 'ses:GetSendStatistics'],
-                Resource : '*'
-              }
-            ]
-          }
-        }
-      ],
-      ManagedPolicyArns : [
-        // AWSLambdaBasicExecutionRole: allows logging to CloudWatch
-        'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole',
-        // Allows reading from DynamoDB streams
-        'arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole'
-      ]
-    }
-  }
- 
-  finalTemplate.Resources.ContactEmailerFunction = {
-    Type       : 'AWS::Lambda::Function',
-    DependsOn  : ['ContactEmailerRole', 'ContactEmailerLogGroup'],
-    Properties : {
-      FunctionName : emailerFunctionName,
-      Handler      : 'index.handler',
-      Role         : { 'Fn::GetAtt' : ['ContactEmailerRole', 'Arn'] },
-      Runtime      : 'nodejs20.x',
-      MemorySize   : 128,
-      Timeout      : 5,
-      Code         : {
-        S3Bucket : lambdaFunctionsBucketName,
-        S3Key    : CONTACT_EMAILER_ZIP_NAME
-      },
-      Environment : {
-        Variables : {
-          EMAIL_HANDLER_SOURCE_EMAIL : contactHandlerFromEmail
-        }
-      },
-      LoggingConfig : {
-        ApplicationLogLevel : 'INFO', // support options
-        LogFormat           : 'JSON', // support options
-        LogGroup            : emailerFunctionLogGroupName,
-        SystemLogLevel      : 'INFO' // support options
-      }
-    }
-  }
- 
-  finalTemplate.Resources.ContactEmailerEventsSource = {
-    Type       : 'AWS::Lambda::EventSourceMapping',
-    DependsOn  : ['ContactEmailerFunction'],
-    Properties : {
-      FunctionName     : { 'Fn::GetAtt' : ['ContactEmailerFunction', 'Arn'] },
-      EventSourceArn   : { 'Fn::GetAtt' : ['ContactHandlerDynamoDB', 'StreamArn'] },
-      StartingPosition : 'LATEST'
-    }
-  }
- 
-  Iif (contactHandlerTargetEmail !== undefined) {
-    finalTemplate.Resources.ContactEmailerFunction.Properties.Environment.Variables.EMAIL_HANDLER_TARGET_EMAIL =
-      contactHandlerTargetEmail
-  }
-}
- 
-export { setupContactEmailer }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-form-table.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-form-table.mjs.html deleted file mode 100644 index c5ab2b7f..00000000 --- a/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-form-table.mjs.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - Code coverage report for lib/plugins/contact-handler/lib/setup-contact-form-table.mjs - - - - - - - - - -
-
-

All files / lib/plugins/contact-handler/lib setup-contact-form-table.mjs

-
- -
- 0% - Statements - 0/7 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/7 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
const setupContactFormTable = ({ siteInfo, siteTemplate }) => {
-  const { finalTemplate, resourceTypes } = siteTemplate
-  const { bucketName } = siteInfo
- 
-  finalTemplate.Resources.ContactHandlerDynamoDB = {
-    Type       : 'AWS::DynamoDB::Table',
-    Properties : {
-      TableName            : bucketName + '-ContactFormEntries',
-      AttributeDefinitions : [
-        { AttributeName : 'SubmissionID', AttributeType : 'S' },
-        { AttributeName : 'SubmissionTime', AttributeType : 'S' }
-      ],
-      KeySchema : [
-        { AttributeName : 'SubmissionID', KeyType : 'HASH' },
-        { AttributeName : 'SubmissionTime', KeyType : 'RANGE' }
-      ],
-      BillingMode : 'PAY_PER_REQUEST'
-    }
-  }
- 
-  finalTemplate.Outputs.ContactHandlerDynamoDB = { Value : { Ref : 'ContactHandlerDynamoDB' } }
-  resourceTypes['DynamoDB::Table'] = true
-}
- 
-export { setupContactFormTable }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-handler.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-handler.mjs.html deleted file mode 100644 index f0078160..00000000 --- a/qa/coverage/lib/plugins/contact-handler/lib/setup-contact-handler.mjs.html +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - Code coverage report for lib/plugins/contact-handler/lib/setup-contact-handler.mjs - - - - - - - - - -
-
-

All files / lib/plugins/contact-handler/lib setup-contact-handler.mjs

-
- -
- 0% - Statements - 0/20 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { CONTACT_HANDLER_ZIP_NAME } from './constants'
-import { determineLambdaFunctionName } from './determine-lambda-function-name'
- 
-const setupContactHandler = async ({ credentials, lambdaFunctionsBucketName, siteInfo, siteTemplate }) => {
-  const { accountID, bucketName } = siteInfo
-  const { finalTemplate, resourceTypes } = siteTemplate
- 
-  const contactHandlerFunctionName = await determineLambdaFunctionName({
-    baseName : lambdaFunctionsBucketName + '-contact-handler',
-    credentials,
-    siteTemplate
-  })
- 
-  const contactHandlerLogGroupName = contactHandlerFunctionName
-  const contactHandlerPolicyName = contactHandlerFunctionName
- 
-  finalTemplate.Resources.ContactHandlerRole = {
-    Type       : 'AWS::IAM::Role',
-    Properties : {
-      AssumeRolePolicyDocument : {
-        Version   : '2012-10-17',
-        Statement : [
-          {
-            Effect    : 'Allow',
-            Principal : {
-              Service : ['lambda.amazonaws.com']
-            },
-            Action : ['sts:AssumeRole']
-          }
-        ]
-      },
-      Path     : '/',
-      Policies : [
-        {
-          PolicyName     : contactHandlerPolicyName,
-          PolicyDocument : {
-            Version   : '2012-10-17',
-            Statement : [
-              {
-                Effect   : 'Allow',
-                Action   : '*',
-                Resource : '*'
-              }
-            ]
-          }
-        }
-      ]
-    }
-  }
-  finalTemplate.Outputs.ContactHandlerRole = { Value : { Ref : 'ContactHandlerRole' } }
-  resourceTypes['IAM::Role'] = true
- 
-  finalTemplate.Resources.ContactHandlerLogGroup = {
-    Type       : 'AWS::Logs::LogGroup',
-    Properties : {
-      LogGroupClass   : 'STANDARD', // TODO: support option for INFREQUENT_ACCESS
-      LogGroupName    : contactHandlerLogGroupName,
-      RetentionInDays : 180 // TODO: support options
-    }
-  }
- 
-  finalTemplate.Resources.ContactHandlerLambdaFunction = {
-    Type       : 'AWS::Lambda::Function',
-    DependsOn  : ['ContactHandlerRole', 'ContactHandlerLogGroup'],
-    Properties : {
-      FunctionName : contactHandlerFunctionName,
-      Description  : 'Handles contact form submissions; creates DynamoDB entry and sends email.',
-      Code         : {
-        S3Bucket : lambdaFunctionsBucketName,
-        S3Key    : CONTACT_HANDLER_ZIP_NAME
-      },
-      Handler     : 'index.handler',
-      Role        : { 'Fn::GetAtt' : ['ContactHandlerRole', 'Arn'] },
-      Runtime     : 'nodejs20.x',
-      MemorySize  : 128,
-      Timeout     : 5,
-      Environment : {
-        Variables : { TABLE_PREFIX : bucketName }
-      },
-      LoggingConfig : {
-        ApplicationLogLevel : 'INFO', // support options
-        LogFormat           : 'JSON', // support options
-        LogGroup            : contactHandlerLogGroupName,
-        SystemLogLevel      : 'INFO' // support options
-      }
-    }
-  }
-  finalTemplate.Outputs.ContactHandlerLambdaFunction = { Value : { Ref : 'ContactHandlerLambdaFunction' } }
-  resourceTypes['Lambda::Function'] = true
- 
-  finalTemplate.Resources.ContactHandlerLambdaPermission = {
-    Type       : 'AWS::Lambda::Permission',
-    DependsOn  : ['SiteCloudFrontDistribution', 'ContactHandlerLambdaFunction'],
-    Properties : {
-      Action              : 'lambda:InvokeFunctionUrl',
-      Principal           : 'cloudfront.amazonaws.com',
-      FunctionName        : contactHandlerFunctionName,
-      FunctionUrlAuthType : 'AWS_IAM',
-      SourceArn           : {
-        'Fn::Join' : ['', [`arn:aws:cloudfront::${accountID}:distribution/`, { 'Fn::GetAtt' : ['SiteCloudFrontDistribution', 'Id'] }]]
-      }
-    }
-  }
- 
-  finalTemplate.Resources.ContactHandlerLambdaURL = {
-    Type       : 'AWS::Lambda::Url',
-    DependsOn  : ['ContactHandlerLambdaFunction'],
-    Properties : {
-      AuthType : 'AWS_IAM',
-      Cors     : {
-        AllowCredentials : true,
-        AllowHeaders     : ['*'],
-        AllowMethods     : ['POST'],
-        AllowOrigins     : ['*']
-      },
-      TargetFunctionArn : { 'Fn::GetAtt' : ['ContactHandlerLambdaFunction', 'Arn'] }
-    }
-  }
-  finalTemplate.Outputs.ContactHandlerLambdaURL = { Value : { Ref : 'ContactHandlerLambdaURL' } }
-  resourceTypes['Lambda::Url'] = true
-}
- 
-export { setupContactHandler }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/setup-request-signer.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/setup-request-signer.mjs.html deleted file mode 100644 index dfca5b11..00000000 --- a/qa/coverage/lib/plugins/contact-handler/lib/setup-request-signer.mjs.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - Code coverage report for lib/plugins/contact-handler/lib/setup-request-signer.mjs - - - - - - - - - -
-
-

All files / lib/plugins/contact-handler/lib setup-request-signer.mjs

-
- -
- 0% - Statements - 0/10 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { REQUEST_SIGNER_ZIP_NAME } from './constants'
-import { determineLambdaFunctionName } from './determine-lambda-function-name'
- 
-const setupRequestSigner = async ({ credentials, lambdaFunctionsBucketName, siteTemplate }) => {
-  const { finalTemplate } = siteTemplate
- 
-  finalTemplate.Resources.RequestSignerRole = {
-    Type       : 'AWS::IAM::Role',
-    DependsOn  : ['ContactHandlerLambdaFunction'],
-    Properties : {
-      AssumeRolePolicyDocument : {
-        Version   : '2012-10-17',
-        Statement : [
-          {
-            Effect    : 'Allow',
-            Principal : { Service : ['lambda.amazonaws.com', 'edgelambda.amazonaws.com'] },
-            Action    : ['sts:AssumeRole']
-          }
-        ]
-      },
-      Path     : '/',
-      Policies : [
-        {
-          PolicyName     : lambdaFunctionsBucketName + '-request-signer',
-          PolicyDocument : {
-            Version   : '2012-10-17',
-            Statement : [
-              {
-                Effect   : 'Allow',
-                Action   : 'lambda:InvokeFunctionUrl',
-                Resource : { 'Fn::GetAtt' : ['ContactHandlerLambdaFunction', 'Arn'] }
-              }
-            ]
-          }
-        }
-      ],
-      // AWSLambdaBasicExecutionRole: allows logging to CloudWatch
-      ManagedPolicyArns : ['arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole']
-    }
-  }
- 
-  const signFunctionHandlerName = await determineLambdaFunctionName({
-    baseName : lambdaFunctionsBucketName + '-request-signer',
-    credentials,
-    siteTemplate
-  })
- 
-  finalTemplate.Resources.RequestSignerLogGroup = {
-    Type       : 'AWS::Logs::LogGroup',
-    Properties : {
-      LogGroupClass   : 'STANDARD', // TODO: support option for INFREQUENT_ACCESS
-      LogGroupName    : signFunctionHandlerName,
-      RetentionInDays : 180 // TODO: support options
-    }
-  }
- 
-  finalTemplate.Resources.SignRequestFunction = {
-    Type       : 'AWS::Lambda::Function',
-    DependsOn  : ['RequestSignerRole'],
-    Properties : {
-      FunctionName : signFunctionHandlerName,
-      Handler      : 'index.handler',
-      Role         : { 'Fn::GetAtt' : ['RequestSignerRole', 'Arn'] },
-      Runtime      : 'nodejs20.x',
-      MemorySize   : 128,
-      Timeout      : 5,
-      Code         : {
-        S3Bucket : lambdaFunctionsBucketName,
-        S3Key    : REQUEST_SIGNER_ZIP_NAME
-      },
-      LoggingConfig : {
-        ApplicationLogLevel : 'INFO', // support options
-        LogFormat           : 'JSON', // support options
-        LogGroup            : signFunctionHandlerName,
-        SystemLogLevel      : 'INFO' // support options
-      }
-    }
-  }
- 
-  finalTemplate.Resources.SignRequestFunctionVersion = {
-    Type       : 'AWS::Lambda::Version',
-    DependsOn  : ['SignRequestFunction'],
-    Properties : {
-      FunctionName : { 'Fn::GetAtt' : ['SignRequestFunction', 'Arn'] }
-    }
-  }
-}
- 
-export { setupRequestSigner }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs.html deleted file mode 100644 index 71b21292..00000000 --- a/qa/coverage/lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs.html +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - Code coverage report for lib/plugins/contact-handler/lib/stage-lambda-function-zip-files.mjs - - - - - - - - - -
-
-

All files / lib/plugins/contact-handler/lib stage-lambda-function-zip-files.mjs

-
- -
- 0% - Statements - 0/28 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/28 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { join as pathJoin } from 'node:path'
-import { createReadStream } from 'node:fs'
- 
-import { CreateBucketCommand, PutObjectCommand, S3Client } from '@aws-sdk/client-s3'
- 
-import { CONTACT_EMAILER_ZIP_NAME, CONTACT_HANDLER_ZIP_NAME, REQUEST_SIGNER_ZIP_NAME } from './constants'
-import { convertDomainToBucketName } from '../../../shared/convert-domain-to-bucket-name'
-import { determineBucketName } from '../../../shared/determine-bucket-name'
-// jsdoc wants this, but it causes a circular dependency
-// import { SiteTemplate } from '../../../shared/site-template'
- 
-/* eslint-disable  jsdoc/no-undefined-types */ // See note above re. SiteTemplate
-/**
- * Stages the zipped Lambda function packages on a common S3 bucket.
- * @param {object} input - Destructured input argument.
- * @param {boolean} input.enableEmail - True if the site is to be built with email on contact form submission support.
- * @param {object} input.siteInfo - See {@link SiteTemplate} for details.
- * @returns {string} The Lambda function bucket name.
- */ /* eslint-enable  jsdoc/no-undefined-types */
-const stageLambdaFunctionZipFiles = async ({ credentials, enableEmail, settings, siteInfo }) => {
-  process.stdout.write('Staging Lambda function zip files...\n')
- 
-  let { lambdaFunctionsBucket } = settings
-  const { apexDomain, region } = siteInfo
- 
-  const s3Client = new S3Client({ credentials, region })
- 
-  Iif (lambdaFunctionsBucket === undefined) {
-    lambdaFunctionsBucket = convertDomainToBucketName(apexDomain) + '-lambda-functions'
-    lambdaFunctionsBucket =
-      await determineBucketName({
-        bucketName : lambdaFunctionsBucket,
-        credentials,
-        findName   : true,
-        s3Client,
-        siteInfo
-      })
- 
-    const createBucketCommand = new CreateBucketCommand({
-      ACL    : 'private',
-      Bucket : lambdaFunctionsBucket
-    })
-    await s3Client.send(createBucketCommand)
-  }
-  settings.lambdaFunctionsBucket = lambdaFunctionsBucket
- 
-  const putCommands = [
-    putZipFile({ bucketName : lambdaFunctionsBucket, fileName : CONTACT_HANDLER_ZIP_NAME, s3Client }),
-    putZipFile({ bucketName : lambdaFunctionsBucket, fileName : REQUEST_SIGNER_ZIP_NAME, s3Client })
-  ]
- 
-  Iif (enableEmail === true) {
-    putCommands.push(putZipFile({
-      bucketName : lambdaFunctionsBucket,
-      fileName   : CONTACT_EMAILER_ZIP_NAME,
-      s3Client
-    }))
-  }
- 
-  await Promise.all(putCommands)
- 
-  return lambdaFunctionsBucket
-}
- 
-const putZipFile = async ({ bucketName, fileName, s3Client }) => {
-  // when built, everything sits in './dist' together
-  const zipPath = pathJoin(__dirname, fileName)
-  const readStream = createReadStream(zipPath)
- 
-  const putObjectCommand = new PutObjectCommand({
-    Body        : readStream,
-    Bucket      : bucketName,
-    Key         : fileName,
-    ContentType : 'application/zip'
-  })
- 
-  await s3Client.send(putObjectCommand)
-}
- 
-export { stageLambdaFunctionZipFiles }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs.html b/qa/coverage/lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs.html deleted file mode 100644 index d3971662..00000000 --- a/qa/coverage/lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - Code coverage report for lib/plugins/contact-handler/lib/update-cloud-front-distribution.mjs - - - - - - - - - -
-
-

All files / lib/plugins/contact-handler/lib update-cloud-front-distribution.mjs

-
- -
- 0% - Statements - 0/11 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
const updateCloudFrontDistribution = ({ settings, siteTemplate }) => {
-  const { finalTemplate } = siteTemplate
-  const contactHandlerPath = settings.path
- 
-  finalTemplate.Resources.SiteCloudFrontDistribution.DependsOn.push('ContactHandlerLambdaURL')
- 
-  const cfOrigins = finalTemplate.Resources.SiteCloudFrontDistribution.Properties.DistributionConfig.Origins
-  cfOrigins.push({
-    Id         : 'ContactHandlerLambdaOrigin',
-    DomainName : { // strip the https://
-      'Fn::Select' : [2, { 'Fn::Split' : ['/', { 'Fn::GetAtt' : ['ContactHandlerLambdaURL', 'FunctionUrl'] }] }]
-    },
-    CustomOriginConfig : {
-      HTTPSPort            : 443,
-      OriginProtocolPolicy : 'https-only'
-    }
-  })
- 
-  const cfCacheBehaviors = finalTemplate.Resources.SiteCloudFrontDistribution.Properties.DistributionConfig.CacheBehaviors || []
-  cfCacheBehaviors.push({
-    AllowedMethods             : ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT'],
-    CachePolicyId              : '4135ea2d-6df8-44a3-9df3-4b5a84be39ad', // caching disabled managed policy
-    PathPattern                : contactHandlerPath,
-    TargetOriginId             : 'ContactHandlerLambdaOrigin',
-    ViewerProtocolPolicy       : 'https-only',
-    LambdaFunctionAssociations : [
-      {
-        EventType         : 'origin-request',
-        IncludeBody       : true,
-        LambdaFunctionARN : {
-          'Fn::Join' : [':', [
-            { 'Fn::GetAtt' : ['SignRequestFunction', 'Arn'] },
-            { 'Fn::GetAtt' : ['SignRequestFunctionVersion', 'Version'] }]
-          ]
-        }
-      }
-    ]
-  })
- 
-  finalTemplate.Resources.SiteCloudFrontDistribution.Properties.DistributionConfig.CacheBehaviors = cfCacheBehaviors
-  finalTemplate.Resources.SiteCloudFrontDistribution.DependsOn.push('SignRequestFunctionVersion')
-}
- 
-export { updateCloudFrontDistribution }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/plugins/index.html b/qa/coverage/lib/plugins/index.html deleted file mode 100644 index e337acf3..00000000 --- a/qa/coverage/lib/plugins/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for lib/plugins - - - - - - - - - -
-
-

All files lib/plugins

-
- -
- 0% - Statements - 0/14 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/5 -
- - -
- 0% - Lines - 0/14 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
access-logs.mjs -
-
0%0/5100%0/00%0/20%0/5
cloudfront-logs.mjs -
-
0%0/9100%0/00%0/30%0/9
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/shared/convert-domain-to-bucket-name.js.html b/qa/coverage/lib/shared/convert-domain-to-bucket-name.js.html deleted file mode 100644 index 67f3ed90..00000000 --- a/qa/coverage/lib/shared/convert-domain-to-bucket-name.js.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - Code coverage report for lib/shared/convert-domain-to-bucket-name.js - - - - - - - - - -
-
-

All files / lib/shared convert-domain-to-bucket-name.js

-
- -
- 0% - Statements - 0/3 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4  -  -  - 
const convertDomainToBucketName = (domain) => domain.replaceAll(/\./g, '-').replaceAll(/[^a-z0-9-]/g, 'x')
- 
-export { convertDomainToBucketName }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/shared/determine-bucket-name.mjs.html b/qa/coverage/lib/shared/determine-bucket-name.mjs.html deleted file mode 100644 index a03c2bb2..00000000 --- a/qa/coverage/lib/shared/determine-bucket-name.mjs.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - Code coverage report for lib/shared/determine-bucket-name.mjs - - - - - - - - - -
-
-

All files / lib/shared determine-bucket-name.mjs

-
- -
- 0% - Statements - 0/36 -
- - -
- 0% - Branches - 0/13 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/36 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { v4 as uuidv4 } from 'uuid'
- 
-import { S3Client, HeadBucketCommand } from '@aws-sdk/client-s3'
-import { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts'
- 
-import { convertDomainToBucketName } from './convert-domain-to-bucket-name'
-import { progressLogger } from './progress-logger'
- 
-const determineBucketName = async (args) => {
-  const { apexDomain, credentials, findName = false, siteInfo } = args
-  let { bucketName, s3Client } = args
- 
-  Iif (bucketName === undefined) {
-    bucketName = siteInfo.bucketName || convertDomainToBucketName(apexDomain)
-  }
- 
-  let { accountID } = siteInfo
-  Iif (accountID === undefined) {
-    progressLogger.write('Getting effective account ID...\n')
-    const response = await new STSClient({ credentials }).send(new GetCallerIdentityCommand({}))
-    accountID = response.Account
-    siteInfo.accountID = accountID
-  }
- 
-  s3Client = s3Client || new S3Client({ credentials })
- 
-  while (true) {
-    progressLogger.write(`Checking bucket '${bucketName}' is free... `)
- 
-    const input = { Bucket : bucketName, ExpectedBucketOwner : accountID }
- 
-    const command = new HeadBucketCommand(input)
-    try {
-      await s3Client.send(command)
-      Iif (findName !== true) {
-        throw new Error(`Account already owns bucket '${bucketName}'; delete or specify alternate bucket name.`)
-      }
-    } catch (e) {
-      if (e.name === 'NotFound') {
-        progressLogger.write('FREE\n')
-        return bucketName
-      } else Iif (findName !== true || e.name === 'CredentialsProviderError') {
-        progressLogger.write('\n')
-        throw e
-      }
-    }
-    progressLogger.write('NOT free\n')
-    const bucketSalt = uuidv4().slice(0, 8)
-    bucketName = bucketName.replace(/-[A-F0-9]{8}$/i, '')
-    bucketName += '-' + bucketSalt
-  }
-}
- 
-export { determineBucketName }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/shared/determine-oac-name.mjs.html b/qa/coverage/lib/shared/determine-oac-name.mjs.html deleted file mode 100644 index 52ccb633..00000000 --- a/qa/coverage/lib/shared/determine-oac-name.mjs.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - Code coverage report for lib/shared/determine-oac-name.mjs - - - - - - - - - -
-
-

All files / lib/shared determine-oac-name.mjs

-
- -
- 0% - Statements - 0/29 -
- - -
- 0% - Branches - 0/12 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/28 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { v4 as uuidv4 } from 'uuid'
- 
-import { CloudFrontClient, ListOriginAccessControlsCommand } from '@aws-sdk/client-cloudfront'
- 
-import { progressLogger } from './progress-logger'
- 
-const determineOACName = async ({ baseName, credentials, siteInfo }) => {
-  const { region } = siteInfo
-  let currentName = baseName
- 
-  // there is on way to get an OAC based on teh name alone, you need the ID (ARN?) which we don't have. So, we have to
-  // list the OACs and search for one with the given name
-  const allOACNames = await getAllOACNames({ credentials, region })
- 
-  while (true) {
-    progressLogger?.write(`Checking if OAC name '${currentName}' is free... `)
-    if (allOACNames.includes(currentName)) {
-      progressLogger?.write('NOT free\n')
-      const nameSalt = uuidv4().slice(0, 8)
-      currentName = currentName.replace(/-[A-F0-9]{8}$/i, '')
-      currentName += '-' + nameSalt
-    } else {
-      progressLogger?.write('FREE\n')
-      return currentName
-    }
-  }
-}
- 
-const getAllOACNames = async ({ credentials, region }) => {
-  const cloudfrontClient = new CloudFrontClient({ credentials, region })
-  let currentMarker
-  const result = []
-  while (true) {
-    const listOACCommand = new ListOriginAccessControlsCommand({
-      Marker : currentMarker
-    })
- 
-    const oacListResponse = await cloudfrontClient.send(listOACCommand)
-    const items = oacListResponse.OriginAccessControlList.Items
- 
-    result.push(...items.map(({ Name : name }) => name))
- 
-    currentMarker = oacListResponse.OriginAccessControlList.NextMarker
-    Iif (currentMarker === undefined) {
-      return result
-    }
-  }
-}
- 
-export { determineOACName }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/shared/index.html b/qa/coverage/lib/shared/index.html deleted file mode 100644 index e641b1bb..00000000 --- a/qa/coverage/lib/shared/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for lib/shared - - - - - - - - - -
-
-

All files lib/shared

-
- -
- 0% - Statements - 0/120 -
- - -
- 0% - Branches - 0/36 -
- - -
- 0% - Functions - 0/13 -
- - -
- 0% - Lines - 0/116 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
convert-domain-to-bucket-name.js -
-
0%0/3100%0/00%0/10%0/1
determine-bucket-name.mjs -
-
0%0/360%0/130%0/10%0/36
determine-oac-name.mjs -
-
0%0/290%0/120%0/30%0/28
progress-logger.mjs -
-
0%0/1100%0/0100%0/00%0/1
site-template.mjs -
-
0%0/510%0/110%0/80%0/50
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/shared/progress-logger.mjs.html b/qa/coverage/lib/shared/progress-logger.mjs.html deleted file mode 100644 index 667ea4eb..00000000 --- a/qa/coverage/lib/shared/progress-logger.mjs.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - Code coverage report for lib/shared/progress-logger.mjs - - - - - - - - - -
-
-

All files / lib/shared progress-logger.mjs

-
- -
- 0% - Statements - 0/1 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4  -  -  - 
const progressLogger = process.stdout
- 
-export { progressLogger }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/lib/shared/site-template.mjs.html b/qa/coverage/lib/shared/site-template.mjs.html deleted file mode 100644 index 709dd393..00000000 --- a/qa/coverage/lib/shared/site-template.mjs.html +++ /dev/null @@ -1,802 +0,0 @@ - - - - - - Code coverage report for lib/shared/site-template.mjs - - - - - - - - - -
-
-

All files / lib/shared site-template.mjs

-
- -
- 0% - Statements - 0/51 -
- - -
- 0% - Branches - 0/11 -
- - -
- 0% - Functions - 0/8 -
- - -
- 0% - Lines - 0/50 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import yaml from 'js-yaml'
- 
-import { S3Client, DeleteBucketCommand } from '@aws-sdk/client-s3'
- 
-import { determineBucketName } from './determine-bucket-name'
-import { determineOACName } from './determine-oac-name'
-import * as plugins from '../plugins'
-import { progressLogger } from './progress-logger'I
- 
-/**
- * Class encapsulating site stack configuration. Any enabled plugins are loaded and processed by this class.
- * @class
- */
-const SiteTemplate = class {
-  /* eslint-disable jsdoc/check-param-names */ // eslint doesn't believe our 2nd level destructure documentation
-  /**
-   * Creates a new {@link SiteTemplate}.
-   * @param {object} input - Destructured input argument.
-   * @param {object} input.credentials - credentials for AWS SDK clients.
-   * @param {object} input.siteInfo - Collection of site related data elements.
-   * @param {string} input.siteInfo.apexDomain - the sites apex domain
-   * @param {string} input.siteInfo.sourcePath - the path to the site's static source files, may be absolute or CWD
-   *   relative
-   * @param {string} input.siteInfo.region - the region of the site
-   * @param {string} input.siteInfo.certificateArn {string} - the AWS ARN for the site's SSL certificate
-   * @param {string} input.siteInfo.accountID - the ID of the account under which the stack resides (not ARN)
-   * @param {string} input.siteInfo.bucketName - the name of the bucket where the site's static files are stored
-   * @param {string} input.siteInfo.stackName - the name of the stack
-   * @param {string} input.siteInfo.stackArn - the stack's ARN
-   * @param {string} input.siteInfo.cloudFrontDistributionID - the stack's CloudfFront ID (not ARN)
-   * @param {object} input.siteInfo.pluginSettings - collection of plugin settings; settings are grouped/keyed by the
-   *   plugin's name; setting values are dependent on the plugin
-   * @param credentials.siteInfo
-   */ /* eslint-enable jsdoc/check-param-names */
-  constructor ({ credentials, siteInfo }) {
-    this.siteInfo = siteInfo
-    this.credentials = credentials
- 
-    this.resourceTypes = { 'CloudFormation::Distribution' : true, 'S3::Bucket' : true }
-    this.finalTemplate = this.baseTemplate
-  }
- 
-  async initializeTemplate () {
-    const { accountID, apexDomain, bucketName, certificateArn, region } = this.siteInfo
- 
-    const oacName = await determineOACName({
-      baseName    : `${bucketName}-OAC`,
-      credentials : this.credentials,
-      siteInfo    : this.siteInfo
-    })
- 
-    this.finalTemplate = {
-      Resources : {
-        SiteS3Bucket : {
-          Type       : 'AWS::S3::Bucket',
-          Properties : {
-            AccessControl : 'Private',
-            BucketName    : bucketName
-          }
-        },
-        SiteCloudFrontOriginAccessControl : {
-          Type       : 'AWS::CloudFront::OriginAccessControl',
-          Properties : {
-            OriginAccessControlConfig : {
-              Description                   : 'Origin Access Control (OAC) allowing CloudFront Distribution to access site S3 bucket.',
-              Name                          : oacName,
-              OriginAccessControlOriginType : 's3',
-              SigningBehavior               : 'always',
-              SigningProtocol               : 'sigv4'
-            }
-          }
-        },
-        SiteCloudFrontDistribution : {
-          Type       : 'AWS::CloudFront::Distribution',
-          DependsOn  : ['SiteS3Bucket'],
-          Properties : {
-            DistributionConfig : {
-              Origins : [
-                {
-                  DomainName     : `${bucketName}.s3.${region}.amazonaws.com`,
-                  Id             : 'static-hosting',
-                  S3OriginConfig : {
-                    OriginAccessIdentity : ''
-                  },
-                  OriginAccessControlId : { 'Fn::GetAtt' : ['SiteCloudFrontOriginAccessControl', 'Id'] }
-                }
-              ],
-              Enabled              : true,
-              DefaultRootObject    : 'index.html',
-              CustomErrorResponses : [
-                { ErrorCode : 403, ResponseCode : 200, ResponsePagePath : '/index.html' },
-                { ErrorCode : 404, ResponseCode : 200, ResponsePagePath : '/index.html' }
-              ],
-              HttpVersion       : 'http2',
-              Aliases           : [apexDomain, `www.${apexDomain}`],
-              ViewerCertificate : {
-                AcmCertificateArn      : certificateArn,
-                MinimumProtocolVersion : 'TLSv1.2_2021',
-                SslSupportMethod       : 'sni-only'
-              },
-              DefaultCacheBehavior : {
-                AllowedMethods       : ['GET', 'HEAD'],
-                CachePolicyId        : '658327ea-f89d-4fab-a63d-7e88639e58f6', // CachingOptimized cache policy ID
-                Compress             : true,
-                TargetOriginId       : 'static-hosting',
-                ViewerProtocolPolicy : 'redirect-to-https'
-              }
-            }
-          }
-        }, // SiteCloudFrontDistribution
-        SiteBucketPolicy : {
-          Type       : 'AWS::S3::BucketPolicy',
-          DependsOn  : ['SiteS3Bucket', 'SiteCloudFrontDistribution'],
-          Properties : {
-            Bucket         : bucketName,
-            PolicyDocument : {
-              Version   : '2012-10-17',
-              Statement : [
-                {
-                  Effect    : 'Allow',
-                  Principal : {
-                    Service : 'cloudfront.amazonaws.com'
-                  },
-                  Action    : 's3:GetObject',
-                  Resource  : `arn:aws:s3:::${bucketName}/*`,
-                  Condition : {
-                    StringEquals : {
-                      'AWS:SourceArn' : {
-                        'Fn::Join' : ['', [`arn:aws:cloudfront::${accountID}:distribution/`, { 'Fn::GetAtt' : ['SiteCloudFrontDistribution', 'Id'] }]]
-                      }
-                    }
-                  }
-                }
-              ]
-            }
-          }
-        }
-      }, // Resources
-      Outputs : {
-        SiteS3Bucket : {
-          Value : { Ref : 'SiteS3Bucket' }
-        },
-        SiteCloudFrontOriginAccessControl : {
-          Value : { Ref : 'SiteCloudFrontOriginAccessControl' }
-        },
-        SiteCloudFrontDistribution : {
-          Value : { Ref : 'SiteCloudFrontDistribution' }
-        }
-      }
-    }
-  }
- 
-  async destroySharedLoggingBucket () {
-    const { siteInfo } = this
-    const { sharedLoggingBucket } = siteInfo
- 
-    progressLogger.write('Deleting shared logging bucket...\n')
-    const s3Client = new S3Client({ credentials : this.credentials })
-    const deleteBucketCommand = new DeleteBucketCommand({ Bucket : sharedLoggingBucket })
-    await s3Client.send(deleteBucketCommand)
-    delete siteInfo.sharedLoggingBucket
-  }
- 
-  async enableSharedLoggingBucket () {
-    const { bucketName } = this.siteInfo // used to create a name for the shared logging bucket
-    let { sharedLoggingBucket = bucketName + '-common-logs' } = this.siteInfo
- 
-    Iif (sharedLoggingBucket === undefined) {
-      sharedLoggingBucket = await determineBucketName({
-        bucketName  : sharedLoggingBucket,
-        credentials : this.credentials,
-        findName    : true,
-        siteInfo    : this.siteInfo
-      })
-    }
-    this.siteInfo.sharedLoggingBucket = sharedLoggingBucket
- 
-    this.finalTemplate.Resources.SharedLoggingBucket = {
-      Type       : 'AWS::S3::Bucket',
-      Properties : {
-        AccessControl     : 'Private',
-        BucketName        : sharedLoggingBucket,
-        OwnershipControls : { // this enables ACLs, as required by CloudFront standard logging
-          Rules : [{ ObjectOwnership : 'BucketOwnerPreferred' }]
-        }
-      }
-    }
- 
-    return sharedLoggingBucket
-  }
- 
-  async destroyPlugins () {
-    const { siteInfo } = this
-    const { apexDomain, pluginSettings } = siteInfo
- 
-    for (const [pluginKey, settings] of Object.entries(pluginSettings)) {
-      const plugin = plugins[pluginKey]
-      Iif (plugin === undefined) {
-        throw new Error(`Unknown plugin found in '${apexDomain}' plugin settings.`)
-      }
- 
-      const { preStackDestroyHandler } = plugin
-      Iif (preStackDestroyHandler !== undefined) {
-        await preStackDestroyHandler({ siteTemplate : this, settings })
-      }
-    }
-  }
- 
-  async loadPlugins () {
-    const { siteInfo } = this
-    const { apexDomain, pluginSettings } = siteInfo
- 
-    for (const [pluginKey, settings] of Object.entries(pluginSettings)) {
-      const plugin = plugins[pluginKey]
-      Iif (plugin === undefined) {
-        throw new Error(`Unknown plugin found in '${apexDomain}' plugin settings.`)
-      }
- 
-      await plugin.stackConfig({ siteTemplate : this, settings })
-    }
-  }
- 
-  render () {
-    const { apexDomain } = this.siteInfo
-    const resourceTypes = Object.keys(this.resourceTypes).sort()
- 
-    const outputTemplate = Object.assign({
-      AWSTemplateFormatVersion : '2010-09-09',
-      Description              : `${apexDomain} site built with ${resourceTypes.slice(0, -1).join(', ')} and ${resourceTypes[resourceTypes.length - 1]}.`
-    },
-    this.finalTemplate
-    )
- 
-    const output = yaml.dump(outputTemplate, { lineWidth : 0 })
-    return output
-  }
-}
- 
-export { SiteTemplate }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/prettify.css b/qa/coverage/prettify.css deleted file mode 100644 index b317a7cd..00000000 --- a/qa/coverage/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/qa/coverage/prettify.js b/qa/coverage/prettify.js deleted file mode 100644 index b3225238..00000000 --- a/qa/coverage/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/qa/coverage/sort-arrow-sprite.png b/qa/coverage/sort-arrow-sprite.png deleted file mode 100644 index 6ed68316eb3f65dec9063332d2f69bf3093bbfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc diff --git a/qa/coverage/sorter.js b/qa/coverage/sorter.js deleted file mode 100644 index 2bb296a8..00000000 --- a/qa/coverage/sorter.js +++ /dev/null @@ -1,196 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - if ( - row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()) - ) { - row.style.display = ''; - } else { - row.style.display = 'none'; - } - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/qa/lint.txt b/qa/lint.txt deleted file mode 100644 index 3e741dd3..00000000 --- a/qa/lint.txt +++ /dev/null @@ -1 +0,0 @@ -Test git rev: 449e467f0a8c5e0bddf9d1e01dc351e5a20665ff diff --git a/qa/unit-test.txt b/qa/unit-test.txt deleted file mode 100644 index 66a79531..00000000 --- a/qa/unit-test.txt +++ /dev/null @@ -1,67 +0,0 @@ -Test git rev: 449e467f0a8c5e0bddf9d1e01dc351e5a20665ff -PASS cli/lib/configuration/test/handle-configuration-show.test.js - handleConfigurationShow - ✓ prints the file contents (2 ms) - ---------------------------------------|---------|----------|---------|---------|------------------- -File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ---------------------------------------|---------|----------|---------|---------|------------------- -All files | 1.47 | 3.2 | 2.97 | 1.33 | - cli | 8.53 | 17.64 | 25 | 8.45 | - cloudsite.mjs | 0 | 0 | 0 | 0 | 1-101 - constants.mjs | 100 | 100 | 100 | 100 | - cli/lib | 0 | 0 | 0 | 0 | - error-out.mjs | 0 | 100 | 0 | 0 | 1-4 - format-output.mjs | 0 | 0 | 0 | 0 | 1-15 - get-site-info.mjs | 0 | 0 | 0 | 0 | 1-14 - get-value-container-and-key.mjs | 0 | 0 | 0 | 0 | 1-38 - handle-configuration.mjs | 0 | 0 | 0 | 0 | 1-21 - handle-create.mjs | 0 | 0 | 0 | 0 | 1-68 - handle-destroy.mjs | 0 | 0 | 0 | 0 | 1-26 - handle-detail.mjs | 0 | 0 | 0 | 0 | 1-21 - handle-get-iam-policy.mjs | 0 | 0 | 0 | 0 | 1-108 - handle-list.mjs | 0 | 0 | 0 | 0 | 1-23 - handle-plugin-settings.mjs | 0 | 0 | 0 | 0 | 1-54 - handle-update.mjs | 0 | 100 | 0 | 0 | 1-20 - handle-verify.mjs | 0 | 0 | 0 | 0 | 1-27 - options.mjs | 0 | 0 | 0 | 0 | 1-36 - smart-convert.mjs | 0 | 0 | 0 | 0 | 1-20 - cli/lib/configuration | 32 | 50 | 40 | 31.81 | - handle-configuration-initialize.mjs | 0 | 0 | 0 | 0 | 1-30 - handle-configuration-show.mjs | 100 | 100 | 100 | 100 | - lib/actions | 0 | 0 | 0 | 0 | - create.mjs | 0 | 0 | 0 | 0 | 1-155 - destroy.mjs | 0 | 0 | 0 | 0 | 1-59 - update.mjs | 0 | 0 | 0 | 0 | 1-50 - verify.mjs | 0 | 0 | 0 | 0 | 1-178 - lib/actions/lib | 0 | 0 | 0 | 0 | - create-or-update-dns-records.mjs | 0 | 0 | 0 | 0 | 1-51 - get-credentials.mjs | 0 | 0 | 0 | 0 | 1-26 - sync-site-content.mjs | 0 | 0 | 0 | 0 | 1-32 - track-stack-status.mjs | 0 | 0 | 0 | 0 | 1-40 - update-site-info.mjs | 0 | 100 | 0 | 0 | 1-13 - update-stack.mjs | 0 | 0 | 0 | 0 | 1-59 - lib/plugins | 0 | 100 | 0 | 0 | - access-logs.mjs | 0 | 100 | 0 | 0 | 1-9 - cloudfront-logs.mjs | 0 | 100 | 0 | 0 | 1-23 - lib/plugins/contact-handler/lib | 0 | 0 | 0 | 0 | - constants.mjs | 0 | 100 | 100 | 0 | 1-3 - determine-lambda-function-name.mjs | 0 | 0 | 0 | 0 | 1-32 - setup-contact-emailer.mjs | 0 | 0 | 0 | 0 | 1-116 - setup-contact-form-table.mjs | 0 | 100 | 0 | 0 | 1-23 - setup-contact-handler.mjs | 0 | 100 | 0 | 0 | 1-121 - setup-request-signer.mjs | 0 | 100 | 0 | 0 | 1-87 - stage-lambda-function-zip-files.mjs | 0 | 0 | 0 | 0 | 1-77 - update-cloud-front-distribution.mjs | 0 | 0 | 0 | 0 | 1-42 - lib/shared | 0 | 0 | 0 | 0 | - convert-domain-to-bucket-name.js | 0 | 100 | 0 | 0 | 1 - determine-bucket-name.mjs | 0 | 0 | 0 | 0 | 1-52 - determine-oac-name.mjs | 0 | 0 | 0 | 0 | 1-45 - progress-logger.mjs | 0 | 100 | 100 | 0 | 1 - site-template.mjs | 0 | 0 | 0 | 0 | 1-237 ---------------------------------------|---------|----------|---------|---------|------------------- -Test Suites: 1 passed, 1 total -Tests: 1 passed, 1 total -Snapshots: 0 total -Time: 0.968 s, estimated 1 s -Ran all test suites.