diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..8930105 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,44 @@ +--- +name: Bug report +about: Create a report to help us improve this project + +--- + + +**Describe the issue** +A clear and concise description of the bug + + +**Steps to reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error that says '....' + + +**Expected behavior** +A clear and concise description of what you expected to happen + + +**Screenshots** +If applicable, add screenshots to help explain your problem + + +**Desktop** +Please complete the following information (if appropriate): + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + + +**Mobile** +Please complete the following information (if appropriate): + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + + +**Additional context** +Add any other context or notes about the problem here diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..42a21cb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Software is never done! Suggest an idea to make this project even better + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. (Example: I find it frustrating when trying to _____ because _____...) + + +**Describe the solution you'd like** +A clear and concise description of what you'd like to happen. + + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. These are quite helpful! (Example: If it did _____ instead of _____, users would still have problems because _____...) + + +**Additional context or notes** +Add any other context or screenshots about the feature request here. diff --git a/.github/code_of_conduct.md b/.github/code_of_conduct.md new file mode 100644 index 0000000..e48f5c4 --- /dev/null +++ b/.github/code_of_conduct.md @@ -0,0 +1,21 @@ +# Architect Code of Conduct + +We are strongly committed to ensuring the Architect community, and the various online and offline spaces in which its members congregate and collaborate, are safe, positive, inclusive, constructive, and welcoming environments. + +As such, the Architect project adheres to the [OpenJS Foundation Code of Conduct](https://github.com/openjs-foundation/cross-project-council/blob/master/CODE_OF_CONDUCT.md), which itself adheres to the [Contributor Covenant](https://www.contributor-covenant.org). + +Lack of familiarity with this or the OpenJS Foundation Codes of Conduct, or the Contributor covenant, is not an excuse for non-adherence. + + +# Reporting +If you are the subject of any behavior prohibited by this Code of Conduct, or observe someone who is, please contact an Architect team member immediately. + +If you know an Architect team member, you may wish to contact them personally (and you should); but if not, please [contact us via email](mailto:conduct@arc.codes). + +If possible, please attempt to collect any relevant information and evidence, including links, screenshots, or other recordings of any incident. + +Reports will be handled with the utmost care, confidence, and sensitivity towards the individual(s) reporting. + + +# Enforcement +Should incidents arise, upon adjudication those found to be in violation of this Code of Conduct may be immediately expelled from the Architect community, including events, forums, chat workspaces, code repositories, and any other place where Architect community members collaborate. diff --git a/.github/contributing.md b/.github/contributing.md new file mode 100644 index 0000000..6024d63 --- /dev/null +++ b/.github/contributing.md @@ -0,0 +1,8 @@ +# Contributing + +## First: go read the [Architect Code of Conduct](/.github/code_of_conduct.md) + +### Agreement to the Architect Code of Conduct +By participating in and contributing to the Architect community — including, but not limited to its open source projects, any related online venues such as GitHub, Slack, and in-person events, etc. — you agree to the [Architect Code of Conduct](/.github/code_of_conduct.md). + +Lack of familiarity with this Code of Conduct is not an excuse for not adhering to it. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..f10341d --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,22 @@ +## Thank you for helping out! ✨ + +### We really appreciate your commitment to improving Architect + +To maintain a high standard of quality in our releases, before merging every pull request we ask that you've completed the following: + +- [ ] Forked the repo and created your branch from `master` +- [ ] Made sure tests pass (run `npm it` from the repo root) +- [ ] Expanded test coverage related to your changes: + - [ ] Added and/or updated unit tests (if appropriate) + - [ ] Added and/or updated integration tests (if appropriate) +- [ ] Updated relevant documentation: + - [ ] Internal to this repo (e.g. `readme.md`, help docs, inline docs & comments, etc.) + - [ ] [Architect docs (arc.codes)](https://github.com/architect/arc.codes) +- [ ] Summarized your changes in `changelog.md` +- [ ] Linked to any related issues, PRs, etc. below that may relate to, consume, or necessitate these changes + +Please also be sure to completed the CLA (if you haven't already). + +Learn more about [contributing to Architect here](https://arc.codes/intro/community). + +Thanks again! diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..21e02b5 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,108 @@ +name: Node CI + +# Push tests pushes; PR tests merges +on: [ push, pull_request ] + +defaults: + run: + shell: bash + +jobs: + + # Test the build + build: + # Setup + runs-on: ${{ matrix.os }} + strategy: + matrix: + node-version: [ 14.x ] + os: [ ubuntu-latest ] + + # Go + steps: + - name: Check out repo + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + + - name: Env + run: | + echo "Event name: ${{ github.event_name }}" + echo "Git ref: ${{ github.ref }}" + echo "GH actor: ${{ github.actor }}" + echo "SHA: ${{ github.sha }}" + VER=`node --version`; echo "Node ver: $VER" + VER=`npm --version`; echo "npm ver: $VER" + + - name: Install + run: npm install + + - name: Test + run: npm test + env: + CI: true + + - name: Notify + uses: sarisia/actions-status-discord@v1 + # Only fire alert once + if: github.ref == 'refs/heads/main' && failure() && matrix.node-version == '14.x' && matrix.os == 'ubuntu-latest' + with: + webhook: ${{ secrets.DISCORD_WEBHOOK }} + title: "build and test" + color: 0x222222 + username: GitHub Actions + + # ----- Only git tag testing + package publishing beyond this point ----- # + + # Publish to package registries + publish: + # Setup + needs: build + if: startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + + # Go + steps: + - name: Check out repo + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v1 + with: + node-version: 14 + registry-url: https://registry.npmjs.org/ + + - name: Install + run: npm i + + # Publish to npm + - name: Publish @RC to npm + if: contains(github.ref, 'RC') + run: npm publish --tag RC + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Publish @latest to npm + if: contains(github.ref, 'RC') == false #'!contains()'' doesn't work lol + run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + # Set up Node again, this time using GitHub as the publish target + - name: Set up Node.js + uses: actions/setup-node@v1 + with: + node-version: 14 + registry-url: https://npm.pkg.github.com/ + + - name: Notify + uses: sarisia/actions-status-discord@v1 + if: always() + with: + webhook: ${{ secrets.DISCORD_WEBHOOK }} + title: "npm publish" + color: 0x222222 + username: GitHub Actions diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..374cdea --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.git/ +.nyc_output/ +coverage/ +node_modules/ +package-lock.json +test/tmp +.DS_Store diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..d1b3077 --- /dev/null +++ b/.npmignore @@ -0,0 +1,4 @@ +.DS_Store +.git/ +.github/ +.eslintrc.* diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..175448e --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +package-lock=false +save-prefix=~ diff --git a/cjs/index.js b/cjs/index.js new file mode 100644 index 0000000..9e72176 --- /dev/null +++ b/cjs/index.js @@ -0,0 +1,87 @@ +// Canonical runtime list: https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html +// Array order matters, newest (or most preferable) must always be at the top +// Runtimes still being tested out can be added, just not at runtimes[runtime][0] +let runtimes = { + node: [ + 'nodejs14.x', + 'nodejs12.x', + 'nodejs10.x', + ], + python: [ + 'python3.9', + 'python3.8', + 'python3.7', + 'python3.6', + 'python2.7', + ], + ruby: [ + 'ruby2.7', + 'ruby2.5', + ], + java: [ + 'java11', + 'java8.al2', + 'java8', + ], + go: [ + 'go1.x', + ], + dotnet: [ + 'dotnetcore3.1', + 'dotnetcore2.1', + ], + custom: [ + 'provided.al2', + 'provided', + ], +} + +let runtimeList = Object.values(runtimes).reduce((a, b) => a.concat(b), []) + +let runtimesByArchitecture = { + arm64: [ + ...runtimes.node.slice(0, 2), + ...runtimes.python.slice(0, 2), + ...runtimes.ruby.slice(0, 1), + ...runtimes.java.slice(0, 2), + ...runtimes.dotnet.slice(0, 1), + ...runtimes.custom.slice(0, 1), + ], + x86_64: [ + ...runtimes.node, + ...runtimes.python, + ...runtimes.ruby, + ...runtimes.java, + ...runtimes.go, + ...runtimes.dotnet, + ...runtimes.custom, + ], +} + +let architecturesByRuntime = {} +Object.values(runtimes).forEach(r => { + r.forEach(runtime => { + architecturesByRuntime[runtime] = [] + if (runtimesByArchitecture.arm64.includes(runtime)) { + architecturesByRuntime[runtime].push('arm64') + } + if (runtimesByArchitecture.x86_64.includes(runtime)) { + architecturesByRuntime[runtime].push('x86_64') + } + }) +}) + +// Add aliases after the other stuff populated to prevent dupes +runtimes.nodejs = runtimes.node +runtimes['node.js'] = runtimes.node +runtimes.py = runtimes.python +runtimes.rb = runtimes.ruby +runtimes.golang = runtimes.go +runtimes['.net'] = runtimes.dotnet + +module.exports = { + runtimes, + runtimeList, + runtimesByArchitecture, + architecturesByRuntime, +} diff --git a/cjs/package.json b/cjs/package.json new file mode 100644 index 0000000..a3c15a7 --- /dev/null +++ b/cjs/package.json @@ -0,0 +1 @@ +{ "type": "commonjs" } diff --git a/esm/.eslintrc.cjs b/esm/.eslintrc.cjs new file mode 100644 index 0000000..1f56bb5 --- /dev/null +++ b/esm/.eslintrc.cjs @@ -0,0 +1,5 @@ +module.exports = { + parserOptions: { + sourceType: 'module' + } +} diff --git a/esm/index.js b/esm/index.js new file mode 100644 index 0000000..4cfcd14 --- /dev/null +++ b/esm/index.js @@ -0,0 +1,2 @@ +import lambdaRuntimes from '../cjs/index.js' +export default lambdaRuntimes diff --git a/package.json b/package.json new file mode 100644 index 0000000..27b09c2 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "lambda-runtimes", + "description": "Canonical list of AWS Lambda runtime identifiers and corresponding CPU architectures", + "version": "0.0.0", + "type": "module", + "module": "./esm/index.js", + "main": "./cjs/index.js", + "exports": { + "import": "./esm/index.js", + "default": "./cjs/index.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/architect/lambda-runtimes.git" + }, + "license": "Apache-2.0", + "scripts": { + "lint": "eslint . --fix", + "test": "npm run lint", + "rc": "npm version prerelease --preid RC" + }, + "devDependencies": { + "@architect/eslint-config": "^2.0.1", + "eslint": "^8.0.0" + }, + "eslintConfig": { + "extends": "@architect/eslint-config" + } +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..4a9d3ea --- /dev/null +++ b/readme.md @@ -0,0 +1,73 @@ +# AWS Lambda runtimes + +## A list of officially AWS Lambda runtimes organized by name + +### Installation + +`npm i lambda-runtimes` + + +### Usage + +```js +// esm +import { + runtimes, + runtimeList, + runtimesByArchitecture, + architecturesByRuntime, +} from 'lambda-runtimes' +``` + +```js +// cjs +let { + runtimes, + runtimeList, + runtimesByArchitecture, + architecturesByRuntime, +} = require('lambda-runtimes') +``` + +`lambda-runtimes` exports four items: +- **`runtimes`** (object) - Lambda runtime strings, organized by name + - Example: `runtimes.node[0]` → `nodejs14.x` + - Where appropriate, each runtime may include (lowcase normalized) aliases, e.g. `runtimes.node` === `runtimes.nodejs` === `runtimes.['node.js']` +- **`runtimeList`** (array) - list of all Lambda runtime strings (order not necessarily guaranteed) +- **`runtimesByArchitecture`** (object) - list of Lambda runtimes supported by each CPU architecture + - Example: `runtimesByArchitecture.arm64[0]` → `nodejs14.x`) +- **`architecturesByRuntime`** (object) - list of Lambda CPU architectures supported by each runtime + - Example: `architecturesByRuntime['nodejs14.x']` → `[ 'arm64', 'x86_64' ]`) + +Example: + +```js +{ + runtimes: { + node: [ 'nodejs14.x', 'nodejs12.x' ], + ... + }, + runtimeList: [ + 'nodejs14.x', + 'nodejs12.x', + ... + ], + runtimesByArchitecture: { + arm64: [ + 'nodejs14.x', + 'nodejs12.x', + ... + ], + x86_64: [ + 'nodejs14.x', + 'nodejs12.x', + ... + ] + }, + architecturesByRuntime: { + 'nodejs14.x': [ 'arm64', 'x86_64' ], + 'nodejs12.x': [ 'arm64', 'x86_64' ], + ... + } +} +```