From 0abce2f1d612f83caac4f5333ff4501ae0663dbd Mon Sep 17 00:00:00 2001 From: Cole Peters Date: Fri, 3 May 2024 11:12:35 -0500 Subject: [PATCH] Add landing page (#747) * Add landing page, temp at /landing * Clean up; set ecmaVersion to permit top level await * Cleanup * Add missing meta * Fix typo --- .gitignore | 2 + app.arc | 6 + package-lock.json | 137 +- package.json | 4 + public/css/landing-syntax.min.css | 1 + public/css/styles.css | 10 +- .../fonts/montserrat-italic-subset-var.woff2 | Bin 0 -> 51764 bytes public/fonts/montserrat-subset-var.woff2 | Bin 0 -> 49140 bytes public/landing/begin-logo.svg | 1 + public/landing/openjs-foundation-logo.svg | 1 + src/http/get-landing/index.mjs | 101 ++ src/landing/elements.mjs | 27 + src/landing/elements/arc-attribution.mjs | 23 + src/landing/elements/arc-button-divider.mjs | 19 + src/landing/elements/arc-container.mjs | 19 + src/landing/elements/arc-graphic.mjs | 598 +++++++ src/landing/elements/arc-landing.mjs | 58 + src/landing/elements/arc-link-button.mjs | 28 + src/landing/elements/arc-logo.mjs | 5 + src/landing/elements/arc-terminal.mjs | 48 + src/landing/elements/foot-er.mjs | 20 + src/landing/elements/manifest-examples.mjs | 98 ++ src/landing/elements/seamless-development.mjs | 74 + src/landing/elements/why-architect.mjs | 32 + src/landing/support/arc-codes.mjs | 605 +++++++ src/landing/support/hello-world.mjs | 376 +++++ src/landing/support/kitchen-sink.mjs | 1421 +++++++++++++++++ src/landing/support/render-examples.mjs | 44 + theme.json | 37 + 29 files changed, 3788 insertions(+), 7 deletions(-) create mode 100644 public/css/landing-syntax.min.css create mode 100644 public/fonts/montserrat-italic-subset-var.woff2 create mode 100644 public/fonts/montserrat-subset-var.woff2 create mode 100755 public/landing/begin-logo.svg create mode 100644 public/landing/openjs-foundation-logo.svg create mode 100644 src/http/get-landing/index.mjs create mode 100644 src/landing/elements.mjs create mode 100644 src/landing/elements/arc-attribution.mjs create mode 100644 src/landing/elements/arc-button-divider.mjs create mode 100644 src/landing/elements/arc-container.mjs create mode 100644 src/landing/elements/arc-graphic.mjs create mode 100644 src/landing/elements/arc-landing.mjs create mode 100644 src/landing/elements/arc-link-button.mjs create mode 100644 src/landing/elements/arc-logo.mjs create mode 100644 src/landing/elements/arc-terminal.mjs create mode 100644 src/landing/elements/foot-er.mjs create mode 100644 src/landing/elements/manifest-examples.mjs create mode 100644 src/landing/elements/seamless-development.mjs create mode 100644 src/landing/elements/why-architect.mjs create mode 100644 src/landing/support/arc-codes.mjs create mode 100644 src/landing/support/hello-world.mjs create mode 100644 src/landing/support/kitchen-sink.mjs create mode 100644 src/landing/support/render-examples.mjs create mode 100644 theme.json diff --git a/.gitignore b/.gitignore index 05a46442..8d4f5e51 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ sam.yaml public/static.json **/static.json src/http/get-docs-000lang-catchall/highlight/ +.enhance +src/shared/enhance-styles diff --git a/app.arc b/app.arc index 9678ea71..f85a98eb 100644 --- a/app.arc +++ b/app.arc @@ -12,7 +12,13 @@ fingerprint true get /docs/:lang/* get /api/package any /* +get /landing @plugins spellcheck architect/plugin-node-prune +enhance/ssr +enhance/arc-plugin-styles + +@enhance-styles +config theme.json diff --git a/package-lock.json b/package-lock.json index 7f80705e..52c95fb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,9 @@ "@architect/inventory": "^4.0.4", "@architect/package": "^9.0.2", "@architect/plugin-node-prune": "^2.0.2", + "@enhance/arc-plugin-styles": "^5.0.6", + "@enhance/enhance-style-transform": "^0.1.2", + "@enhance/ssr": "^4.0.1", "arcdown": "^2.3.0", "slugify": "^1.6.6" }, @@ -564,6 +567,67 @@ "integrity": "sha512-w+U9klEtRkt7hyW/f+/SvwPgJ4CTMO2ENddisX9dGgLUZKu+iKpb/IhYnQWIt9/Nnm/5DkApmiHGimPs621wwA==", "dev": true }, + "node_modules/@begin/parse5": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@begin/parse5/-/parse5-0.0.4.tgz", + "integrity": "sha512-1H5S1AcFqpQfBMG0z4z7URFb5jWCrILIH9MkXSmTsyYd4hj4kgJnpXHGELJE9HnXH1maI/WfHi5j+udDVkvZ9g==", + "dependencies": { + "parse5": "^7.0.0" + } + }, + "node_modules/@enhance/arc-plugin-styles": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@enhance/arc-plugin-styles/-/arc-plugin-styles-5.0.6.tgz", + "integrity": "sha512-LHTUDlz1KxcvB1ZZ2azLdixkCnxcAyYfS6XhUnzP+Nr3au331T75q4k73liCbPOaS0TEtYRPylcSGJwMTVH6HQ==", + "dependencies": { + "@architect/functions": "^8.0.4", + "@enhance/styles": "^6.4.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@enhance/css-parser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@enhance/css-parser/-/css-parser-1.0.0.tgz", + "integrity": "sha512-DG18Jwxvf0WvUtA8VEA+axaIq0aoJzGTd25kdeLDPQcNnq3bWG+TUMPi8oa4btVXwHVyCR7Xsy0jW80m1ZwPow==", + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/@enhance/enhance-style-transform": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@enhance/enhance-style-transform/-/enhance-style-transform-0.1.2.tgz", + "integrity": "sha512-Hx/c5PfJl4XYToZaKL0b3o54rq4JX5zKD6Z+Pz6BSygnX0xOOHdWriaXxFKDUl1X/VVVlJM3FWjYj93/a7WSPg==", + "dependencies": { + "@enhance/css-parser": "^1.0.0" + } + }, + "node_modules/@enhance/ssr": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@enhance/ssr/-/ssr-4.0.1.tgz", + "integrity": "sha512-o1zWY3gann4+iBimyxhuRDUCrUltajrq7TdzYTv2vQ0/w5klmhtZ7hr6Uhu3/SZU61A5H5PdgbXT6JpK4yOodQ==", + "dependencies": { + "@begin/parse5": "^0.0.4", + "nanoid": "^4.0.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@enhance/styles": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@enhance/styles/-/styles-6.4.0.tgz", + "integrity": "sha512-Op/QqOIwJ4d5MqPPGUKdlerz+zgrmA7Id8Yy1+auAHyBa/GStzqqKveN4ui18xpt7OI//zoLNlr4Apw2XyHu7g==", + "dependencies": { + "color-to-hsla": "^0.1.1" + }, + "bin": { + "enhance-styles": "cli.mjs" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -1228,6 +1292,17 @@ "lodash": "^4.17.14" } }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", @@ -1548,6 +1623,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-to-hsla": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/color-to-hsla/-/color-to-hsla-0.1.1.tgz", + "integrity": "sha512-lXqaKMk8lY5R9PK0R/fqSZygEKLIJvBrLc20Y/7CpPdoKe5pNvJQYs2olo5BbuJK9gOVr6za4mndjZHHVLZvEg==" + }, "node_modules/command-line-args": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", @@ -1829,6 +1909,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -3639,8 +3727,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "4.1.2", @@ -5483,6 +5570,23 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, "node_modules/napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", @@ -5907,6 +6011,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -7208,6 +7323,24 @@ "node": ">=8.0.0" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, "node_modules/spellchecker-cli": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-6.2.0.tgz", diff --git a/package.json b/package.json index 5a72faa7..b98d93e6 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,9 @@ "@architect/inventory": "^4.0.4", "@architect/package": "^9.0.2", "@architect/plugin-node-prune": "^2.0.2", + "@enhance/arc-plugin-styles": "^5.0.6", + "@enhance/enhance-style-transform": "^0.1.2", + "@enhance/ssr": "^4.0.1", "arcdown": "^2.3.0", "slugify": "^1.6.6" }, @@ -40,6 +43,7 @@ }, "eslintConfig": { "parserOptions": { + "ecmaVersion": "2022", "sourceType": "module" }, "extends": "@architect/eslint-config", diff --git a/public/css/landing-syntax.min.css b/public/css/landing-syntax.min.css new file mode 100644 index 00000000..fecf8171 --- /dev/null +++ b/public/css/landing-syntax.min.css @@ -0,0 +1 @@ +.hljs{color:#2a2c2d;background:#e6e6e6}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.hljs-comment,.hljs-quote{color:#676b79;font-style:italic}.hljs-params{color:#676b79}.hljs-attr,.hljs-punctuation{color:#2a2c2d}.hljs-char.escape_,.hljs-meta,.hljs-name,.hljs-operator,.hljs-selector-tag{color:#c56200}.hljs-deletion,.hljs-keyword{color:#d92792}.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-variable.language_{color:#cc5e91}.hljs-code,.hljs-formula,.hljs-property,.hljs-section,.hljs-subst,.hljs-title.function_{color:#3787c7}.hljs-addition,.hljs-bullet,.hljs-meta .hljs-string,.hljs-selector-class,.hljs-string,.hljs-symbol,.hljs-title.class_,.hljs-title.class_.inherited__{color:#0d7d6c}.hljs-attribute,.hljs-built_in,.hljs-doctag,.hljs-link,.hljs-literal,.hljs-meta .hljs-keyword,.hljs-number,.hljs-selector-id,.hljs-tag,.hljs-template-tag,.hljs-template-variable,.hljs-title,.hljs-type,.hljs-variable{color:#7641bb} diff --git a/public/css/styles.css b/public/css/styles.css index dcb6b3eb..ccd2e1a3 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -2,7 +2,7 @@ /* VARIABLES */ :root { --p0:#2CDD93;/* clover green */ - --p1:#2B7D9A;/* blue green */ + --p1:#365c91;/* Arc blue */ --p2:#BBFFAA;/* key lime */ --p3:#E21893;/* Barbie Pink light */ --g0:#FBFBFB;/* #FBFBFB */ @@ -23,14 +23,14 @@ --a2:#1D5266;/* #8E8E8E */ --d0:#797979;/* #797979 */ --d1:#636363;/* #636363 */ - --text-color: #222;/* #222 */ + --text-color: #45413a;/* #45413a */ --bkg-color: #FFF;/* #FFF */ } :root[data-theme="dark"] { --p0:#6EE8B5;/* #6EE8B5 */ - --p1:#46A9CB;/* #46A9CB */ + --p1:#1496fa;/* #1496fa */ --p2:#E4FFDD;/* #E4FFDD */ --p3:#ED59B3;/* #ED59B3 */ --g0:#222222;/* #222222 */ @@ -84,7 +84,7 @@ } :root[data-theme="light"] { --p0:#2CDD93;/* clover green */ - --p1:#2B7D9A;/* blue green */ + --p1:#365c91;/* blue green */ --p2:#BBFFAA;/* key lime */ --p3:#E21893;/* Barbie Pink light */ --g0:#FBFBFB;/* #FBFBFB */ @@ -105,7 +105,7 @@ --a2:#1D5266;/* #8E8E8E */ --d0:#797979;/* #797979 */ --d1:#636363;/* #636363 */ - --text-color: #222;/* #222 */ + --text-color: #45413a;/* #45413a */ --bkg-color: #FFF;/* #FFF */ } } diff --git a/public/fonts/montserrat-italic-subset-var.woff2 b/public/fonts/montserrat-italic-subset-var.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..06b48dd3db0093da45c4166abaccd740164f5216 GIT binary patch literal 51764 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

JF)g8qYatuz2~UYaa1xqB=$bttwbo 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 literal 0 HcmV?d00001 diff --git a/public/fonts/montserrat-subset-var.woff2 b/public/fonts/montserrat-subset-var.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d3d02d97c2fb3b464054b7227d28c709df64ccf1 GIT binary patch literal 49140 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 U)*L0qje&2-x*P=i=z2fq3V*CAJOBUy literal 0 HcmV?d00001 diff --git a/public/landing/begin-logo.svg b/public/landing/begin-logo.svg new file mode 100755 index 00000000..e56717d4 --- /dev/null +++ b/public/landing/begin-logo.svg @@ -0,0 +1 @@ + diff --git a/public/landing/openjs-foundation-logo.svg b/public/landing/openjs-foundation-logo.svg new file mode 100644 index 00000000..47a0f319 --- /dev/null +++ b/public/landing/openjs-foundation-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/http/get-landing/index.mjs b/src/http/get-landing/index.mjs new file mode 100644 index 00000000..7fd0c629 --- /dev/null +++ b/src/http/get-landing/index.mjs @@ -0,0 +1,101 @@ +import arc from '@architect/functions' +import enhance from '@enhance/ssr' +import styleTransform from '@enhance/enhance-style-transform' +import { getStyles } from '@enhance/arc-plugin-styles' + +import elements from '../../landing/elements.mjs' + +export async function handler () { + const html = enhance({ + styleTransforms: [ styleTransform ], + elements, + }) + + return { + statusCode: 200, + headers: { + 'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0', + 'content-type': 'text/html; charset=utf8' + }, + body: html` + + + + + + + + + + + + + + + + + + + + + + + + Architect + + ${getStyles.styleTag()} + + + + + + + + +` + } +} diff --git a/src/landing/elements.mjs b/src/landing/elements.mjs new file mode 100644 index 00000000..6aa4b3de --- /dev/null +++ b/src/landing/elements.mjs @@ -0,0 +1,27 @@ +import ArcAttribution from './elements/arc-attribution.mjs' +import ArcButtonDivider from './elements/arc-button-divider.mjs' +import ArcContainer from './elements/arc-container.mjs' +import ArcGraphic from './elements/arc-graphic.mjs' +import ArcLanding from './elements/arc-landing.mjs' +import ArcLinkButton from './elements/arc-link-button.mjs' +import ArcLogo from './elements/arc-logo.mjs' +import ArcTerminal from './elements/arc-terminal.mjs' +import Footer from './elements/foot-er.mjs' +import ManifestExamples from './elements/manifest-examples.mjs' +import SeamlessDevelopment from './elements/seamless-development.mjs' +import WhyArchitect from './elements/why-architect.mjs' + +export default { + 'arc-attribution': ArcAttribution, + 'arc-button-divider': ArcButtonDivider, + 'arc-container': ArcContainer, + 'arc-graphic': ArcGraphic, + 'arc-landing': ArcLanding, + 'arc-link-button': ArcLinkButton, + 'arc-logo': ArcLogo, + 'arc-terminal': ArcTerminal, + 'foot-er': Footer, + 'manifest-examples': ManifestExamples, + 'seamless-development': SeamlessDevelopment, + 'why-architect': WhyArchitect, +} diff --git a/src/landing/elements/arc-attribution.mjs b/src/landing/elements/arc-attribution.mjs new file mode 100644 index 00000000..62b79b13 --- /dev/null +++ b/src/landing/elements/arc-attribution.mjs @@ -0,0 +1,23 @@ +import arc from '@architect/functions' + +export default function ArcAttribution ({ html }) { + return html` + + +

+
+

Open governance

+ OpenJS Foundation +
+
+

Sponsored development

+ Begin +
+
+ + ` +} diff --git a/src/landing/elements/arc-button-divider.mjs b/src/landing/elements/arc-button-divider.mjs new file mode 100644 index 00000000..535eb44b --- /dev/null +++ b/src/landing/elements/arc-button-divider.mjs @@ -0,0 +1,19 @@ +export default function ArcButtonDivider ({ html }) { + return html` + +
+ + + +
+ ` +} diff --git a/src/landing/elements/arc-container.mjs b/src/landing/elements/arc-container.mjs new file mode 100644 index 00000000..ad70d764 --- /dev/null +++ b/src/landing/elements/arc-container.mjs @@ -0,0 +1,19 @@ +export default function ArcContainer ({ html }) { + return html` + + + ` +} diff --git a/src/landing/elements/arc-graphic.mjs b/src/landing/elements/arc-graphic.mjs new file mode 100644 index 00000000..fc11bd14 --- /dev/null +++ b/src/landing/elements/arc-graphic.mjs @@ -0,0 +1,598 @@ +export default function ArcGraphic ({ html }) { + return html` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ` +} diff --git a/src/landing/elements/arc-landing.mjs b/src/landing/elements/arc-landing.mjs new file mode 100644 index 00000000..bddc65c2 --- /dev/null +++ b/src/landing/elements/arc-landing.mjs @@ -0,0 +1,58 @@ +export default function ArcLanding ({ html }) { + return html` + + + +
+

+ + Architect +

+
+ +

+ Cloud infra for humans +

+ +

+ Architect gives you the power to configure, locally build, and globally deploy web apps to the cloud using concise, declarative statements. Built on rock solid AWS foundations, Architect makes advanced web development a breeze. +

+ +

+ + Get started + +

+ + +
+ + + + + + + ` +} diff --git a/src/landing/elements/arc-link-button.mjs b/src/landing/elements/arc-link-button.mjs new file mode 100644 index 00000000..37bab46a --- /dev/null +++ b/src/landing/elements/arc-link-button.mjs @@ -0,0 +1,28 @@ +export default function ArcLinkButton ({ html }) { + return html` + + + + + ` +} diff --git a/src/landing/elements/arc-logo.mjs b/src/landing/elements/arc-logo.mjs new file mode 100644 index 00000000..0ca23a22 --- /dev/null +++ b/src/landing/elements/arc-logo.mjs @@ -0,0 +1,5 @@ +export default function ArcLogo ({ html }) { + return html` + + ` +} diff --git a/src/landing/elements/arc-terminal.mjs b/src/landing/elements/arc-terminal.mjs new file mode 100644 index 00000000..cb6620f3 --- /dev/null +++ b/src/landing/elements/arc-terminal.mjs @@ -0,0 +1,48 @@ +export default function ArcTerminal ({ html }) { + return html` + +
+
+ + + + Node +
+ +
+

+ > +

+ + +
+
+ ` +} diff --git a/src/landing/elements/foot-er.mjs b/src/landing/elements/foot-er.mjs new file mode 100644 index 00000000..b2c262a8 --- /dev/null +++ b/src/landing/elements/foot-er.mjs @@ -0,0 +1,20 @@ +export default function Footer ({ html }) { + return html` + + +
+ +

+ Ditch the complexity and vendor cruft. Get started with Architect today. +

+ + + Read the quick start + +
+ ` +} diff --git a/src/landing/elements/manifest-examples.mjs b/src/landing/elements/manifest-examples.mjs new file mode 100644 index 00000000..c8ef7e84 --- /dev/null +++ b/src/landing/elements/manifest-examples.mjs @@ -0,0 +1,98 @@ +import { renderHelloWorld, renderArcCodes, renderKitchenSink } from '../support/render-examples.mjs' + +const { cloudFormation: helloWorldCf, arc: helloWorldArc } = await renderHelloWorld() +const { cloudFormation: arcCodesCf, arc: arcCodesArc } = await renderArcCodes() +const { cloudFormation: kitchenSinkCf, arc: kitchenSinkArc } = await renderKitchenSink() + +export default function CloudFormation ({ html }) { + return html` + + + +

+ IaC: NP! +

+ +

+ Infrastructure as Code (IaC) can be intimidating for even the most experienced developers. Architect’s manifest file — which can be written in multiple open text formats — codifies cloud infrastructure provisioning as a minimal build artefact, turning formerly complex work into approachable, maintainable code. +

+ +

+ See the difference for yourself by exploring the examples of Architect project manifests and the CloudFormation configurations they generate below. Or try the interactive Architect playground. +

+ + +
+ + + + + +
+ + + + + + + +
+ ` +} diff --git a/src/landing/elements/seamless-development.mjs b/src/landing/elements/seamless-development.mjs new file mode 100644 index 00000000..761b01d8 --- /dev/null +++ b/src/landing/elements/seamless-development.mjs @@ -0,0 +1,74 @@ +export default function SeamlessDevelopment ({ html }) { + return html` + + +

+ Seamless development, from local to cloud +

+ +
+

+ Scaffold a fresh Architect project with a single command. +

+ + + npm init @architect your-app +
+

⚬ Bootstrapping new Architect project

+

| Project name .. your-app

+

| Creating in ... /Users/LouisK/Developer/your-app

+

⚬ Installing Architect...

+

✓ Your Architect project is ready!

+
+
+
+ + + +
+

+ Get a local, production-like environment up and running instantly. +

+ + + npx arc sandbox +
+

   App ⌁ your-app

+

Region ⌁ us-west-2

+

http://localhost:3333

+

✓ Sandbox started in 12ms

+

❤︎ Local environment ready!

+
+
+
+ + + +
+

+ Deploy to identical staging and production environments in seconds. +

+ + + npx arc deploy +
+

   App ⌁ your-app

+

Region ⌁ us-west-2

+

⚬ Creating new private deployment bucket

+

✓ Generated CloudFormation deployment

+

✓ Deployed & built infrastructure

+

✓ Success! Deployed app in 58.984 seconds

+
+
+
+ + + Dive into the docs + +
+ ` +} diff --git a/src/landing/elements/why-architect.mjs b/src/landing/elements/why-architect.mjs new file mode 100644 index 00000000..53b5455a --- /dev/null +++ b/src/landing/elements/why-architect.mjs @@ -0,0 +1,32 @@ +export default function WhyArchitect ({ html }) { + return html` + +

Why Architect?

+ +

+ Architect provides everything you need to build massively scalable Functional Web Apps on AWS with low code, clear and terse config, and zero ceremony. +

+ +
+
+

The best developer experience

+

We prioritize speed with fast local dev, smart configurable defaults and flexible Infrastructure as Code. You can focus on business logic instead of glue code — and only pay for in-use services on-demand, while otherwise scaling to zero.

+
+ +
+

Intelligent, efficient iteration

+

Architect treats local development, staging, and production environments as first class concerns. Architect developers iterate fast with all of these environments and deployments only seconds away, leading to reduced latency in feedback cycles.

+
+ +
+

Infrastructure as code

+

Architect turns formerly complex cloud infrastructure provisioning into a build artifact, so infra and code are always aligned and deterministic. It then compiles manifest code into AWS CloudFormation and deploys it.

+
+
+ + + Learn more about Architect + +
+ ` +} diff --git a/src/landing/support/arc-codes.mjs b/src/landing/support/arc-codes.mjs new file mode 100644 index 00000000..c5aa8d11 --- /dev/null +++ b/src/landing/support/arc-codes.mjs @@ -0,0 +1,605 @@ +export const arc = `@app +arc-codes + +@aws +region us-west-2 +profile openjsf + +@static +fingerprint true + +@http +get /docs/:lang/* +get /api/package +any /* +get /landing +` + +export const cloudformation = { + 'AWSTemplateFormatVersion': '2010-09-09', + 'Transform': 'AWS::Serverless-2016-10-31', + 'Description': 'Example: arc.codes website', + 'Resources': { + 'Role': { + 'Type': 'AWS::IAM::Role', + 'Properties': { + 'AssumeRolePolicyDocument': { + 'Version': '2012-10-17', + 'Statement': [ + { + 'Effect': 'Allow', + 'Principal': { + 'Service': 'lambda.amazonaws.com' + }, + 'Action': 'sts:AssumeRole' + } + ] + }, + 'Policies': [ + { + 'PolicyName': 'ArcGlobalPolicy', + 'PolicyDocument': { + 'Statement': [ + { + 'Effect': 'Allow', + 'Action': [ + 'logs:CreateLogGroup', + 'logs:CreateLogStream', + 'logs:PutLogEvents', + 'logs:DescribeLogStreams' + ], + 'Resource': 'arn:aws:logs:*:*:*' + } + ] + } + }, + { + 'PolicyName': 'ArcStaticBucketPolicy', + 'PolicyDocument': { + 'Statement': [ + { + 'Effect': 'Allow', + 'Action': [ + 's3:GetObject', + 's3:PutObject', + 's3:PutObjectAcl', + 's3:DeleteObject', + 's3:ListBucket' + ], + 'Resource': [ + { + 'Fn::Sub': [ + 'arn:aws:s3:::${bukkit}', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + }, + { + 'Fn::Sub': [ + 'arn:aws:s3:::${bukkit}/*', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + } + ] + } + ] + } + } + ] + } + }, + 'StaticBucketParam': { + 'Type': 'AWS::SSM::Parameter', + 'Properties': { + 'Type': 'String', + 'Name': { + 'Fn::Sub': [ + '/${AWS::StackName}/static/${key}', + { + 'key': 'bucket' + } + ] + }, + 'Value': { + 'Ref': 'StaticBucket' + } + } + }, + 'StaticFingerprintParam': { + 'Type': 'AWS::SSM::Parameter', + 'Properties': { + 'Type': 'String', + 'Name': { + 'Fn::Sub': [ + '/${AWS::StackName}/static/${key}', + { + 'key': 'fingerprint' + } + ] + }, + 'Value': 'true' + } + }, + 'ParameterStorePolicy': { + 'Type': 'AWS::IAM::Policy', + 'DependsOn': 'Role', + 'Properties': { + 'PolicyName': 'ArcParameterStorePolicy', + 'PolicyDocument': { + 'Statement': [ + { + 'Effect': 'Allow', + 'Action': [ + 'ssm:GetParametersByPath', + 'ssm:GetParameter' + ], + 'Resource': { + 'Fn::Sub': [ + 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${AWS::StackName}', + {} + ] + } + }, + { + 'Effect': 'Allow', + 'Action': [ + 'ssm:GetParametersByPath', + 'ssm:GetParameter' + ], + 'Resource': { + 'Fn::Sub': [ + 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${AWS::StackName}/*', + {} + ] + } + }, + { + 'Effect': 'Allow', + 'Action': [ + 'ssm:GetParametersByPath', + 'ssm:GetParameter' + ], + 'Resource': { + 'Fn::Sub': [ + 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${AWS::StackName}/*/*', + {} + ] + } + } + ] + }, + 'Roles': [ + { + 'Ref': 'Role' + } + ] + } + }, + 'HTTP': { + 'Type': 'AWS::Serverless::HttpApi', + 'Properties': { + 'StageName': '$default', + 'DefinitionBody': { + 'openapi': '3.0.1', + 'info': { + 'title': { + 'Ref': 'AWS::StackName' + } + }, + 'paths': { + '/docs/{lang}/{proxy+}': { + 'get': { + 'x-amazon-apigateway-integration': { + 'payloadFormatVersion': '2.0', + 'type': 'aws_proxy', + 'httpMethod': 'POST', + 'uri': { + 'Fn::Sub': 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetDocsLangCatchallHTTPLambda.Arn}/invocations' + }, + 'connectionType': 'INTERNET' + } + } + }, + '/api/package': { + 'get': { + 'x-amazon-apigateway-integration': { + 'payloadFormatVersion': '2.0', + 'type': 'aws_proxy', + 'httpMethod': 'POST', + 'uri': { + 'Fn::Sub': 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetApiPackageHTTPLambda.Arn}/invocations' + }, + 'connectionType': 'INTERNET' + } + } + }, + '/landing': { + 'get': { + 'x-amazon-apigateway-integration': { + 'payloadFormatVersion': '2.0', + 'type': 'aws_proxy', + 'httpMethod': 'POST', + 'uri': { + 'Fn::Sub': 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetLandingHTTPLambda.Arn}/invocations' + }, + 'connectionType': 'INTERNET' + } + } + }, + '/{proxy+}': { + 'x-amazon-apigateway-any-method': { + 'x-amazon-apigateway-integration': { + 'payloadFormatVersion': '2.0', + 'type': 'aws_proxy', + 'httpMethod': 'POST', + 'uri': { + 'Fn::Sub': 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${AnyCatchallHTTPLambda.Arn}/invocations' + }, + 'connectionType': 'INTERNET' + } + } + }, + '/_static/{proxy+}': { + 'get': { + 'x-amazon-apigateway-integration': { + 'payloadFormatVersion': '1.0', + 'type': 'http_proxy', + 'httpMethod': 'GET', + 'uri': { + 'Fn::Sub': [ + 'https://${bukkit}.s3.${AWS::Region}.amazonaws.com/{proxy}', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + }, + 'connectionType': 'INTERNET', + 'timeoutInMillis': 30000 + } + } + } + } + } + } + }, + 'GetDocsLangCatchallHTTPLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/http/get-docs-000lang-catchall', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'arc-codes', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + } + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': { + 'GetDocsLangCatchallHTTPEvent': { + 'Type': 'HttpApi', + 'Properties': { + 'Path': '/docs/{lang}/{proxy+}', + 'Method': 'GET', + 'ApiId': { + 'Ref': 'HTTP' + } + } + } + } + }, + 'ArcMetadata': { + 'pragma': 'http', + 'name': 'get /docs/:lang/*', + 'method': 'get', + 'path': '/docs/:lang/*' + } + }, + 'GetApiPackageHTTPLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/http/get-api-package', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'arc-codes', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + } + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': { + 'GetApiPackageHTTPEvent': { + 'Type': 'HttpApi', + 'Properties': { + 'Path': '/api/package', + 'Method': 'GET', + 'ApiId': { + 'Ref': 'HTTP' + } + } + } + } + }, + 'ArcMetadata': { + 'pragma': 'http', + 'name': 'get /api/package', + 'method': 'get', + 'path': '/api/package' + } + }, + 'GetLandingHTTPLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/http/get-landing', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'arc-codes', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + } + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': { + 'GetLandingHTTPEvent': { + 'Type': 'HttpApi', + 'Properties': { + 'Path': '/landing', + 'Method': 'GET', + 'ApiId': { + 'Ref': 'HTTP' + } + } + } + } + }, + 'ArcMetadata': { + 'pragma': 'http', + 'name': 'get /landing', + 'method': 'get', + 'path': '/landing' + } + }, + 'AnyCatchallHTTPLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/http/any-catchall', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'arc-codes', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + }, + 'ARC_STATIC_SPA': false + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': { + 'AnyCatchallHTTPEvent': { + 'Type': 'HttpApi', + 'Properties': { + 'Path': '/{proxy+}', + 'Method': 'ANY', + 'ApiId': { + 'Ref': 'HTTP' + } + } + } + } + }, + 'ArcMetadata': { + 'pragma': 'http', + 'name': 'any /*', + 'method': 'any', + 'path': '/*' + } + }, + 'StaticBucket': { + 'Type': 'AWS::S3::Bucket', + 'Properties': { + 'OwnershipControls': { + 'Rules': [ + { + 'ObjectOwnership': 'BucketOwnerEnforced' + } + ] + }, + 'WebsiteConfiguration': { + 'IndexDocument': 'index.html', + 'ErrorDocument': '404.html' + }, + 'PublicAccessBlockConfiguration': { + 'BlockPublicAcls': false, + 'BlockPublicPolicy': false, + 'IgnorePublicAcls': false, + 'RestrictPublicBuckets': false + } + } + }, + 'StaticBucketPolicy': { + 'Type': 'AWS::S3::BucketPolicy', + 'Properties': { + 'Bucket': { + 'Ref': 'StaticBucket' + }, + 'PolicyDocument': { + 'Version': '2012-10-17', + 'Statement': [ + { + 'Action': [ + 's3:GetObject' + ], + 'Effect': 'Allow', + 'Principal': '*', + 'Resource': [ + { + 'Fn::Sub': [ + 'arn:aws:s3:::${bukkit}/*', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + } + ], + 'Sid': 'PublicReadGetObject' + } + ] + } + } + } + }, + 'Outputs': { + 'API': { + 'Description': 'API Gateway (HTTP)', + 'Value': { + 'Fn::Sub': [ + 'https://${ApiId}.execute-api.${AWS::Region}.amazonaws.com', + { + 'ApiId': { + 'Ref': 'HTTP' + } + } + ] + } + }, + 'ApiId': { + 'Description': 'API ID (ApiId)', + 'Value': { + 'Ref': 'HTTP' + } + }, + 'BucketURL': { + 'Description': 'Bucket URL', + 'Value': { + 'Fn::Sub': [ + 'http://${bukkit}.s3-website-${AWS::Region}.amazonaws.com', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + } + } + } +} diff --git a/src/landing/support/hello-world.mjs b/src/landing/support/hello-world.mjs new file mode 100644 index 00000000..f865b98a --- /dev/null +++ b/src/landing/support/hello-world.mjs @@ -0,0 +1,376 @@ +export const arc = `@app +myapp + +@http +get / +` + +export const cloudformation = { + 'AWSTemplateFormatVersion': '2010-09-09', + 'Transform': 'AWS::Serverless-2016-10-31', + 'Description': 'Example: hello world', + 'Resources': { + 'Role': { + 'Type': 'AWS::IAM::Role', + 'Properties': { + 'AssumeRolePolicyDocument': { + 'Version': '2012-10-17', + 'Statement': [ + { + 'Effect': 'Allow', + 'Principal': { + 'Service': 'lambda.amazonaws.com' + }, + 'Action': 'sts:AssumeRole' + } + ] + }, + 'Policies': [ + { + 'PolicyName': 'ArcGlobalPolicy', + 'PolicyDocument': { + 'Statement': [ + { + 'Effect': 'Allow', + 'Action': [ + 'logs:CreateLogGroup', + 'logs:CreateLogStream', + 'logs:PutLogEvents', + 'logs:DescribeLogStreams' + ], + 'Resource': 'arn:aws:logs:*:*:*' + } + ] + } + }, + { + 'PolicyName': 'ArcStaticBucketPolicy', + 'PolicyDocument': { + 'Statement': [ + { + 'Effect': 'Allow', + 'Action': [ + 's3:GetObject', + 's3:PutObject', + 's3:PutObjectAcl', + 's3:DeleteObject', + 's3:ListBucket' + ], + 'Resource': [ + { + 'Fn::Sub': [ + 'arn:aws:s3:::${bukkit}', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + }, + { + 'Fn::Sub': [ + 'arn:aws:s3:::${bukkit}/*', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + } + ] + } + ] + } + } + ] + } + }, + 'StaticBucketParam': { + 'Type': 'AWS::SSM::Parameter', + 'Properties': { + 'Type': 'String', + 'Name': { + 'Fn::Sub': [ + '/${AWS::StackName}/static/${key}', + { + 'key': 'bucket' + } + ] + }, + 'Value': { + 'Ref': 'StaticBucket' + } + } + }, + 'StaticFingerprintParam': { + 'Type': 'AWS::SSM::Parameter', + 'Properties': { + 'Type': 'String', + 'Name': { + 'Fn::Sub': [ + '/${AWS::StackName}/static/${key}', + { + 'key': 'fingerprint' + } + ] + }, + 'Value': 'false' + } + }, + 'ParameterStorePolicy': { + 'Type': 'AWS::IAM::Policy', + 'DependsOn': 'Role', + 'Properties': { + 'PolicyName': 'ArcParameterStorePolicy', + 'PolicyDocument': { + 'Statement': [ + { + 'Effect': 'Allow', + 'Action': [ + 'ssm:GetParametersByPath', + 'ssm:GetParameter' + ], + 'Resource': { + 'Fn::Sub': [ + 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${AWS::StackName}', + {} + ] + } + }, + { + 'Effect': 'Allow', + 'Action': [ + 'ssm:GetParametersByPath', + 'ssm:GetParameter' + ], + 'Resource': { + 'Fn::Sub': [ + 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${AWS::StackName}/*', + {} + ] + } + }, + { + 'Effect': 'Allow', + 'Action': [ + 'ssm:GetParametersByPath', + 'ssm:GetParameter' + ], + 'Resource': { + 'Fn::Sub': [ + 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${AWS::StackName}/*/*', + {} + ] + } + } + ] + }, + 'Roles': [ + { + 'Ref': 'Role' + } + ] + } + }, + 'HTTP': { + 'Type': 'AWS::Serverless::HttpApi', + 'Properties': { + 'StageName': '$default', + 'DefinitionBody': { + 'openapi': '3.0.1', + 'info': { + 'title': { + 'Ref': 'AWS::StackName' + } + }, + 'paths': { + '/': { + 'get': { + 'x-amazon-apigateway-integration': { + 'payloadFormatVersion': '2.0', + 'type': 'aws_proxy', + 'httpMethod': 'POST', + 'uri': { + 'Fn::Sub': 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetIndexHTTPLambda.Arn}/invocations' + }, + 'connectionType': 'INTERNET' + } + } + }, + '/_static/{proxy+}': { + 'get': { + 'x-amazon-apigateway-integration': { + 'payloadFormatVersion': '1.0', + 'type': 'http_proxy', + 'httpMethod': 'GET', + 'uri': { + 'Fn::Sub': [ + 'https://${bukkit}.s3.${AWS::Region}.amazonaws.com/{proxy}', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + }, + 'connectionType': 'INTERNET', + 'timeoutInMillis': 30000 + } + } + } + } + } + } + }, + 'GetIndexHTTPLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/http/get-index', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'myapp', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + }, + 'ARC_STATIC_SPA': false + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': { + 'GetIndexHTTPEvent': { + 'Type': 'HttpApi', + 'Properties': { + 'Path': '/', + 'Method': 'GET', + 'ApiId': { + 'Ref': 'HTTP' + } + } + } + } + }, + 'ArcMetadata': { + 'pragma': 'http', + 'name': 'get /', + 'method': 'get', + 'path': '/' + } + }, + 'StaticBucket': { + 'Type': 'AWS::S3::Bucket', + 'Properties': { + 'OwnershipControls': { + 'Rules': [ + { + 'ObjectOwnership': 'BucketOwnerEnforced' + } + ] + }, + 'WebsiteConfiguration': { + 'IndexDocument': 'index.html', + 'ErrorDocument': '404.html' + }, + 'PublicAccessBlockConfiguration': { + 'BlockPublicAcls': false, + 'BlockPublicPolicy': false, + 'IgnorePublicAcls': false, + 'RestrictPublicBuckets': false + } + } + }, + 'StaticBucketPolicy': { + 'Type': 'AWS::S3::BucketPolicy', + 'Properties': { + 'Bucket': { + 'Ref': 'StaticBucket' + }, + 'PolicyDocument': { + 'Version': '2012-10-17', + 'Statement': [ + { + 'Action': [ + 's3:GetObject' + ], + 'Effect': 'Allow', + 'Principal': '*', + 'Resource': [ + { + 'Fn::Sub': [ + 'arn:aws:s3:::${bukkit}/*', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + } + ], + 'Sid': 'PublicReadGetObject' + } + ] + } + } + } + }, + 'Outputs': { + 'API': { + 'Description': 'API Gateway (HTTP)', + 'Value': { + 'Fn::Sub': [ + 'https://${ApiId}.execute-api.${AWS::Region}.amazonaws.com', + { + 'ApiId': { + 'Ref': 'HTTP' + } + } + ] + } + }, + 'ApiId': { + 'Description': 'API ID (ApiId)', + 'Value': { + 'Ref': 'HTTP' + } + }, + 'BucketURL': { + 'Description': 'Bucket URL', + 'Value': { + 'Fn::Sub': [ + 'http://${bukkit}.s3-website-${AWS::Region}.amazonaws.com', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + } + } + } +} diff --git a/src/landing/support/kitchen-sink.mjs b/src/landing/support/kitchen-sink.mjs new file mode 100644 index 00000000..1a67c1cd --- /dev/null +++ b/src/landing/support/kitchen-sink.mjs @@ -0,0 +1,1421 @@ +export const arc = `@app +kitchen-sink + +@static +fingerprint true + +@http +get / +get /likes +post /likes + +@tables +likes + likeID *String + +@tables-streams +likes + +@tables-indexes +likes + date *String + +@ws +action +connect +default +disconnect + +@events +hit-counter + +@scheduled +daily-affirmation rate(1 day) +` + + +export const cloudformation = { + 'AWSTemplateFormatVersion': '2010-09-09', + 'Transform': 'AWS::Serverless-2016-10-31', + 'Description': 'Example: kitchen sink', + 'Resources': { + 'Role': { + 'Type': 'AWS::IAM::Role', + 'Properties': { + 'AssumeRolePolicyDocument': { + 'Version': '2012-10-17', + 'Statement': [ + { + 'Effect': 'Allow', + 'Principal': { + 'Service': 'lambda.amazonaws.com' + }, + 'Action': 'sts:AssumeRole' + } + ] + }, + 'Policies': [ + { + 'PolicyName': 'ArcGlobalPolicy', + 'PolicyDocument': { + 'Statement': [ + { + 'Effect': 'Allow', + 'Action': [ + 'logs:CreateLogGroup', + 'logs:CreateLogStream', + 'logs:PutLogEvents', + 'logs:DescribeLogStreams' + ], + 'Resource': 'arn:aws:logs:*:*:*' + } + ] + } + }, + { + 'PolicyName': 'ArcStaticBucketPolicy', + 'PolicyDocument': { + 'Statement': [ + { + 'Effect': 'Allow', + 'Action': [ + 's3:GetObject', + 's3:PutObject', + 's3:PutObjectAcl', + 's3:DeleteObject', + 's3:ListBucket' + ], + 'Resource': [ + { + 'Fn::Sub': [ + 'arn:aws:s3:::${bukkit}', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + }, + { + 'Fn::Sub': [ + 'arn:aws:s3:::${bukkit}/*', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + } + ] + } + ] + } + }, + { + 'PolicyName': 'ArcDynamoPolicy', + 'PolicyDocument': { + 'Statement': [ + { + 'Effect': 'Allow', + 'Action': 'dynamodb:*', + 'Resource': [ + { + 'Fn::Sub': [ + 'arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${tablename}', + { + 'tablename': { + 'Ref': 'LikesTable' + } + } + ] + }, + { + 'Fn::Sub': [ + 'arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${tablename}/*', + { + 'tablename': { + 'Ref': 'LikesTable' + } + } + ] + } + ] + }, + { + 'Effect': 'Deny', + 'Action': 'dynamodb:DeleteTable', + 'Resource': { + 'Fn::Sub': 'arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/*' + } + } + ] + } + }, + { + 'PolicyName': 'ArcSimpleNotificationServicePolicy', + 'PolicyDocument': { + 'Statement': [ + { + 'Effect': 'Allow', + 'Action': [ + 'sns:Publish' + ], + 'Resource': { + 'Fn::Sub': [ + 'arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${AWS::StackName}*', + {} + ] + } + } + ] + } + } + ] + } + }, + 'LikesParam': { + 'Type': 'AWS::SSM::Parameter', + 'Properties': { + 'Type': 'String', + 'Name': { + 'Fn::Sub': [ + '/${AWS::StackName}/tables/${tablename}', + { + 'tablename': 'likes' + } + ] + }, + 'Value': { + 'Ref': 'LikesTable' + } + } + }, + 'HitCounterEventTopicParam': { + 'Type': 'AWS::SSM::Parameter', + 'Properties': { + 'Type': 'String', + 'Name': { + 'Fn::Sub': [ + '/${AWS::StackName}/events/${event}', + { + 'event': 'hit-counter' + } + ] + }, + 'Value': { + 'Ref': 'HitCounterEventTopic' + } + } + }, + 'StaticBucketParam': { + 'Type': 'AWS::SSM::Parameter', + 'Properties': { + 'Type': 'String', + 'Name': { + 'Fn::Sub': [ + '/${AWS::StackName}/static/${key}', + { + 'key': 'bucket' + } + ] + }, + 'Value': { + 'Ref': 'StaticBucket' + } + } + }, + 'StaticFingerprintParam': { + 'Type': 'AWS::SSM::Parameter', + 'Properties': { + 'Type': 'String', + 'Name': { + 'Fn::Sub': [ + '/${AWS::StackName}/static/${key}', + { + 'key': 'fingerprint' + } + ] + }, + 'Value': 'true' + } + }, + 'ParameterStorePolicy': { + 'Type': 'AWS::IAM::Policy', + 'DependsOn': 'Role', + 'Properties': { + 'PolicyName': 'ArcParameterStorePolicy', + 'PolicyDocument': { + 'Statement': [ + { + 'Effect': 'Allow', + 'Action': [ + 'ssm:GetParametersByPath', + 'ssm:GetParameter' + ], + 'Resource': { + 'Fn::Sub': [ + 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${AWS::StackName}', + {} + ] + } + }, + { + 'Effect': 'Allow', + 'Action': [ + 'ssm:GetParametersByPath', + 'ssm:GetParameter' + ], + 'Resource': { + 'Fn::Sub': [ + 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${AWS::StackName}/*', + {} + ] + } + }, + { + 'Effect': 'Allow', + 'Action': [ + 'ssm:GetParametersByPath', + 'ssm:GetParameter' + ], + 'Resource': { + 'Fn::Sub': [ + 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${AWS::StackName}/*/*', + {} + ] + } + } + ] + }, + 'Roles': [ + { + 'Ref': 'Role' + } + ] + } + }, + 'HTTP': { + 'Type': 'AWS::Serverless::HttpApi', + 'Properties': { + 'StageName': '$default', + 'DefinitionBody': { + 'openapi': '3.0.1', + 'info': { + 'title': { + 'Ref': 'AWS::StackName' + } + }, + 'paths': { + '/likes': { + 'get': { + 'x-amazon-apigateway-integration': { + 'payloadFormatVersion': '2.0', + 'type': 'aws_proxy', + 'httpMethod': 'POST', + 'uri': { + 'Fn::Sub': 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetLikesHTTPLambda.Arn}/invocations' + }, + 'connectionType': 'INTERNET' + } + }, + 'post': { + 'x-amazon-apigateway-integration': { + 'payloadFormatVersion': '2.0', + 'type': 'aws_proxy', + 'httpMethod': 'POST', + 'uri': { + 'Fn::Sub': 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${PostLikesHTTPLambda.Arn}/invocations' + }, + 'connectionType': 'INTERNET' + } + } + }, + '/': { + 'get': { + 'x-amazon-apigateway-integration': { + 'payloadFormatVersion': '2.0', + 'type': 'aws_proxy', + 'httpMethod': 'POST', + 'uri': { + 'Fn::Sub': 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetIndexHTTPLambda.Arn}/invocations' + }, + 'connectionType': 'INTERNET' + } + } + }, + '/_static/{proxy+}': { + 'get': { + 'x-amazon-apigateway-integration': { + 'payloadFormatVersion': '1.0', + 'type': 'http_proxy', + 'httpMethod': 'GET', + 'uri': { + 'Fn::Sub': [ + 'https://${bukkit}.s3.${AWS::Region}.amazonaws.com/{proxy}', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + }, + 'connectionType': 'INTERNET', + 'timeoutInMillis': 30000 + } + } + } + } + } + } + }, + 'GetLikesHTTPLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/http/get-likes', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'hello', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + }, + 'ARC_WSS_URL': { + 'Fn::Sub': [ + 'wss://${WS}.execute-api.${AWS::Region}.amazonaws.com/staging', + {} + ] + } + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': { + 'GetLikesHTTPEvent': { + 'Type': 'HttpApi', + 'Properties': { + 'Path': '/likes', + 'Method': 'GET', + 'ApiId': { + 'Ref': 'HTTP' + } + } + } + } + }, + 'ArcMetadata': { + 'pragma': 'http', + 'name': 'get /likes', + 'method': 'get', + 'path': '/likes' + } + }, + 'GetIndexHTTPLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/http/get-index', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'hello', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + }, + 'ARC_WSS_URL': { + 'Fn::Sub': [ + 'wss://${WS}.execute-api.${AWS::Region}.amazonaws.com/staging', + {} + ] + }, + 'ARC_STATIC_SPA': false + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': { + 'GetIndexHTTPEvent': { + 'Type': 'HttpApi', + 'Properties': { + 'Path': '/', + 'Method': 'GET', + 'ApiId': { + 'Ref': 'HTTP' + } + } + } + } + }, + 'ArcMetadata': { + 'pragma': 'http', + 'name': 'get /', + 'method': 'get', + 'path': '/' + } + }, + 'PostLikesHTTPLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/http/post-likes', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'hello', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + }, + 'ARC_WSS_URL': { + 'Fn::Sub': [ + 'wss://${WS}.execute-api.${AWS::Region}.amazonaws.com/staging', + {} + ] + } + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': { + 'PostLikesHTTPEvent': { + 'Type': 'HttpApi', + 'Properties': { + 'Path': '/likes', + 'Method': 'POST', + 'ApiId': { + 'Ref': 'HTTP' + } + } + } + } + }, + 'ArcMetadata': { + 'pragma': 'http', + 'name': 'post /likes', + 'method': 'post', + 'path': '/likes' + } + }, + 'LikesTable': { + 'Type': 'AWS::DynamoDB::Table', + 'Properties': { + 'KeySchema': [ + { + 'AttributeName': 'likeID', + 'KeyType': 'HASH' + } + ], + 'AttributeDefinitions': [ + { + 'AttributeName': 'likeID', + 'AttributeType': 'S' + }, + { + 'AttributeName': 'date', + 'AttributeType': 'S' + } + ], + 'BillingMode': 'PAY_PER_REQUEST', + 'GlobalSecondaryIndexes': [ + { + 'IndexName': 'date-index', + 'KeySchema': [ + { + 'AttributeName': 'date', + 'KeyType': 'HASH' + } + ], + 'Projection': { + 'ProjectionType': 'ALL' + } + } + ], + 'StreamSpecification': { + 'StreamViewType': 'NEW_AND_OLD_IMAGES' + } + } + }, + 'HitCounterEventLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/events/hit-counter', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'hello', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + }, + 'ARC_WSS_URL': { + 'Fn::Sub': [ + 'wss://${WS}.execute-api.${AWS::Region}.amazonaws.com/staging', + {} + ] + } + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': { + 'HitCounterEvent': { + 'Type': 'SNS', + 'Properties': { + 'Topic': { + 'Ref': 'HitCounterEventTopic' + } + } + } + } + }, + 'ArcMetadata': { + 'pragma': 'events', + 'name': 'hit-counter' + } + }, + 'HitCounterEventTopic': { + 'Type': 'AWS::SNS::Topic', + 'Properties': { + 'DisplayName': 'HitCounter', + 'Subscription': [] + } + }, + 'DailyAffirmationScheduledLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/scheduled/daily-affirmation', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'hello', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + }, + 'ARC_WSS_URL': { + 'Fn::Sub': [ + 'wss://${WS}.execute-api.${AWS::Region}.amazonaws.com/staging', + {} + ] + } + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': {} + }, + 'ArcMetadata': { + 'pragma': 'scheduled', + 'name': 'daily-affirmation' + } + }, + 'DailyAffirmationScheduledEvent': { + 'Type': 'AWS::Events::Rule', + 'Properties': { + 'ScheduleExpression': 'rate(1 day)', + 'Targets': [ + { + 'Arn': { + 'Fn::GetAtt': [ + 'DailyAffirmationScheduledLambda', + 'Arn' + ] + }, + 'Id': 'DailyAffirmationScheduledLambda' + } + ] + } + }, + 'DailyAffirmationScheduledPermission': { + 'Type': 'AWS::Lambda::Permission', + 'Properties': { + 'Action': 'lambda:InvokeFunction', + 'FunctionName': { + 'Ref': 'DailyAffirmationScheduledLambda' + }, + 'Principal': 'events.amazonaws.com', + 'SourceArn': { + 'Fn::GetAtt': [ + 'DailyAffirmationScheduledEvent', + 'Arn' + ] + } + } + }, + 'StaticBucket': { + 'Type': 'AWS::S3::Bucket', + 'Properties': { + 'OwnershipControls': { + 'Rules': [ + { + 'ObjectOwnership': 'BucketOwnerEnforced' + } + ] + }, + 'WebsiteConfiguration': { + 'IndexDocument': 'index.html', + 'ErrorDocument': '404.html' + }, + 'PublicAccessBlockConfiguration': { + 'BlockPublicAcls': false, + 'BlockPublicPolicy': false, + 'IgnorePublicAcls': false, + 'RestrictPublicBuckets': false + } + } + }, + 'StaticBucketPolicy': { + 'Type': 'AWS::S3::BucketPolicy', + 'Properties': { + 'Bucket': { + 'Ref': 'StaticBucket' + }, + 'PolicyDocument': { + 'Version': '2012-10-17', + 'Statement': [ + { + 'Action': [ + 's3:GetObject' + ], + 'Effect': 'Allow', + 'Principal': '*', + 'Resource': [ + { + 'Fn::Sub': [ + 'arn:aws:s3:::${bukkit}/*', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + } + ], + 'Sid': 'PublicReadGetObject' + } + ] + } + } + }, + 'LikesTableStreamLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/tables-streams/likes', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'hello', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + }, + 'ARC_WSS_URL': { + 'Fn::Sub': [ + 'wss://${WS}.execute-api.${AWS::Region}.amazonaws.com/staging', + {} + ] + } + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': {} + }, + 'ArcMetadata': { + 'pragma': 'tables-streams', + 'name': 'likes' + } + }, + 'LikesTableStreamEvent': { + 'Type': 'AWS::Lambda::EventSourceMapping', + 'Properties': { + 'BatchSize': 10, + 'EventSourceArn': { + 'Fn::GetAtt': [ + 'LikesTable', + 'StreamArn' + ] + }, + 'FunctionName': { + 'Fn::GetAtt': [ + 'LikesTableStreamLambda', + 'Arn' + ] + }, + 'StartingPosition': 'TRIM_HORIZON' + } + }, + 'WS': { + 'Type': 'AWS::ApiGatewayV2::Api', + 'Properties': { + 'Name': 'HelloWebsocketStaging', + 'ProtocolType': 'WEBSOCKET', + 'RouteSelectionExpression': '$request.body.action' + } + }, + 'WebsocketDeployment': { + 'Type': 'AWS::ApiGatewayV2::Deployment', + 'DependsOn': [ + 'ConnectWSRoute', + 'DefaultWSRoute', + 'DisconnectWSRoute' + ], + 'Properties': { + 'ApiId': { + 'Ref': 'WS' + } + } + }, + 'WebsocketStage': { + 'Type': 'AWS::ApiGatewayV2::Stage', + 'Properties': { + 'StageName': 'staging', + 'DeploymentId': { + 'Ref': 'WebsocketDeployment' + }, + 'ApiId': { + 'Ref': 'WS' + } + } + }, + 'WebSocketPolicy': { + 'Type': 'AWS::IAM::Policy', + 'DependsOn': 'Role', + 'Properties': { + 'PolicyName': 'ArcWebSocketPolicy', + 'PolicyDocument': { + 'Statement': [ + { + 'Effect': 'Allow', + 'Action': [ + 'execute-api:Invoke', + 'execute-api:ManageConnections' + ], + 'Resource': [ + { + 'Fn::Sub': [ + 'arn:aws:execute-api:${AWS::Region}:*:${api}/*', + { + 'api': { + 'Ref': 'WS' + } + } + ] + } + ] + } + ] + }, + 'Roles': [ + { + 'Ref': 'Role' + } + ] + } + }, + 'ActionWSLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/ws/action', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'hello', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + }, + 'ARC_WSS_URL': { + 'Fn::Sub': [ + 'wss://${WS}.execute-api.${AWS::Region}.amazonaws.com/staging', + {} + ] + } + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': {} + }, + 'ArcMetadata': { + 'pragma': 'ws', + 'name': 'action' + } + }, + 'ActionWSRoute': { + 'Type': 'AWS::ApiGatewayV2::Route', + 'Properties': { + 'ApiId': { + 'Ref': 'WS' + }, + 'RouteKey': 'action', + 'OperationName': 'ActionWSRoute', + 'Target': { + 'Fn::Join': [ + '/', + [ + 'integrations', + { + 'Ref': 'ActionWSIntegration' + } + ] + ] + } + } + }, + 'ActionWSIntegration': { + 'Type': 'AWS::ApiGatewayV2::Integration', + 'Properties': { + 'ApiId': { + 'Ref': 'WS' + }, + 'IntegrationType': 'AWS_PROXY', + 'IntegrationUri': { + 'Fn::Sub': [ + 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ActionWSLambda.Arn}/invocations', + {} + ] + } + } + }, + 'ActionWSPermission': { + 'Type': 'AWS::Lambda::Permission', + 'DependsOn': [ + 'WS', + 'ActionWSLambda' + ], + 'Properties': { + 'Action': 'lambda:InvokeFunction', + 'FunctionName': { + 'Ref': 'ActionWSLambda' + }, + 'Principal': 'apigateway.amazonaws.com' + } + }, + 'ConnectWSLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/ws/connect', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'hello', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + }, + 'ARC_WSS_URL': { + 'Fn::Sub': [ + 'wss://${WS}.execute-api.${AWS::Region}.amazonaws.com/staging', + {} + ] + } + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': {} + }, + 'ArcMetadata': { + 'pragma': 'ws', + 'name': 'connect' + } + }, + 'ConnectWSRoute': { + 'Type': 'AWS::ApiGatewayV2::Route', + 'Properties': { + 'ApiId': { + 'Ref': 'WS' + }, + 'RouteKey': '$connect', + 'OperationName': 'ConnectWSRoute', + 'Target': { + 'Fn::Join': [ + '/', + [ + 'integrations', + { + 'Ref': 'ConnectWSIntegration' + } + ] + ] + } + } + }, + 'ConnectWSIntegration': { + 'Type': 'AWS::ApiGatewayV2::Integration', + 'Properties': { + 'ApiId': { + 'Ref': 'WS' + }, + 'IntegrationType': 'AWS_PROXY', + 'IntegrationUri': { + 'Fn::Sub': [ + 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ConnectWSLambda.Arn}/invocations', + {} + ] + } + } + }, + 'ConnectWSPermission': { + 'Type': 'AWS::Lambda::Permission', + 'DependsOn': [ + 'WS', + 'ConnectWSLambda' + ], + 'Properties': { + 'Action': 'lambda:InvokeFunction', + 'FunctionName': { + 'Ref': 'ConnectWSLambda' + }, + 'Principal': 'apigateway.amazonaws.com' + } + }, + 'DefaultWSLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/ws/default', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'hello', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + }, + 'ARC_WSS_URL': { + 'Fn::Sub': [ + 'wss://${WS}.execute-api.${AWS::Region}.amazonaws.com/staging', + {} + ] + } + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': {} + }, + 'ArcMetadata': { + 'pragma': 'ws', + 'name': 'default' + } + }, + 'DefaultWSRoute': { + 'Type': 'AWS::ApiGatewayV2::Route', + 'Properties': { + 'ApiId': { + 'Ref': 'WS' + }, + 'RouteKey': '$default', + 'OperationName': 'DefaultWSRoute', + 'Target': { + 'Fn::Join': [ + '/', + [ + 'integrations', + { + 'Ref': 'DefaultWSIntegration' + } + ] + ] + } + } + }, + 'DefaultWSIntegration': { + 'Type': 'AWS::ApiGatewayV2::Integration', + 'Properties': { + 'ApiId': { + 'Ref': 'WS' + }, + 'IntegrationType': 'AWS_PROXY', + 'IntegrationUri': { + 'Fn::Sub': [ + 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${DefaultWSLambda.Arn}/invocations', + {} + ] + } + } + }, + 'DefaultWSPermission': { + 'Type': 'AWS::Lambda::Permission', + 'DependsOn': [ + 'WS', + 'DefaultWSLambda' + ], + 'Properties': { + 'Action': 'lambda:InvokeFunction', + 'FunctionName': { + 'Ref': 'DefaultWSLambda' + }, + 'Principal': 'apigateway.amazonaws.com' + } + }, + 'DisconnectWSLambda': { + 'Type': 'AWS::Serverless::Function', + 'Properties': { + 'Handler': 'index.handler', + 'CodeUri': '/var/task/src/ws/disconnect', + 'Runtime': 'nodejs20.x', + 'Architectures': [ + 'arm64' + ], + 'MemorySize': 1152, + 'EphemeralStorage': { + 'Size': 512 + }, + 'Timeout': 5, + 'Environment': { + 'Variables': { + 'ARC_APP_NAME': 'hello', + 'ARC_ENV': 'staging', + 'ARC_ROLE': { + 'Ref': 'Role' + }, + 'ARC_SESSION_TABLE_NAME': 'jwe', + 'ARC_STACK_NAME': { + 'Ref': 'AWS::StackName' + }, + 'ARC_STATIC_BUCKET': { + 'Ref': 'StaticBucket' + }, + 'ARC_WSS_URL': { + 'Fn::Sub': [ + 'wss://${WS}.execute-api.${AWS::Region}.amazonaws.com/staging', + {} + ] + } + } + }, + 'Role': { + 'Fn::Sub': [ + 'arn:aws:iam::${AWS::AccountId}:role/${roleName}', + { + 'roleName': { + 'Ref': 'Role' + } + } + ] + }, + 'Events': {} + }, + 'ArcMetadata': { + 'pragma': 'ws', + 'name': 'disconnect' + } + }, + 'DisconnectWSRoute': { + 'Type': 'AWS::ApiGatewayV2::Route', + 'Properties': { + 'ApiId': { + 'Ref': 'WS' + }, + 'RouteKey': '$disconnect', + 'OperationName': 'DisconnectWSRoute', + 'Target': { + 'Fn::Join': [ + '/', + [ + 'integrations', + { + 'Ref': 'DisconnectWSIntegration' + } + ] + ] + } + } + }, + 'DisconnectWSIntegration': { + 'Type': 'AWS::ApiGatewayV2::Integration', + 'Properties': { + 'ApiId': { + 'Ref': 'WS' + }, + 'IntegrationType': 'AWS_PROXY', + 'IntegrationUri': { + 'Fn::Sub': [ + 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${DisconnectWSLambda.Arn}/invocations', + {} + ] + } + } + }, + 'DisconnectWSPermission': { + 'Type': 'AWS::Lambda::Permission', + 'DependsOn': [ + 'WS', + 'DisconnectWSLambda' + ], + 'Properties': { + 'Action': 'lambda:InvokeFunction', + 'FunctionName': { + 'Ref': 'DisconnectWSLambda' + }, + 'Principal': 'apigateway.amazonaws.com' + } + } + }, + 'Outputs': { + 'API': { + 'Description': 'API Gateway (HTTP)', + 'Value': { + 'Fn::Sub': [ + 'https://${ApiId}.execute-api.${AWS::Region}.amazonaws.com', + { + 'ApiId': { + 'Ref': 'HTTP' + } + } + ] + } + }, + 'ApiId': { + 'Description': 'API ID (ApiId)', + 'Value': { + 'Ref': 'HTTP' + } + }, + 'HitCounterEventTopic': { + 'Description': 'An SNS Topic', + 'Value': { + 'Ref': 'HitCounterEventTopic' + } + }, + 'BucketURL': { + 'Description': 'Bucket URL', + 'Value': { + 'Fn::Sub': [ + 'http://${bukkit}.s3-website-${AWS::Region}.amazonaws.com', + { + 'bukkit': { + 'Ref': 'StaticBucket' + } + } + ] + } + }, + 'WSS': { + 'Description': 'WebSocket Endpoint', + 'Value': { + 'Fn::Sub': [ + 'wss://${WS}.execute-api.${AWS::Region}.amazonaws.com/staging', + {} + ] + } + } + } +} diff --git a/src/landing/support/render-examples.mjs b/src/landing/support/render-examples.mjs new file mode 100644 index 00000000..1abc43b0 --- /dev/null +++ b/src/landing/support/render-examples.mjs @@ -0,0 +1,44 @@ +import { Arcdown } from 'arcdown' + +import { cloudformation as helloWorldCf, arc as helloWorldArc } from './hello-world.mjs' +import { cloudformation as arcCodesCf, arc as arcCodesArc } from './arc-codes.mjs' +import { cloudformation as kitchenSinkCf, arc as kitchenSinkArc } from './kitchen-sink.mjs' + +const hljs = { + classString: 'hljs text-1 p-2' +} + +const arcdown = new Arcdown({ hljs }) + +const helloWorldCfMd = '```json\n' + JSON.stringify(helloWorldCf, null, 2) + '\n```' +const helloWorldArcMd = '```arc\n' + helloWorldArc + '\n```' + +export async function renderHelloWorld () { + const cf = await arcdown.render(helloWorldCfMd) + const a = await arcdown.render(helloWorldArcMd) + const { html: cloudFormation } = cf + const { html: arc } = a + return { cloudFormation, arc } +} + +const arcCodesCfMd = '```json\n' + JSON.stringify(arcCodesCf, null, 2) + '\n```' +const arcCodesArcMd = '```arc\n' + arcCodesArc + '\n```' + +export async function renderArcCodes () { + const cf = await arcdown.render(arcCodesCfMd) + const a = await arcdown.render(arcCodesArcMd) + const { html: cloudFormation } = cf + const { html: arc } = a + return { cloudFormation, arc } +} + +const kitchenSinkCfMd = '```json\n' + JSON.stringify(kitchenSinkCf, null, 2) + '\n```' +const kitchenSinkArcMd = '```arc\n' + kitchenSinkArc + '\n```' + +export async function renderKitchenSink () { + const cf = await arcdown.render(kitchenSinkCfMd) + const a = await arcdown.render(kitchenSinkArcMd) + const { html: cloudFormation } = cf + const { html: arc } = a + return { cloudFormation, arc } +} diff --git a/theme.json b/theme.json new file mode 100644 index 00000000..4ac8c1d7 --- /dev/null +++ b/theme.json @@ -0,0 +1,37 @@ +{ + "typeScale": { + "steps": 9, + "viewportMin": 320, + "viewportMax": 1500, + "baseMin": 16, + "baseMax": 20, + "scaleMin": "minor-third", + "scaleMax": "perfect-fourth" + }, + "spaceScale": { + "steps": 12, + "viewportMin": 320, + "viewportMax": 1500, + "baseMin": 16, + "baseMax": 18, + "scaleMin": "minor-third", + "scaleMax": "perfect-fourth" + }, + "fonts": { + "sans": "Montserrat,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif" + }, + "theme": { + "blue": "#4075bf" + }, + "color": { + "arc-blue": "#365c91", + "body": "#45413a" + }, + "properties": {}, + "grid": { + "steps": 6 + }, + "queries": { + "lg": "48em" + } +}