diff --git a/.changeset/flat-feet-do.md b/.changeset/flat-feet-do.md new file mode 100644 index 0000000000..0495390273 --- /dev/null +++ b/.changeset/flat-feet-do.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Updated engines to support Node 20 or 22 diff --git a/.changeset/unlucky-countries-shop.md b/.changeset/unlucky-countries-shop.md new file mode 100644 index 0000000000..06c193068b --- /dev/null +++ b/.changeset/unlucky-countries-shop.md @@ -0,0 +1,12 @@ +--- +'@backstage/plugin-scaffolder-backend-module-rails': patch +'@backstage/plugin-kubernetes-cluster': patch +'@techdocs/cli': patch +'@backstage/cli-common': patch +'@backstage/create-app': patch +'@backstage/repo-tools': patch +'@backstage/codemods': patch +'@backstage/cli': patch +--- + +Bumped dev dependencies `@types/node` diff --git a/.github/workflows/api-breaking-changes.yml b/.github/workflows/api-breaking-changes.yml index 62195b155e..af4abcb888 100644 --- a/.github/workflows/api-breaking-changes.yml +++ b/.github/workflows/api-breaking-changes.yml @@ -29,13 +29,13 @@ jobs: - name: setup-node uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: - node-version: 18.x + node-version: 20.x registry-url: https://registry.npmjs.org/ - name: yarn install uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 with: - cache-prefix: linux-v18 + cache-prefix: linux-v20 - name: breaking changes check run: | diff --git a/.github/workflows/ci-noop.yml b/.github/workflows/ci-noop.yml index 321e4b57e7..af7199ede6 100644 --- a/.github/workflows/ci-noop.yml +++ b/.github/workflows/ci-noop.yml @@ -19,7 +19,7 @@ jobs: strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] name: Verify ${{ matrix.node-version }} steps: @@ -35,7 +35,7 @@ jobs: strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] name: Test ${{ matrix.node-version }} steps: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 824889528e..8a609d5558 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] env: CI: true @@ -55,7 +55,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] env: CI: true @@ -153,7 +153,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] name: Test ${{ matrix.node-version }} services: diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index a9524b5c98..a363366044 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [18.x] + node-version: [20.x] steps: - name: Harden Runner diff --git a/.github/workflows/deploy_microsite.yml b/.github/workflows/deploy_microsite.yml index 92c5f28498..99cf13756f 100644 --- a/.github/workflows/deploy_microsite.yml +++ b/.github/workflows/deploy_microsite.yml @@ -58,16 +58,16 @@ jobs: with: ref: refs/tags/${{ steps.find-release.outputs.result }} - - name: use node.js 18.x + - name: Use Node.js 20.x uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: - node-version: 18.x + node-version: 20.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 with: - cache-prefix: ${{ runner.os }}-v18.x + cache-prefix: ${{ runner.os }}-v20.x - name: build API reference run: yarn build:api-docs @@ -98,16 +98,16 @@ jobs: - name: checkout master uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - name: use node.js 18.x + - name: Use Node.js 20.x uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: - node-version: 18.x + node-version: 20.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 with: - cache-prefix: ${{ runner.os }}-v18.x + cache-prefix: ${{ runner.os }}-v20.x - name: build API reference run: yarn build:api-docs @@ -162,10 +162,10 @@ jobs: with: egress-policy: audit - - name: use node.js 18.x + - name: Use Node.js 20.x uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: - node-version: 18.x + node-version: 20.x registry-url: https://registry.npmjs.org/ # Needed for auth # Stable docs diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index 37b5b376e8..887aed687f 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] services: postgres16: @@ -143,7 +143,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [20.x] steps: - name: Harden Runner diff --git a/.github/workflows/sync_release-manifest.yml b/.github/workflows/sync_release-manifest.yml index 4b209739c7..87e03a529d 100644 --- a/.github/workflows/sync_release-manifest.yml +++ b/.github/workflows/sync_release-manifest.yml @@ -18,16 +18,16 @@ jobs: # 'v' prefix is added here for the tag, we keep it out of the manifest logic ref: v${{ github.event.client_payload.version }} - - name: use node.js 18.x + - name: Use Node.js 20.x uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: - node-version: 18.x + node-version: 20.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 with: - cache-prefix: ${{ runner.os }}-v18.x + cache-prefix: ${{ runner.os }}-v20.x - name: Build yarn plugin working-directory: packages/yarn-plugin diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml index 1390b4ec61..06e4d596ea 100644 --- a/.github/workflows/sync_snyk-github-issues.yml +++ b/.github/workflows/sync_snyk-github-issues.yml @@ -18,15 +18,15 @@ jobs: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - name: use node.js 18.x + - name: Use Node.js 20.x uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: - node-version: 18.x + node-version: 20.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 with: - cache-prefix: ${{ runner.os }}-v18.x + cache-prefix: ${{ runner.os }}-v20.x - name: Create Snyk report uses: snyk/actions/node@cdb760004ba9ea4d525f2e043745dfe85bb9077e # master diff --git a/.github/workflows/verify_accessibility.yml b/.github/workflows/verify_accessibility.yml index 29ff740f68..904d03ef8f 100644 --- a/.github/workflows/verify_accessibility.yml +++ b/.github/workflows/verify_accessibility.yml @@ -25,14 +25,14 @@ jobs: egress-policy: audit - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - name: Use Node.js 18.x + - name: Use Node.js 20.x uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: - node-version: 18.x + node-version: 20.x - name: yarn install uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15 with: - cache-prefix: ${{ runner.os }}-v18.x + cache-prefix: ${{ runner.os }}-v20.x - name: run Lighthouse CI run: | yarn dlx @lhci/cli@0.11.x autorun diff --git a/.github/workflows/verify_e2e-linux-noop.yml b/.github/workflows/verify_e2e-linux-noop.yml index f4f24f14f5..1afcd3fe17 100644 --- a/.github/workflows/verify_e2e-linux-noop.yml +++ b/.github/workflows/verify_e2e-linux-noop.yml @@ -24,7 +24,7 @@ jobs: strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] name: E2E Linux ${{ matrix.node-version }} steps: diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index 0c487429e9..1aeb7b0072 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -32,7 +32,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] env: CI: true diff --git a/.github/workflows/verify_e2e-techdocs.yml b/.github/workflows/verify_e2e-techdocs.yml index f6b300af7e..c9a6760d09 100644 --- a/.github/workflows/verify_e2e-techdocs.yml +++ b/.github/workflows/verify_e2e-techdocs.yml @@ -21,7 +21,7 @@ jobs: strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] env: CI: true diff --git a/.github/workflows/verify_e2e-windows-noop.yml b/.github/workflows/verify_e2e-windows-noop.yml index b3998522c9..3e415b82c6 100644 --- a/.github/workflows/verify_e2e-windows-noop.yml +++ b/.github/workflows/verify_e2e-windows-noop.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] name: E2E Windows ${{ matrix.node-version }} steps: diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml index b6bfef51e5..c9e5ccf26c 100644 --- a/.github/workflows/verify_e2e-windows.yml +++ b/.github/workflows/verify_e2e-windows.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] env: CI: true diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index 1d6aac21ca..ace6371271 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -30,10 +30,10 @@ jobs: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - name: use node.js 18.x + - name: Use Node.js 20.x uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: - node-version: 18.x + node-version: 20.x - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5 with: python-version: '3.9' diff --git a/.github/workflows/verify_microsite_accessibility.yml b/.github/workflows/verify_microsite_accessibility.yml index 6626f4def9..b1182382fa 100644 --- a/.github/workflows/verify_microsite_accessibility.yml +++ b/.github/workflows/verify_microsite_accessibility.yml @@ -21,10 +21,10 @@ jobs: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - name: Use Node.js 18.x + - name: Use Node.js 20.x uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: - node-version: 18.x + node-version: 20.x - name: top-level install run: yarn install --immutable diff --git a/.github/workflows/verify_storybook.yml b/.github/workflows/verify_storybook.yml index a3333b9bb1..f106dad441 100644 --- a/.github/workflows/verify_storybook.yml +++ b/.github/workflows/verify_storybook.yml @@ -23,7 +23,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - node-version: [18.x] + node-version: [20.x] name: Storybook steps: diff --git a/.github/workflows/verify_windows.yml b/.github/workflows/verify_windows.yml index d184bdca08..0e15a10b11 100644 --- a/.github/workflows/verify_windows.yml +++ b/.github/workflows/verify_windows.yml @@ -17,7 +17,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] env: CI: true diff --git a/package.json b/package.json index 2f4e5b7587..47e0ab89bb 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "@spotify/eslint-plugin": "^15.0.0", "@spotify/prettier-config": "^15.0.0", "@techdocs/cli": "workspace:*", - "@types/node": "^18.17.8", + "@types/node": "^20.16.0", "@types/webpack": "^5.28.0", "array-to-table": "^1.0.1", "command-exists": "^1.2.9", @@ -138,6 +138,6 @@ }, "packageManager": "yarn@3.8.1", "engines": { - "node": "18 || 20" + "node": "20 || 22" } } diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json index c316f15322..bb296e8655 100644 --- a/packages/cli-common/package.json +++ b/packages/cli-common/package.json @@ -36,6 +36,6 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@types/node": "^18.17.8" + "@types/node": "^20.16.0" } } diff --git a/packages/cli/package.json b/packages/cli/package.json index 014a7d97cd..ccfcf4962f 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -184,7 +184,7 @@ "@types/fs-extra": "^11.0.0", "@types/http-proxy": "^1.17.4", "@types/inquirer": "^8.1.3", - "@types/node": "^18.17.8", + "@types/node": "^20.16.0", "@types/npm-packlist": "^3.0.0", "@types/recursive-readdir": "^2.2.0", "@types/rollup-plugin-peer-deps-external": "^2.2.0", diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 95cdc2bc47..19bcd44553 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -52,6 +52,6 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/jscodeshift": "^0.12.0", - "@types/node": "^18.17.8" + "@types/node": "^20.16.0" } } diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 7a0a7da355..df61434ae1 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -59,7 +59,7 @@ "@types/command-exists": "^1.2.0", "@types/fs-extra": "^11.0.0", "@types/inquirer": "^8.1.3", - "@types/node": "^18.17.8", + "@types/node": "^20.16.0", "@types/recursive-readdir": "^2.2.0", "msw": "^1.0.0", "nodemon": "^3.0.1" diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 7a42fed3f8..73f97484f9 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "engines": { - "node": "18 || 20" + "node": "20 || 22" }, "scripts": { "dev": "yarn workspaces foreach -A --include backend --include app --parallel -v -i run start", diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index bf3cbdc4ea..ff18b51ae4 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -47,7 +47,7 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/fs-extra": "^11.0.0", - "@types/node": "^18.17.8", + "@types/node": "^20.16.0", "nodemon": "^3.0.1" } } diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 5ac90527de..f4c892a26d 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -82,7 +82,7 @@ "@backstage/cli": "workspace:^", "@backstage/types": "workspace:^", "@types/is-glob": "^4.0.2", - "@types/node": "^18.17.8", + "@types/node": "^20.16.0", "@types/prettier": "^2.0.0" }, "peerDependencies": { diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 9c5adb9f78..188d78bac5 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -62,7 +62,7 @@ "@types/commander": "^2.12.2", "@types/fs-extra": "^11.0.0", "@types/http-proxy": "^1.17.4", - "@types/node": "^18.17.8", + "@types/node": "^20.16.0", "@types/serve-handler": "^6.1.0", "@types/webpack-env": "^1.15.3", "find-process": "^1.4.5", diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 0f386cc63b..e23f4e2c53 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -64,7 +64,7 @@ "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/node": "^16.11.26", + "@types/node": "^20.16.0", "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 06f697a830..10394db01a 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -60,7 +60,7 @@ "@backstage/plugin-scaffolder-node-test-utils": "workspace:^", "@types/command-exists": "^1.2.0", "@types/fs-extra": "^11.0.0", - "@types/node": "^18.17.8", + "@types/node": "^20.16.0", "jest-when": "^3.1.0" } } diff --git a/yarn.lock b/yarn.lock index fcc8fc2542..fc14ca1bc1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3886,7 +3886,7 @@ __metadata: resolution: "@backstage/cli-common@workspace:packages/cli-common" dependencies: "@backstage/cli": "workspace:^" - "@types/node": ^18.17.8 + "@types/node": ^20.16.0 languageName: unknown linkType: soft @@ -3969,7 +3969,7 @@ __metadata: "@types/http-proxy": ^1.17.4 "@types/inquirer": ^8.1.3 "@types/jest": ^29.5.11 - "@types/node": ^18.17.8 + "@types/node": ^20.16.0 "@types/npm-packlist": ^3.0.0 "@types/recursive-readdir": ^2.2.0 "@types/rollup-plugin-peer-deps-external": ^2.2.0 @@ -4104,7 +4104,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/cli-common": "workspace:^" "@types/jscodeshift": ^0.12.0 - "@types/node": ^18.17.8 + "@types/node": ^20.16.0 chalk: ^4.0.0 commander: ^12.0.0 jscodeshift: ^0.16.0 @@ -4475,7 +4475,7 @@ __metadata: "@types/command-exists": ^1.2.0 "@types/fs-extra": ^11.0.0 "@types/inquirer": ^8.1.3 - "@types/node": ^18.17.8 + "@types/node": ^20.16.0 "@types/recursive-readdir": ^2.2.0 chalk: ^4.0.0 commander: ^12.0.0 @@ -6774,7 +6774,7 @@ __metadata: "@testing-library/dom": ^10.0.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^16.0.0 - "@types/node": ^16.11.26 + "@types/node": ^20.16.0 "@types/react": ^18.0.0 cronstrue: ^2.2.0 js-yaml: ^4.0.0 @@ -7538,7 +7538,7 @@ __metadata: "@backstage/types": "workspace:^" "@types/command-exists": ^1.2.0 "@types/fs-extra": ^11.0.0 - "@types/node": ^18.17.8 + "@types/node": ^20.16.0 command-exists: ^1.2.9 fs-extra: ^11.0.0 jest-when: ^3.1.0 @@ -8598,7 +8598,7 @@ __metadata: "@stoplight/spectral-runtime": ^1.1.2 "@stoplight/types": ^14.0.0 "@types/is-glob": ^4.0.2 - "@types/node": ^18.17.8 + "@types/node": ^20.16.0 "@types/prettier": ^2.0.0 "@useoptic/openapi-utilities": ^0.55.0 chalk: ^4.0.0 @@ -17404,7 +17404,7 @@ __metadata: "@types/commander": ^2.12.2 "@types/fs-extra": ^11.0.0 "@types/http-proxy": ^1.17.4 - "@types/node": ^18.17.8 + "@types/node": ^20.16.0 "@types/serve-handler": ^6.1.0 "@types/webpack-env": ^1.15.3 commander: ^12.0.0 @@ -18576,13 +18576,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^16.11.26": - version: 16.18.114 - resolution: "@types/node@npm:16.18.114" - checksum: 2922009367d1c9c1a42ec11b66fc315629589455c7c5c7be5212fcdfe5c01655881ef7d1b862fe6fdad006a6b34e4fce0565a74db0d6a38f869b5d87601f6339 - languageName: node - linkType: hard - "@types/node@npm:^17.0.36": version: 17.0.45 resolution: "@types/node@npm:17.0.45" @@ -18590,7 +18583,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^18.11.18, @types/node@npm:^18.11.9, @types/node@npm:^18.17.15, @types/node@npm:^18.17.8": +"@types/node@npm:^18.11.18, @types/node@npm:^18.11.9, @types/node@npm:^18.17.15": version: 18.19.57 resolution: "@types/node@npm:18.19.57" dependencies: @@ -18599,7 +18592,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.1.1, @types/node@npm:^20.11.16": +"@types/node@npm:^20.1.1, @types/node@npm:^20.11.16, @types/node@npm:^20.16.0": version: 20.16.13 resolution: "@types/node@npm:20.16.13" dependencies: @@ -25809,7 +25802,7 @@ __metadata: "@backstage/create-app": "workspace:^" "@backstage/errors": "workspace:^" "@types/fs-extra": ^11.0.0 - "@types/node": ^18.17.8 + "@types/node": ^20.16.0 chalk: ^4.0.0 commander: ^12.0.0 cross-fetch: ^4.0.0 @@ -40459,7 +40452,7 @@ __metadata: "@spotify/prettier-config": ^15.0.0 "@techdocs/cli": "workspace:*" "@types/global-agent": ^2.1.3 - "@types/node": ^18.17.8 + "@types/node": ^20.16.0 "@types/webpack": ^5.28.0 "@useoptic/optic": ^1.0.0 array-to-table: ^1.0.1